0 | module Control.Cont.State
2 | import Control.HigherOrder
4 | import Control.Monad.Free
7 | data StateC1 : Type -> Type -> Type where
8 | Get : (s -> x) -> StateC1 s x
9 | Put : s -> x -> StateC1 s x
12 | Functor (StateC1 s) where
13 | map f (Get g) = Get (f . g)
14 | map f (Put s x) = Put s (f x)
17 | StateC : Type -> (Type -> Type) -> Type -> Type
18 | StateC s = Lift (StateC1 s)
21 | runStateC : Syntax sig
23 | -> Free (StateC s :+: sig) a
25 | runStateC s (Return x) = Return (s, x)
26 | runStateC s (Op (Inl (MkLift (Get k)))) =
28 | runStateC s (Op (Inl (MkLift (Put s' k)))) =
30 | runStateC s (Op (Inr op)) =
31 | Op (weave {m1 = ?t
} {s = Pair _} (s, ()) (uncurry runStateC) op)
34 | get : (Inj (StateC s) sig) => Free sig s
35 | get = inject {sub = StateC s} (MkLift (Get Return))
38 | put : (Inj (StateC s) sig) => s -> Free sig ()
39 | put val = inject {sub = StateC s} (MkLift (Put val (Return ())))
42 | modify : Syntax sig => Inj (StateC s) sig => (s -> s) -> Free sig ()
48 | withSt : Syntax sig => Inj (StateC st) sig => a -> Free sig (st, a)
49 | withSt x = map (, x) get