# HG changeset patch # User Adam Chlipala # Date 1253382252 14400 # Node ID 7e7edfb6fe8248a406eb13cb9480bfa787a971ea # Parent 8c37699de27328b11babfae8c6d3fadcaacf3597 Testing Dlist StartPosition with constant offset diff -r 8c37699de273 -r 7e7edfb6fe82 demo/more/dlist.ur --- a/demo/more/dlist.ur Sat Sep 19 13:32:33 2009 -0400 +++ b/demo/more/dlist.ur Sat Sep 19 13:44:12 2009 -0400 @@ -66,32 +66,46 @@ set dl (Nonempty {Head = Cons (x, hd), Tail = tlS}) end -fun renderDyn [ctx] [ctx ~ body] [t] (f : t -> position -> xml (ctx ++ body) [] []) filter dl = +fun renderDyn [ctx] [ctx ~ body] [t] (f : t -> position -> xml (ctx ++ body) [] []) filter pos dl = - | Nonempty {Head = hd, Tail = tlTop} => - let - fun render' prev dl'' = - case dl'' of - Nil => - | Cons (v, tl) => - let - val pos = case prev of - None => headPos dl - | Some prev => tailPos prev tl tlTop - in - )}/> - - end - in - render' None hd - end)}/> + case dl' of + Empty => return + | Nonempty {Head = hd, Tail = tlTop} => + let + fun render' prev dl'' = + case dl'' of + Nil => + | Cons (v, tl) => + let + val pos = case prev of + None => headPos dl + | Some prev => tailPos prev tl tlTop + in + )}/> + + end + + fun skip pos hd = + case pos of + 0 => return hd + | _ => + case hd of + Nil => return hd + | Cons (_, tl) => + tl' <- signal tl; + skip (pos-1) tl' + in + case pos of + None => return (render' None hd) + | Some pos => + hd <- skip pos hd; + return (render' None hd) + end}/> fun renderFlat [ctx] [ctx ~ body] [t] (f : t -> position -> xml (ctx ++ body) [] []) filter ls = @@ -143,10 +157,12 @@ end fun render [ctx] [ctx ~ body] [t] f (r : {Filter : t -> signal bool, - Sort : signal (option (t -> t -> signal bool))}) dl = + Sort : signal (option (t -> t -> signal bool)), + StartPosition : signal (option int)}) dl = return (renderDyn f r.Filter dl) + None => return (renderDyn f r.Filter pos dl) | Some cmp => dl' <- signal dl; elems <- (case dl' of @@ -173,10 +189,21 @@ listOut None hd [] end); elems <- sort (fn v1 v2 => cmp v1.1 v2.1) elems; - return (renderFlat f r.Filter elems)}/> + let + fun skip n ls = + case (n, ls) of + (0, _) => ls + | (n, _ :: ls) => skip (n-1) ls + | (_, []) => [] + + val elems = + case pos of + None => elems + | Some pos => skip pos elems + in + return (renderFlat f r.Filter elems) + end}/> - - fun delete pos = pos diff -r 8c37699de273 -r 7e7edfb6fe82 demo/more/dlist.urs --- a/demo/more/dlist.urs Sat Sep 19 13:32:33 2009 -0400 +++ b/demo/more/dlist.urs Sat Sep 19 13:44:12 2009 -0400 @@ -12,7 +12,8 @@ val render : ctx ::: {Unit} -> [ctx ~ body] => t ::: Type -> (t -> position -> xml (ctx ++ body) [] []) - -> {Filter : t -> signal bool, + -> {StartPosition : signal (option int), + Filter : t -> signal bool, Sort : signal (option (t -> t -> signal bool)) (* <= *)} -> dlist t -> xml (ctx ++ body) [] [] diff -r 8c37699de273 -r 7e7edfb6fe82 demo/more/grid.ur --- a/demo/more/grid.ur Sat Sep 19 13:32:33 2009 -0400 +++ b/demo/more/grid.ur Sat Sep 19 13:44:12 2009 -0400 @@ -216,7 +216,8 @@ [_] M.folder grid.Cols M.cols cols)}/> end) - {Filter = fn all => + {StartPosition = return (Some 1), + Filter = fn all => row <- signal all.Row; foldR3 [colMeta M.row] [fst3] [thd3] [fn _ => M.row -> signal bool] (fn [nm :: Name] [p :: (Type * Type * Type)]