diff togglePanel.ur @ 20:554e342665fe

Add a new parameter to Gui.gui
author Adam Chlipala <adam@chlipala.net>
date Sat, 24 Sep 2011 15:47:00 -0400
parents 3a303df9ae92
children 30f9a763f5fb
line wrap: on
line diff
--- a/togglePanel.ur	Fri Sep 23 13:30:01 2011 +0200
+++ b/togglePanel.ur	Sat Sep 24 15:47:00 2011 -0400
@@ -1,34 +1,37 @@
 datatype panelState = Open | Closed
 
-con formatCtl :: {Unit} -> Type = fn other_ctx => {FormatPanel : (xml ([Body] ++ other_ctx) [] []) -> (xml ([Body] ++ other_ctx) [] []) -> (xml ([Body] ++ other_ctx) [] []),
-                  OpenCtl : transaction unit -> xml ([Body] ++ other_ctx) [] [],
-                  CloseCtl : transaction unit -> xml ([Body] ++ other_ctx) [] []}
+con formatCtl = fn ctx :: {Unit} => [body ~ ctx] =>
+                   {FormatPanel : xbody -> xbody -> xml (body ++ ctx) [] [],
+                    OpenCtl : transaction unit -> xbody,
+                    CloseCtl : transaction unit -> xbody}
 
-val defaultFormat = {FormatPanel = fn ctl panel => <xml>{ctl}{panel}</xml>,
-                     OpenCtl = fn behaviour => <xml><button value="Open" onclick={behaviour}/></xml>,
-                     CloseCtl = fn behaviour => <xml><button value="Close" onclick={behaviour}/></xml>}
+val defaultFormat [body ~ []] =
+    {FormatPanel = fn ctl panel => <xml>{ctl}{panel}</xml>,
+     OpenCtl = fn behaviour => <xml><button value="Open" onclick={behaviour}/></xml>,
+     CloseCtl = fn behaviour => <xml><button value="Close" onclick={behaviour}/></xml>}
                     
-con togglePanel t other_ctx = {PanelState : source panelState,
-                     FormatCtl : formatCtl other_ctx,
-                     Content : t}
+con togglePanel t ctx = {PanelState : source panelState,
+                         FormatCtl : formatCtl ctx,
+                         Content : t}
 
 open Gui
 
-fun create [t ::: Type] [other_ctx:::{Unit}] [other_ctx ~ body] (toXml : gui t (xml ([Body] ++ other_ctx) [] [])) (f : formatCtl other_ctx) (content : t) (startOpen : bool) : transaction (togglePanel t other_ctx) =
+fun create [t ::: Type] [ctx ::: {Unit}] (f : formatCtl ctx) (content : t) (startOpen : bool) : transaction (togglePanel t ctx) =
     state <- source (if startOpen then Open else Closed);
 
     return {PanelState = state,
-            FormatCtl = f,
+            FormatCtl = @f,
             Content = content}
 
-fun render [t ::: Type]  [other_ctx:::{Unit}] [other_ctx ~ body] (_ : gui t (xml ([Body] ++ other_ctx) [] [])) (panel : togglePanel t other_ctx) =
+fun render [t ::: Type] [ctx ::: {Unit}] (_ : gui t ctx) [body ~ ctx] (panel : togglePanel t ctx) =
     let
-        val openCtl = panel.FormatCtl.CloseCtl (set panel.PanelState Closed)
-        val closeCtl = panel.FormatCtl.OpenCtl (set panel.PanelState Open)
+        val format = panel.FormatCtl !
+        val openCtl = format.CloseCtl (set panel.PanelState Closed)
+        val closeCtl = format.OpenCtl (set panel.PanelState Open)
 
         val content = toXml panel.Content
     in
-        panel.FormatCtl.FormatPanel
+        format.FormatPanel
             <xml>
               <dyn signal={c <- signal panel.PanelState;
                            return
@@ -48,4 +51,4 @@
             </xml>
     end
 
-fun gui_togglePanel [t ::: Type]  [other_ctx:::{Unit}] [other_ctx ~ body] (_ : gui t (xml ([Body] ++ other_ctx) [] [])) = mkGui render 
+fun gui_togglePanel [t ::: Type] [ctx ::: {Unit}] (g : gui t ctx) = mkGui (@render g)