diff src/ur/feed.ur @ 21:7275f59cab61

tagAOR and a Reddit example of using it
author Adam Chlipala <adam@chlipala.net>
date Sat, 29 Sep 2012 10:30:00 -0400
parents f641cfcd5153
children
line wrap: on
line diff
--- a/src/ur/feed.ur	Sat Jun 23 09:58:31 2012 -0400
+++ b/src/ur/feed.ur	Sat Sep 29 10:30:00 2012 -0400
@@ -80,7 +80,17 @@
 
 fun tagAO [attrs ::: {Unit}] (fl : folder attrs) (name : string) (attrs : $(mapU string attrs))
     : pattern (tagInternal attrs) $(mapU (option string) attrs) =
-    @tagG fl (fn r => Some (r.Attrs)) name attrs
+    @tagG fl (fn r => Some r.Attrs) name attrs
+
+fun tagAOR [optional ::: {Unit}] [required ::: {Unit}] [optional ~ required]
+           (ofl : folder optional) (rfl : folder required)
+           (name : string) (required : $(mapU string required)) (optional : $(mapU string optional))
+    : pattern (tagInternal (optional ++ required)) $(mapU string required ++ mapU (option string) optional) =
+    @tagG (@Folder.concat ! ofl rfl)
+     (fn r => case @allPresent rfl (r.Attrs --- mapU (option string) optional) of
+                  None => None
+                | Some req => Some (r.Attrs --- mapU (option string) required ++ req))
+     name (required ++ optional)
 
 fun tagC (name : string) : pattern (tagInternal []) string =
     tagG (fn r => r.Cdata) name {}