summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-09-13 20:04:28 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-09-13 20:04:28 -0400
commitb145e03e5e25cfd59f544312efe3ea93e265a8ce (patch)
tree63178c623e47e45b58631910c533721505226647
parent291fe704e9a5be0a71cd03418ec5229c99910898 (diff)
Crud gets column headings
-rw-r--r--lib/top.ur19
-rw-r--r--lib/top.urs10
-rw-r--r--tests/crud.ur17
-rw-r--r--tests/crud.urs2
-rw-r--r--tests/crud1.ur8
5 files changed, 47 insertions, 9 deletions
diff --git a/lib/top.ur b/lib/top.ur
index 7c18da21..3fac43a7 100644
--- a/lib/top.ur
+++ b/lib/top.ur
@@ -8,6 +8,16 @@ fun compose (t1 ::: Type) (t2 ::: Type) (t3 ::: Type) (f1 : t2 -> t3) (f2 : t1 -
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 @@ fun foldTR2 (tf1 :: Type -> Type) (tf2 :: Type -> Type) (tr :: {Type} -> Type)
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 [] []) =
diff --git a/lib/top.urs b/lib/top.urs
index b124caa2..8fb6e480 100644
--- a/lib/top.urs
+++ b/lib/top.urs
@@ -10,11 +10,21 @@ val compose : t1 ::: Type -> t2 ::: Type -> t3 ::: Type
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 [] [])
diff --git a/tests/crud.ur b/tests/crud.ur
index 7f0fc71c..c596eaad 100644
--- a/tests/crud.ur
+++ b/tests/crud.ur
@@ -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 @@ fun main () : transaction page =
{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 @@ fun main () : transaction page =
<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>
diff --git a/tests/crud.urs b/tests/crud.urs
index 4741af00..988c5458 100644
--- a/tests/crud.urs
+++ b/tests/crud.urs
@@ -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
diff --git a/tests/crud1.ur b/tests/crud1.ur
index 2253d459..f9d67ed8 100644
--- a/tests/crud1.ur
+++ b/tests/crud1.ur
@@ -6,9 +6,9 @@ open Crud.Make(struct
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)