adamc@915: con colMeta' = fn (row :: Type) (t :: Type) => adamc@915: {Header : string, adamc@915: Project : row -> transaction t, adamc@915: Update : row -> t -> transaction row, adamc@915: Display : t -> xbody, adamc@915: Edit : t -> xbody, adamc@915: Validate : t -> signal bool} adamc@915: adamc@915: con colMeta = fn (row :: Type) (global_t :: (Type * Type)) => adamc@915: {Initialize : transaction global_t.1, adamc@915: Handlers : global_t.1 -> colMeta' row global_t.2} adamc@915: adamc@915: functor Make(M : sig adamc@915: type row adamc@915: val list : transaction (list row) adamc@915: val new : transaction row adamc@915: val save : {Old : row, New : row} -> transaction unit adamc@915: val delete : row -> transaction unit adamc@915: adamc@915: con cols :: {(Type * Type)} adamc@915: val cols : $(map (colMeta row) cols) adamc@915: adamc@915: val folder : folder cols adamc@915: end) : sig adamc@915: type grid adamc@915: adamc@915: val grid : transaction grid adamc@915: val sync : grid -> transaction unit adamc@915: val render : grid -> xbody adamc@915: adamc@915: style tabl adamc@915: style tr adamc@915: style th adamc@915: style td adamc@915: end