diff demo/more/dlist.ur @ 951:103ac1792c41

Make filter argument to render, not create
author Adam Chlipala <adamc@hcoop.net>
date Thu, 17 Sep 2009 14:27:00 -0400
parents da3ec6014d2f
children 07569af40069
line wrap: on
line diff
--- a/demo/more/dlist.ur	Thu Sep 17 13:44:08 2009 -0400
+++ b/demo/more/dlist.ur	Thu Sep 17 14:27:00 2009 -0400
@@ -6,19 +6,18 @@
          Empty
        | Nonempty of { Head : dlist'' t, Tail : source (source (dlist'' t)) }
 
-con dlist t = {Filter: t -> signal bool,
-               Elements : source (dlist' t)}
+con dlist t = source (dlist' t)
 
 type position = transaction unit
 
 fun headPos [t] (dl : dlist t) =
-    dl' <- get dl.Elements;
+    dl' <- get dl;
     case dl' of
         Nonempty { Head = Cons (_, tl), Tail = tl' } =>
         cur <- get tl;
-        set dl.Elements (case cur of
-                             Nil => Empty
-                           | _ => Nonempty {Head = cur, Tail = tl'})
+        set dl (case cur of
+                    Nil => Empty
+                  | _ => Nonempty {Head = cur, Tail = tl'})
       | _ => return ()
 
 fun tailPos [t] (cur : source (dlist'' t)) new tail =
@@ -29,20 +28,17 @@
         Nil => set tail cur
       | _ => return ()
 
-fun create [t] r =
-    s <- source Empty;
-    return {Filter = r.Filter,
-            Elements = s}
+val create [t] = source Empty
 
-fun clear [t] (s : dlist t) = set s.Elements Empty
+fun clear [t] (s : dlist t) = set s Empty
 
 fun append [t] dl v =
-    dl' <- get dl.Elements;
+    dl' <- get dl;
     case dl' of
         Empty =>
         tl <- source Nil;
         tl' <- source tl;
-        set dl.Elements (Nonempty {Head = Cons (v, tl), Tail = tl'});
+        set dl (Nonempty {Head = Cons (v, tl), Tail = tl'});
         return (headPos dl)
                 
       | Nonempty {Tail = tl, ...} =>
@@ -52,8 +48,8 @@
         set tl new;
         return (tailPos cur new tl)
 
-fun render [ctx] [ctx ~ body] [t] f dl = <xml>
-  <dyn signal={dl' <- signal dl.Elements;
+fun render [ctx] [ctx ~ body] [t] f {Filter = filter, ...} dl = <xml>
+  <dyn signal={dl' <- signal dl;
                return (case dl' of
                            Empty => <xml/>
                          | Nonempty {Head = hd, Tail = tlTop} => 
@@ -67,7 +63,7 @@
                                                          None => headPos dl
                                                        | Some prev => tailPos prev tl tlTop
                                        in
-                                           <xml><dyn signal={b <- dl.Filter v;
+                                           <xml><dyn signal={b <- filter v;
                                                              return (if b then
                                                                          f v pos
                                                                      else
@@ -91,7 +87,7 @@
         return (x :: tl)
 
 fun elements [t] (dl : dlist t) =
-    dl' <- signal dl.Elements;
+    dl' <- signal dl;
     case dl' of
         Empty => return []
       | Nonempty {Head = hd, ...} => elements' hd
@@ -107,7 +103,7 @@
                 foldl'' i' dl'
 
         fun foldl' (i : acc) (dl : dlist t) : signal acc =
-            dl <- signal dl.Elements;
+            dl <- signal dl;
             case dl of
                 Empty => return i
               | Nonempty {Head = dl, ...} => foldl'' i dl