on master help sign in
Add stateM and modifyM
commit223f3783417ef720f9954c864344d728a9658483 authorAndrzej Rybczak <andrzej@rybczak.net> dateFri 11 Jun 2021, 17:45 (5 years ago) parent8f20c15
3 files changed+36−5
src/Effective/State.hs+8 src/Effective/State/Dynamic.hs+16−5 src/Effective/State/MVar.hs+12
src/Effective/State.hs+8
@@ -18,6 +18,8 @@ module Effective.State
1818 , put
1919 , state
2020 , modify
21+ , stateM
22+ , modifyM
2123 ) where
2224
2325import Data.Coerce
@@ -48,3 +50,9 @@ state f = stateEffect $ \(State s0) -> let (a, s) = f s0 in (a, State s)
4850
4951modify :: State s :> es => (s -> s) -> Eff es ()
5052modify f = state (\s -> ((), f s))
53+
54+stateM :: State s :> es => (s -> Eff es (a, s)) -> Eff es a
55+stateM f = stateEffectM $ \(State s0) -> coerce $ f s0
56+
57+modifyM :: State s :> es => (s -> Eff es s) -> Eff es ()
58+modifyM f = stateM (\s -> ((), ) <$> f s)
src/Effective/State/Dynamic.hs+16−5
@@ -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)
src/Effective/State/MVar.hs+12
@@ -15,6 +15,8 @@ module Effective.State.MVar
1515 , put
1616 , state
1717 , modify
18+ , stateM
19+ , modifyM
1820 ) where
1921
2022import Control.Concurrent.MVar
@@ -57,3 +59,13 @@ state f = do
5759
5860modify :: State s :> es => (s -> s) -> Eff es ()
5961modify f = state (\s -> ((), f s))
62+
63+stateM :: State s :> es => (s -> Eff es (a, s)) -> Eff es a
64+stateM f = do
65+ State v <- getEffect
66+ impureEff $ \es -> modifyMVar v $ \s0 -> do
67+ (a, s) <- unEff (f s0) es
68+ s `seq` pure (s, a)
69+
70+modifyM :: State s :> es => (s -> Eff es s) -> Eff es ()
71+modifyM f = stateM (\s -> ((), ) <$> f s)