diff demo/treeFun.ur @ 469:b393c2fc80f8

About to begin optimization of recursive transaction functions
author Adam Chlipala <adamc@hcoop.net>
date Thu, 06 Nov 2008 17:09:53 -0500
parents
children 7cb418e9714f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/demo/treeFun.ur	Thu Nov 06 17:09:53 2008 -0500
@@ -0,0 +1,35 @@
+functor Make(M : sig
+                 type key
+                 con id :: Name
+                 con parent :: Name
+                 con cols :: {Type}
+                 constraint [id] ~ [parent]
+                 constraint [id, parent] ~ cols
+
+                 val key_inj : sql_injectable key
+                 val option_key_inj : sql_injectable (option key)
+
+                 table tab : [id = key, parent = option key] ++ cols
+             end) = struct
+
+    open M
+
+    fun tree (f : $([id = key, parent = option key] ++ cols) -> xbody)
+             (root : option M.key) =
+        let
+            fun recurse (root : option key) =
+                queryX' (SELECT * FROM tab WHERE tab.{parent} = {root})
+                        (fn r =>
+                            children <- recurse (Some r.Tab.id);
+                            return <xml>
+                              <li> {f r.Tab}</li>
+                              
+                              <ul>
+                                {children}
+                              </ul>
+                            </xml>)
+        in
+            recurse root
+        end
+
+end