diff options
author | Camil Staps | 2019-10-22 14:52:47 +0200 |
---|---|---|
committer | Camil Staps | 2019-10-22 14:52:47 +0200 |
commit | dc004b45f8b499a4c35b08f8e18f641354f9b9d1 (patch) | |
tree | 4d82f92169922662299c51772e8e4cc62d9390d9 /src/Gtk/Signal.icl | |
parent | Alphabetic order in Gtk.Widgets (diff) |
Add custom GtkM state monad with a bind that does not grow the stack
Diffstat (limited to 'src/Gtk/Signal.icl')
-rw-r--r-- | src/Gtk/Signal.icl | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/src/Gtk/Signal.icl b/src/Gtk/Signal.icl index 5861e92..119829a 100644 --- a/src/Gtk/Signal.icl +++ b/src/Gtk/Signal.icl @@ -3,22 +3,19 @@ implementation module Gtk.Signal import StdEnv import Control.Monad -import Control.Monad.Identity -import Control.Monad.State import qualified Data.Map +import Gtk import Gtk.Internal -import Gtk.State -import Gtk.Widgets -installSignalHandler :: !GSignalHandler !w -> State GtkState w | gtkWidget w +installSignalHandler :: !GSignalHandler !w -> GtkM w | gtkWidget w installSignalHandler handler widget = - modify (\st -> + modState (\st -> { st & signal_handlers = 'Data.Map'.put (st.signal_counter+1) handler_internal st.signal_handlers , signal_counter = st.signal_counter+1 }) >>| - gets (\st -> st.signal_counter) >>= \id -> + getState >>= \{signal_counter=id} -> (toState case handler_internal of GSHI_Void _ -> g_signal_connect_void (toPtr (gtkWidget widget)) signal_name id) >>| pure widget |