adamc@650: con colMeta = fn t_state :: (Type * Type) => adamc@650: {Nam : string, adamc@650: Show : t_state.1 -> xbody, adamc@650: Inject : sql_injectable t_state.1, adamc@650: adamc@650: NewState : transaction t_state.2, adamc@650: Widget : t_state.2 -> xbody, adamc@650: ReadState : t_state.2 -> transaction t_state.1} adamc@650: con colsMeta = fn cols :: {(Type * Type)} => $(map colMeta cols) adamc@650: adamc@650: val int : string -> colMeta (int, source string) adamc@650: val float : string -> colMeta (float, source string) adamc@650: val string : string -> colMeta (string, source string) adamc@650: adamc@650: functor Make(M : sig adamc@650: con cols :: {(Type * Type)} adamc@650: constraint [Id] ~ cols adamc@650: val fl : folder cols adamc@650: adamc@650: val tab : sql_table ([Id = int] ++ map fst cols) adamc@650: adamc@650: val title : string adamc@650: adamc@650: val cols : colsMeta cols adamc@650: end) : sig adamc@650: val main : unit -> transaction page adamc@650: end