changeset 336:34847732cefc

Crud gets column headings
author Adam Chlipala <adamc@hcoop.net>
date Sat, 13 Sep 2008 20:04:28 -0400
parents bc5015b89dd2
children 18d5affa790d
files lib/top.ur lib/top.urs tests/crud.ur tests/crud.urs tests/crud1.ur
diffstat 5 files changed, 47 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lib/top.ur	Sat Sep 13 19:53:07 2008 -0400
+++ b/lib/top.ur	Sat Sep 13 20:04:28 2008 -0400
@@ -8,6 +8,16 @@
 
 fun txt (t ::: Type) (ctx ::: {Unit}) (use ::: {Type}) (sh : show t) (v : t) = cdata (show sh v)
 
+fun foldTR (tf :: Type -> Type) (tr :: {Type} -> Type)
+        (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
+                -> tf t -> tr rest -> tr ([nm = t] ++ rest))
+        (i : tr []) =
+        fold [fn r :: {Type} => $(mapTT tf r) -> tr r]
+                (fn (nm :: Name) (t :: Type) (rest :: {Type}) (acc : _ -> tr rest) =>
+                        [[nm] ~ rest] =>
+                        fn r => f [nm] [t] [rest] r.nm (acc (r -- nm)))
+                (fn _ => i)
+
 fun foldTR2 (tf1 :: Type -> Type) (tf2 :: Type -> Type) (tr :: {Type} -> Type)
         (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
                 -> tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest))
@@ -18,6 +28,15 @@
                         fn r1 r2 => f [nm] [t] [rest] r1.nm r2.nm (acc (r1 -- nm) (r2 -- nm)))
                 (fn _ _ => i)
 
+fun foldTRX (tf :: Type -> Type) (ctx :: {Unit})
+        (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
+                -> tf t -> xml ctx [] []) =
+        foldTR [tf] [fn _ => xml ctx [] []]
+                (fn (nm :: Name) (t :: Type) (rest :: {Type}) =>
+                        [[nm] ~ rest] =>
+                        fn r acc => <xml>{f [nm] [t] [rest] r}{acc}</xml>)
+                <xml></xml>
+
 fun foldTRX2 (tf1 :: Type -> Type) (tf2 :: Type -> Type) (ctx :: {Unit})
         (f : nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
                 -> tf1 t -> tf2 t -> xml ctx [] []) =
--- a/lib/top.urs	Sat Sep 13 19:53:07 2008 -0400
+++ b/lib/top.urs	Sat Sep 13 20:04:28 2008 -0400
@@ -10,11 +10,21 @@
 val txt : t ::: Type -> ctx ::: {Unit} -> use ::: {Type} -> show t -> t
         -> xml ctx use []
 
+val foldTR : tf :: (Type -> Type) -> tr :: ({Type} -> Type)
+        -> (nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
+                -> tf t -> tr rest -> tr ([nm = t] ++ rest))
+        -> tr [] -> r :: {Type} -> $(mapTT tf r) -> tr r
+
 val foldTR2 : tf1 :: (Type -> Type) -> tf2 :: (Type -> Type) -> tr :: ({Type} -> Type)
         -> (nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
                 -> tf1 t -> tf2 t -> tr rest -> tr ([nm = t] ++ rest))
         -> tr [] -> r :: {Type} -> $(mapTT tf1 r) -> $(mapTT tf2 r) -> tr r
 
+val foldTRX : tf :: (Type -> Type) -> ctx :: {Unit}
+        -> (nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
+                -> tf t -> xml ctx [] [])
+        -> r :: {Type} -> $(mapTT tf r) -> xml ctx [] []
+
 val foldTRX2 : tf1 :: (Type -> Type) -> tf2 :: (Type -> Type) -> ctx :: {Unit}
         -> (nm :: Name -> t :: Type -> rest :: {Type} -> [nm] ~ rest
                 -> tf1 t -> tf2 t -> xml ctx [] [])
--- a/tests/crud.ur	Sat Sep 13 19:53:07 2008 -0400
+++ b/tests/crud.ur	Sat Sep 13 20:04:28 2008 -0400
@@ -1,4 +1,4 @@
-con colMeta' = fn t :: Type => {Show : t -> xbody}
+con colMeta' = fn t :: Type => {Nam : string, Show : t -> xbody}
 con colMeta = fn cols :: {Type} => $(Top.mapTT colMeta' cols)
 
 functor Make(M : sig
@@ -22,8 +22,8 @@
                                 {foldTRX2 [idT] [colMeta'] [tr]
                                         (fn (nm :: Name) (t :: Type) (rest :: {Type}) =>
                                                 [[nm] ~ rest] =>
-                                                fn v funcs => <tr>
-                                                        <td>{funcs.Show v}</td>
+                                                fn v col => <tr>
+                                                        <td>{col.Show v}</td>
                                                 </tr>)
                                         [M.cols] (fs.T -- #Id) M.cols}
                         </tr>
@@ -36,7 +36,16 @@
                 <h1>{cdata M.title}</h1>
 
                 <table border={1}>
-                <tr> <th>ID</th> </tr>
+                <tr>
+                        <th>ID</th>
+                        {foldTRX [colMeta'] [tr]
+                                (fn (nm :: Name) (t :: Type) (rest :: {Type}) =>
+                                        [[nm] ~ rest] =>
+                                        fn col => <tr>
+                                                <th>{cdata col.Nam}</th>
+                                        </tr>)
+                                [M.cols] M.cols}
+                </tr>
                 {rows}
                 </table>
         </body></html>
--- a/tests/crud.urs	Sat Sep 13 19:53:07 2008 -0400
+++ b/tests/crud.urs	Sat Sep 13 20:04:28 2008 -0400
@@ -1,4 +1,4 @@
-con colMeta' = fn t :: Type => {Show : t -> xbody}
+con colMeta' = fn t :: Type => {Nam : string, Show : t -> xbody}
 con colMeta = fn cols :: {Type} => $(Top.mapTT colMeta' cols)
 
 functor Make(M : sig
--- a/tests/crud1.ur	Sat Sep 13 19:53:07 2008 -0400
+++ b/tests/crud1.ur	Sat Sep 13 20:04:28 2008 -0400
@@ -6,9 +6,9 @@
         val title = "Crud1"
 
         val cols = {
-                A = {Show = txt _},
-                B = {Show = txt _},
-                C = {Show = txt _},
-                D = {Show = txt _}
+                A = {Nam = "A", Show = txt _},
+                B = {Nam = "B", Show = txt _},
+                C = {Nam = "C", Show = txt _},
+                D = {Nam = "D", Show = txt _}
         }
 end)