From dc004b45f8b499a4c35b08f8e18f641354f9b9d1 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Tue, 22 Oct 2019 14:52:47 +0200 Subject: Add custom GtkM state monad with a bind that does not grow the stack --- src/Gtk/Signal.icl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'src/Gtk/Signal.icl') 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 -- cgit v1.2.3