diff options
author | Camil Staps | 2019-10-23 10:21:42 +0200 |
---|---|---|
committer | Camil Staps | 2019-10-23 10:21:42 +0200 |
commit | 5b96750c3c4252d29bb5524c6a1c0e2b1065e369 (patch) | |
tree | cc749f5ce6fddb51c55735926e16a2db8a998d39 /src/Gtk/Shares.icl | |
parent | Add tune instance for signal handlers (diff) |
Add rudimentary shares system
Diffstat (limited to 'src/Gtk/Shares.icl')
-rw-r--r-- | src/Gtk/Shares.icl | 36 |
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 |