adamc@421: con colMeta = fn t_formT :: (Type * Type) => adamc@421: {Nam : string, adamc@421: Show : t_formT.1 -> xbody, adamc@421: Widget : nm :: Name -> xml form [] [nm = t_formT.2], adamc@421: WidgetPopulated : nm :: Name -> t_formT.1 adamc@421: -> xml form [] [nm = t_formT.2], adamc@421: Parse : t_formT.2 -> t_formT.1, adamc@421: Inject : sql_injectable t_formT.1} adamc@622: con colsMeta = fn cols :: {(Type * Type)} => $(map colMeta cols) adamc@421: adamc@421: val int : string -> colMeta (int, string) adamc@421: val float : string -> colMeta (float, string) adamc@421: val string : string -> colMeta (string, string) adamc@421: val bool : string -> colMeta (bool, bool) adamc@421: adamc@421: functor Make(M : sig adamc@421: con cols :: {(Type * Type)} adamc@421: constraint [Id] ~ cols adamc@632: val fl : folder cols adamc@632: adamc@706: table tab : ([Id = int] ++ map fst cols) adamc@421: adamc@421: val title : string adamc@421: adamc@421: val cols : colsMeta cols adamc@421: end) : sig adamc@421: val main : unit -> transaction page adamc@421: end