implementation module htmlFormData import StdBool, StdInt, StdString import htmlDataDef, htmlSettings import StdMaybe import GenEq // utility for creating FormId's class (<@) infixl 4 att :: !(FormId d) !att -> FormId d instance <@ String where <@ formId a = {formId & id = a} instance <@ Lifespan where <@ formId a = {formId & lifespan = a} instance <@ Mode where <@ formId a = {formId & mode = a} instance <@ StorageFormat where <@ formId a = {formId & storage = a} mkFormId :: !String !d -> FormId d // Default FormId with given id and ival. mkFormId s d = {id = s, lifespan = Page, mode = Edit, storage = PlainString, ival = d} // editable, string format tFormId :: !String !d -> FormId d; tFormId s d = mkFormId s d <@ Temp nFormId :: !String !d -> FormId d; nFormId s d = mkFormId s d <@ Page sFormId :: !String !d -> FormId d; sFormId s d = mkFormId s d <@ Session pFormId :: !String !d -> FormId d; pFormId s d = mkFormId s d <@ TxtFile rFormId :: !String !d -> FormId d; rFormId s d = mkFormId s d <@ TxtFileRO dbFormId :: !String !d -> FormId d; dbFormId s d = mkFormId s d <@ Database tdFormId :: !String !d -> FormId d; tdFormId s d = tFormId s d <@ Display ndFormId :: !String !d -> FormId d; ndFormId s d = nFormId s d <@ Display sdFormId :: !String !d -> FormId d; sdFormId s d = sFormId s d <@ Display pdFormId :: !String !d -> FormId d; pdFormId s d = pFormId s d <@ Display rdFormId :: !String !d -> FormId d; rdFormId s d = rFormId s d <@ Display dbdFormId :: !String !d -> FormId d; dbdFormId s d = dbFormId s d <@ Display xtFormId :: !String !d -> FormId d; xtFormId s d = tFormId s d <@ NoForm xnFormId :: !String !d -> FormId d; xnFormId s d = nFormId s d <@ NoForm xsFormId :: !String !d -> FormId d; xsFormId s d = sFormId s d <@ NoForm xpFormId :: !String !d -> FormId d; xpFormId s d = pFormId s d <@ NoForm xrFormId :: !String !d -> FormId d; xrFormId s d = rFormId s d <@ NoForm xdbFormId :: !String !d -> FormId d; xdbFormId s d = dbFormId s d <@ NoForm nDFormId :: !String !d -> FormId d; nDFormId s d = nFormId s d <@ StaticDynamic sDFormId :: !String !d -> FormId d; sDFormId s d = sFormId s d <@ StaticDynamic pDFormId :: !String !d -> FormId d; pDFormId s d = pFormId s d <@ StaticDynamic rDFormId :: !String !d -> FormId d; rDFormId s d = rFormId s d <@ StaticDynamic dbDFormId :: !String !d -> FormId d; dbDFormId s d = dbFormId s d <@ StaticDynamic ndDFormId :: !String !d -> FormId d; ndDFormId s d = nDFormId s d <@ Display sdDFormId :: !String !d -> FormId d; sdDFormId s d = sDFormId s d <@ Display pdDFormId :: !String !d -> FormId d; pdDFormId s d = pDFormId s d <@ Display rdDFormId :: !String !d -> FormId d; rdDFormId s d = rDFormId s d <@ Display dbdDFormId :: !String !d -> FormId d; dbdDFormId s d = dbDFormId s d <@ Display // create id's (++/) infixr 5 (++/) s1 s2 = s1 +++ iDataIdSeparator +++ s2 extidFormId :: !(FormId d) !String -> FormId d extidFormId formid s = formid <@ formid.id ++/ s subFormId :: !(FormId a) !String !d -> FormId d // make new formid of new type copying other old settinf subFormId formid s d = reuseFormId (extidFormId formid s) d subnFormId :: !(FormId a) !String !d -> FormId d // make new formid of new type copying other old settinf subnFormId formid s d = subFormId formid s d <@ Page subsFormId :: !(FormId a) !String !d -> FormId d // make new formid of new type copying other old settinf subsFormId formid s d = subFormId formid s d <@ Session subpFormId :: !(FormId a) !String !d -> FormId d // make new formid of new type copying other old settinf subpFormId formid s d = subFormId formid s d <@ TxtFile subtFormId :: !(FormId a) !String !d -> FormId d // make new formid of new type copying other old settinf subtFormId formid s d = subFormId formid s d <@ Temp setFormId :: !(FormId d) !d -> FormId d // set new initial value in formid setFormId formid d = reuseFormId formid d reuseFormId :: !(FormId d) !v -> FormId v reuseFormId formid v = {formid & ival = v} initID :: !(FormId d) -> InIDataId d // (Init,FormId a) initID formid = (Init,formid) setID :: !(FormId d) !d -> InIDataId d // (Set,FormId a) setID formid na = (Set,setFormId formid na) onMode :: !Mode a a a a -> a onMode Edit e1 e2 e3 e4 = e1 onMode Submit e1 e2 e3 e4 = e2 onMode Display e1 e2 e3 e4 = e3 onMode NoForm e1 e2 e3 e4 = e4 toViewId :: !Init !d !(Maybe d) -> d toViewId Init d Nothing = d toViewId Init d (Just v)= v toViewId _ d _ = d toViewMap :: !(d -> v) !Init !d !(Maybe v) -> v toViewMap f init d mv = toViewId init (f d) mv derive gEq Mode, Init, Lifespan instance == Mode where == m1 m2 = m1 === m2 instance == Init where == i1 i2 = i1 === i2 instance == Lifespan where == l1 l2 = l1 === l2 instance < Lifespan where (<) l1 l2 = toInt l1 < toInt l2 instance toBool Init where toBool Set = True toBool _ = False instance toInt Lifespan where toInt Temp = 0 toInt Page = 1 toInt Session = 2 toInt TxtFileRO = 3 toInt TxtFile = 4 toInt Database = 5 instance toString Lifespan where toString Temp = "Temp" toString Page = "Page" toString Session = "Session" toString TxtFileRO = "TxtFileRO" toString TxtFile = "TxtFile" toString Database = "Database"