0 | module Control.Eff.State
2 | import Control.Eff.Internal
7 | data StateL : (lbl : k) -> (s : Type) -> (a : Type) -> Type where
10 | Put : (vs : s) -> StateL lbl s ()
13 | State : (s,a : Type) -> Type
17 | getAt : (0 lbl : k) -> Has (StateL lbl s) fs => Eff fs s
18 | getAt lbl = send $
Get {lbl}
21 | get : Has (State s) fs => Eff fs s
25 | putAt : (0 lbl : k) -> Has (StateL lbl s) fs => s -> Eff fs ()
26 | putAt lbl vs = send $
Put {lbl} vs
29 | put : Has (State s) fs => s -> Eff fs ()
33 | modifyAt : (0 lbl : k) -> Has (StateL lbl s) fs => (s -> s) -> Eff fs ()
34 | modifyAt lbl f = getAt lbl >>= putAt lbl . f
37 | modify : Has (State s) fs => (s -> s) -> Eff fs ()
38 | modify = modifyAt ()
46 | {0 m : Type -> Type}
48 | -> (put : s -> m ())
51 | handleState get _ Get = get
52 | handleState _ put (Put vs) = put vs
54 | unState : s -> StateL lbl s a -> (a,s)
55 | unState vs Get = (vs,vs)
56 | unState _ (Put s2) = ((),s2)
61 | -> {auto _ : Has (StateL lbl s) fs}
64 | -> Eff (fs - StateL lbl s) (t,s)
66 | handleRelayS vs (\x,y => pure (y,x)) $
\vs2,st,f =>
67 | let (vv,vs3) := unState vs2 st
71 | runState : Has (State s) fs => s -> Eff fs t -> Eff (fs - State s) (t,s)
72 | runState = runStateAt ()