packages feed

idris-0.9.5: lib/Control/Monad/State.idr

module Control.Monad.State

import Control.Monad.Identity
import Prelude.Monad

%access public

class Monad m => MonadState s (m : Set -> Set) where
    get : m s
    put : s -> m ()

record StateT : Set -> (Set -> Set) -> Set -> Set where
    ST : {m : Set -> Set} ->
         (runStateT : s -> m (a, s)) -> StateT s m a

instance Monad m => Monad (StateT s m) where
    return x = ST (\st => return (x, st))

    (ST f) >>= k = ST (\st => do (v, st') <- f st
                                 let ST kv = k v
                                 kv st')

instance Monad m => MonadState s (StateT s m) where
    get   = ST (\x => return (x, x))
    put x = ST (\y => return ((), x)) 

State : Set -> Set -> Set
State s a = StateT s Identity a