con meta = fn (db :: Type, widget :: Type) => {Nam : string, Show : db -> xbody, Widget : nm :: Name -> xml form [] [nm = widget], WidgetPopulated : nm :: Name -> db -> xml form [] [nm = widget], Parse : widget -> db, Inject : sql_injectable db} fun default [t] (sh : show t) (rd : read t) (inj : sql_injectable t) name : meta (t, string) = {Nam = name, Show = txt, Widget = fn [nm :: Name] => , WidgetPopulated = fn [nm :: Name] n => , Parse = readError, Inject = _} val int = default val float = default val string = default fun bool name = {Nam = name, Show = txt, Widget = fn [nm :: Name] => , WidgetPopulated = fn [nm :: Name] b => , Parse = fn x => x, Inject = _} fun textarea name = {Nam = name, Show = cdata, Widget = fn [nm :: Name] =>
, WidgetPopulated = fn [nm :: Name] s =>
{[s]}
, Parse = fn s => s, Inject = _} fun allWidgets [ts ::: {(Type * Type)}] (r : $(map meta ts)) (fl : folder ts) = foldR [meta] [fn ts :: {(Type * Type)} => xml form [] (map snd ts)] (fn [nm :: Name] [t :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest] (col : meta t) (acc : xml form [] (map snd rest)) => {[col.Nam]}: {col.Widget [nm]}
{useMore acc}
) [_] fl r