on 043bffe help sign in
66 lines 1.6 kB history raw
1-- | The 'State' effect.
2--
3-- Represented as a pure value underneath, therefore:
4--
5-- - thread local (if you need sharing, have a look at "Effectful.State.MVar"),
6--
7-- - very fast.
8--
9module Effectful.State
10 ( State
11 , runState
12 , evalState
13 , execState
14 , get
15 , gets
16 , put
17 , state
18 , modify
19 , stateM
20 , modifyM
21 ) where
23import Effectful.Internal.Effect
24import Effectful.Internal.Monad
26-- | Provide access to a strict (WHNF), thread local, mutable state of type @s@.
27newtype State s :: Effect where
28 State :: s -> State s m r
30runState :: s -> Eff (State s : es) a -> Eff es (a, s)
31runState s0 m = do
32 (a, IdE (State s)) <- runEffect (IdE (State s0)) m
33 pure (a, s)
35evalState :: s -> Eff (State s : es) a -> Eff es a
36evalState s = evalEffect (IdE (State s))
38execState :: s -> Eff (State s : es) a -> Eff es s
39execState s0 m = do
40 IdE (State s) <- execEffect (IdE (State s0)) m
41 pure s
43get :: State s :> es => Eff es s
44get = do
45 IdE (State s) <- getEffect
46 pure s
48gets :: State s :> es => (s -> a) -> Eff es a
49gets f = f <$> get
51put :: State s :> es => s -> Eff es ()
52put s = putEffect (IdE (State s))
54state :: State s :> es => (s -> (a, s)) -> Eff es a
55state f = stateEffect $ \(IdE (State s0)) -> let (a, s) = f s0 in (a, IdE (State s))
57modify :: State s :> es => (s -> s) -> Eff es ()
58modify f = state (\s -> ((), f s))
60stateM :: State s :> es => (s -> Eff es (a, s)) -> Eff es a
61stateM f = stateEffectM $ \(IdE (State s0)) -> do
62 (a, s) <- f s0
63 pure (a, IdE (State s))
65modifyM :: State s :> es => (s -> Eff es s) -> Eff es ()
66modifyM f = stateM (\s -> ((), ) <$> f s)