adamc@352: con colMeta = fn t_formT :: (Type * Type) => adamc@352: {Nam : string, adamc@352: Show : t_formT.1 -> xbody, adamc@352: Widget : nm :: Name -> xml form [] [nm = t_formT.2], adamc@352: WidgetPopulated : nm :: Name -> t_formT.1 adamc@371: -> xml form [] [nm = t_formT.2], adamc@352: Parse : t_formT.2 -> t_formT.1, adamc@352: Inject : sql_injectable t_formT.1} adamc@346: con colsMeta = fn cols :: {(Type * Type)} => $(mapT2T colMeta cols) adamc@326: adamc@362: val int : string -> colMeta (int, string) adamc@362: val float : string -> colMeta (float, string) adamc@362: val string : string -> colMeta (string, string) adamc@362: val bool : string -> colMeta (bool, bool) adamc@362: adamc@325: functor Make(M : sig adamc@352: con cols :: {(Type * Type)} adamc@352: constraint [Id] ~ cols adamc@352: val tab : sql_table ([Id = int] ++ mapT2T fstTT cols) adamc@325: adamc@352: val title : string adamc@325: adamc@352: val cols : colsMeta cols adamc@352: end) : sig adamc@352: val main : unit -> transaction page adamc@325: end