@@ -28,6 +28,8 @@ module Effective.State.Dynamic
2828 , put
2929 , state
3030 , modify
31+ , stateM
32+ , modifyM
3133 ) where
3234
3335import Control.Concurrent.MVar
@@ -43,7 +45,7 @@ data State s = forall ref. State
4345 { _ref :: ref
4446 , _get :: forall es. ref -> Eff es s
4547 , _put :: forall es. ref -> s -> Eff es ref
46− , _state :: forall es a. ref -> (s -> (a, s)) -> Eff es (a, ref)
48+ , _state :: forall es a. ref -> (s -> Eff es (a, s)) -> Eff es (a, ref)
4749 }
4850
4951----------------------------------------
@@ -63,7 +65,7 @@ statePure s0 = State
6365 { _ref = s0
6466 , _get = pure
6567 , _put = \_ -> pure
66− , _state = \s f -> pure $ f s
68+ , _state = \s f -> f s
6769 }
6870
6971----------------------------------------
@@ -90,8 +92,9 @@ stateMVar v0 = State
9092 , _get = impureEff_ . readMVar
9193 , _put = \v s -> impureEff_ . modifyMVar v $ \_ ->
9294 s `seq` pure (s, v)
93− , _state = \v f -> impureEff_ . modifyMVar v $ \s0 ->
94− let (a, s) = f s0 in s `seq` pure (s, (a, v))
95+ , _state = \v f -> impureEff $ \es -> modifyMVar v $ \s0 -> do
96+ (a, s) <- unEff (f s0) es
97+ s `seq` pure (s, (a, v))
9598 }
9699
97100----------------------------------------
@@ -107,8 +110,16 @@ put s = stateEffectM $ \State{..} -> do
107110
108111state :: State s :> es => (s -> (a, s)) -> Eff es a
109112state f = stateEffectM $ \State{..} -> do
110− (a, ref) <- _state _ref f
113+ (a, ref) <- _state _ref $ pure . f
111114 pure (a, State { _ref = ref, .. })
112115
113116modify :: State s :> es => (s -> s) -> Eff es ()
114117modify f = state (\s -> ((), f s))
118+
119+stateM :: State s :> es => (s -> Eff es (a, s)) -> Eff es a
120+stateM f = stateEffectM $ \State{..} -> do
121+ (a, ref) <- _state _ref f
122+ pure (a, State { _ref = ref, .. })
123+
124+modifyM :: State s :> es => (s -> Eff es s) -> Eff es ()
125+modifyM f = stateM (\s -> ((), ) <$> f s)