summaryrefslogtreecommitdiff
path: root/demo/treeFun.ur
blob: 236f354cdffcf26b0553f5d1c6d1728f43d17bde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 {[eqNullable' (SQL 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