objective-0.0: src/Control/Monad/Objective/Class.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
module Control.Monad.Objective.Class where
import Control.Object
import Control.Monad.Trans.State
infix 3 .-
infix 3 .&
class Monad m => MonadObjective s m where
type Base m :: * -> *
data Control s (e :: * -> *)
-- | Send a message to the pointed one.
(.-) :: Control s e -> e a -> m a
-- | Add an object to the environment.
invoke :: Object e (Base m) -> m (Control s e)
(.&) :: (MonadObjective k m, Stateful s e) => Control k e -> StateT s m a -> m a
c .& m = do
s <- c .- get_
(a, s') <- runStateT m s
c .- put_ s'
return a