summaryrefslogtreecommitdiff
path: root/src/Gtk/Shares.icl
diff options
context:
space:
mode:
Diffstat (limited to 'src/Gtk/Shares.icl')
-rw-r--r--src/Gtk/Shares.icl36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Gtk/Shares.icl b/src/Gtk/Shares.icl
new file mode 100644
index 0000000..13a8727
--- /dev/null
+++ b/src/Gtk/Shares.icl
@@ -0,0 +1,36 @@
+implementation module Gtk.Shares
+
+import StdEnv
+import StdMaybe
+import StdDebug
+
+import Control.Monad
+import Data.Functor
+import qualified Data.Map
+
+import Gtk
+
+:: Shared a :== (String,a)
+
+share :: !ShareId a -> Shared a | shared a
+share id default = (id,default)
+
+getShared :: !(Shared a) -> GtkM a | shared a
+getShared (id,default) = retrieve <$> getState
+where
+ retrieve {shares} = case 'Data.Map'.get id shares of
+ Nothing -> default
+ Just (v :: a^) -> v
+ Just d -> trace_n warning default
+ with
+ warning = "getShared type mismatch: expected "+++
+ toString (typeCodeOfDynamic (dynamic default))+++"; got "+++
+ toString (typeCodeOfDynamic d)
+
+setShared :: !(Shared a) !a -> GtkM a | shared a
+setShared (id,_) v =
+ modState (\st -> {st & shares='Data.Map'.put id (dynamic v) st.shares}) >>|
+ pure v
+
+updateShared :: !(a -> a) !(Shared a) -> GtkM a | shared a
+updateShared f shared = getShared shared >>= setShared shared o f