module Control.Effects.State where
import Control.Effects.Eff
import Control.Monad
data State s a = SGet (s -> a)
| SPut s a
deriving (Functor, Typeable)
get :: (Member (State a) r, Typeable a) => Eff r a
get = effect $ \k -> inj $ SGet k
put :: (Member (State s) r, Typeable s) => s -> Eff r ()
put a = effect $ \k -> inj $ SPut a $ k ()
state :: (Member (State s) r, Typeable s) => (s -> (a, s)) -> Eff r a
state f = do
s <- get
let (a, s') = f s
put s'
return a
stateHandler :: Handler (State s) r a (s -> Eff r a)
stateHandler (Value a) = return $ const $ return a
stateHandler (Comp (SGet k)) = return $ \s -> join $ ($s) `fmap` continue (k s)
stateHandler (Comp (SPut s k)) = return $ \_ -> join $ continue $ fmap ($s) k