# HG changeset patch # User Adam Chlipala # Date 1253024336 14400 # Node ID 37dd42935dadc4f5f51eda5ed2a05b0ea80248c7 # Parent 6966d98c80b5e8de91ef89a8e4def0b5b695cdf3 Summary row with aggregates diff -r 6966d98c80b5 -r 37dd42935dad demo/more/dbgrid.ur --- a/demo/more/dbgrid.ur Tue Sep 15 09:45:46 2009 -0400 +++ b/demo/more/dbgrid.ur Tue Sep 15 10:18:56 2009 -0400 @@ -251,6 +251,7 @@ con aggregates :: {Type} val aggregates : $(map (aggregateMeta (key ++ row)) aggregates) + val aggFolder : folder aggregates end) = struct open Grid.Make(struct fun keyOf r = r --- M.row @@ -297,5 +298,7 @@ val folder = M.colsFolder val aggregates = M.aggregates + + val aggFolder = M.aggFolder end) end diff -r 6966d98c80b5 -r 37dd42935dad demo/more/dbgrid.urs --- a/demo/more/dbgrid.urs Tue Sep 15 09:45:46 2009 -0400 +++ b/demo/more/dbgrid.urs Tue Sep 15 10:18:56 2009 -0400 @@ -103,6 +103,7 @@ con aggregates :: {Type} val aggregates : $(map (aggregateMeta (key ++ row)) aggregates) + val aggFolder : folder aggregates end) : sig type grid diff -r 6966d98c80b5 -r 37dd42935dad demo/more/dlist.ur --- a/demo/more/dlist.ur Tue Sep 15 09:45:46 2009 -0400 +++ b/demo/more/dlist.ur Tue Sep 15 10:18:56 2009 -0400 @@ -86,3 +86,22 @@ case dl' of Empty => return [] | Nonempty {Head = hd, ...} => elements' hd + +fun foldl [t] [acc] (f : t -> acc -> signal acc) = + let + fun foldl'' (i : acc) (dl : dlist'' t) : signal acc = + case dl of + Nil => return i + | Cons (v, dl') => + dl' <- signal dl'; + i' <- f v i; + foldl'' i' dl' + + fun foldl' (i : acc) (dl : dlist t) : signal acc = + dl <- signal dl; + case dl of + Empty => return i + | Nonempty {Head = dl, ...} => foldl'' i dl + in + foldl' + end diff -r 6966d98c80b5 -r 37dd42935dad demo/more/dlist.urs --- a/demo/more/dlist.urs Tue Sep 15 09:45:46 2009 -0400 +++ b/demo/more/dlist.urs Tue Sep 15 10:18:56 2009 -0400 @@ -6,6 +6,7 @@ val append : t ::: Type -> dlist t -> t -> transaction position val delete : position -> transaction unit val elements : t ::: Type -> dlist t -> signal (list t) +val foldl : t ::: Type -> acc ::: Type -> (t -> acc -> signal acc) -> acc -> dlist t -> signal acc val render : ctx ::: {Unit} -> [ctx ~ body] => t ::: Type -> (t -> position -> xml (ctx ++ body) [] []) diff -r 6966d98c80b5 -r 37dd42935dad demo/more/grid.ur --- a/demo/more/grid.ur Tue Sep 15 09:45:46 2009 -0400 +++ b/demo/more/grid.ur Tue Sep 15 10:18:56 2009 -0400 @@ -32,11 +32,13 @@ con aggregates :: {Type} val aggregates : $(map (aggregateMeta row) aggregates) + val aggFolder : folder aggregates end) = struct style tabl style tr style th style td + style agg fun make (row : M.row) [t] (m : colMeta' M.row t) : transaction t = m.Project row @@ -77,101 +79,118 @@ {foldRX2 [fst] [colMeta M.row] [_] - (fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest] - data (meta : colMeta M.row p) => - {[(meta.Handlers data).Header]}) - [_] M.folder grid.Cols M.cols} - + (fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] [[nm] ~ rest] + data (meta : colMeta M.row p) => + {[(meta.Handlers data).Header]}) + [_] M.folder grid.Cols M.cols} + - {Dlist.render (fn {Row = rowS, Cols = colsS, Updating = ud} pos => - let - val delete = - Dlist.delete pos; - row <- get rowS; - rpc (M.delete (M.keyOf row)) + {Dlist.render (fn {Row = rowS, Cols = colsS, Updating = ud} pos => + let + val delete = + Dlist.delete pos; + row <- get rowS; + rpc (M.delete (M.keyOf row)) - val update = set ud True + val update = set ud True - val cancel = - set ud False; - row <- get rowS; - cols <- makeAll grid.Cols row; - set colsS cols - - val save = - cols <- get colsS; - errors <- Monad.foldR3 [fst] [colMeta M.row] [snd] [fn _ => option string] - (fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] - [[nm] ~ rest] data meta v errors => - b <- current ((meta.Handlers data).Validate v); - return (if b then - errors - else - case errors of - None => Some ((meta.Handlers data).Header) - | Some s => Some ((meta.Handlers data).Header - ^ ", " ^ s))) - None [_] M.folder grid.Cols M.cols cols; + val cancel = + set ud False; + row <- get rowS; + cols <- makeAll grid.Cols row; + set colsS cols + + val save = + cols <- get colsS; + errors <- Monad.foldR3 [fst] [colMeta M.row] [snd] [fn _ => option string] + (fn [nm :: Name] [p :: (Type * Type)] [rest :: {(Type * Type)}] + [[nm] ~ rest] data meta v errors => + b <- current ((meta.Handlers data).Validate v); + return (if b then + errors + else + case errors of + None => Some ((meta.Handlers data).Header) + | Some s => Some ((meta.Handlers data).Header + ^ ", " ^ s))) + None [_] M.folder grid.Cols M.cols cols; - case errors of - Some s => alert ("Can't save because the following columns have invalid values:\n" - ^ s) - | None => - set ud False; - row <- get rowS; - row' <- Monad.foldR3 [fst] [colMeta M.row] [snd] [fn _ => M.row] + case errors of + Some s => alert ("Can't save because the following columns have invalid values:\n" + ^ s) + | None => + set ud False; + row <- get rowS; + row' <- Monad.foldR3 [fst] [colMeta M.row] [snd] [fn _ => M.row] + (fn [nm :: Name] [t :: (Type * Type)] + [rest :: {(Type * Type)}] + [[nm] ~ rest] data meta v row' => + (meta.Handlers data).Update row' v) + row [_] M.folder grid.Cols M.cols cols; + rpc (M.save (M.keyOf row) row'); + set rowS row'; + + cols <- makeAll grid.Cols row'; + set colsS cols + in + + +