idris-0.9.8: effects/Effect/State.idr
module Effect.State
import Effects
%access public
data State : Effect where
Get : State a a a
Put : b -> State a b ()
using (m : Type -> Type)
instance Handler State m where
handle st Get k = k st st
handle st (Put n) k = k n ()
STATE : Type -> EFFECT
STATE t = MkEff t State
get : Eff m [STATE x] x
get = Get
put : x -> Eff m [STATE x] ()
put val = Put val
putM : y -> EffM m [STATE x] [STATE y] ()
putM val = Put val
update : (x -> x) -> Eff m [STATE x] ()
update f = do val <- get
put (f val)
updateM : (x -> y) -> EffM m [STATE x] [STATE y] ()
updateM f = do val <- get
putM (f val)
locally : x -> Eff m [STATE x] t -> Eff m [STATE y] t
locally newst prog = do st <- get
putM newst
val <- prog
putM st
return val