-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Extensible objects
--
@package objective
@version 0.3
module Control.Object
-- | The type 'Object e m' represents objects which can handle messages
-- e, perform actions in the environment m. It can be
-- thought of as an automaton that converts effects. Objects can
-- be composed just like functions using .>>.; the identity
-- element is echo.
newtype Object e m
Object :: (forall x. e x -> m (x, Object e m)) -> Object e m
runObject :: Object e m -> forall x. e x -> m (x, Object e m)
-- | Lift a natural transformation into an object.
liftO :: Functor f => (forall x. e x -> f x) -> Object e f
-- | Change the workspace of the object.
transObject :: Functor g => (forall x. f x -> g x) -> Object e f -> Object e g
-- | Apply a function to the messages coming into the object.
adaptObject :: Functor m => (forall x. e x -> f x) -> Object f m -> Object e m
-- | Parrots messages given.
echo :: Functor e => Object e e
-- | Compose two objects (aka Dependency Injection).
(.>>.) :: Functor n => Object e m -> Object m n -> Object e n
-- | Build an object.
oneshot :: (Functor e, Monad m) => (forall a. e (m a) -> m a) -> Object e m
-- | Build a stateful object.
stateful :: Monad m => (forall a. e a -> StateT s m a) -> s -> Object e m
-- | Build a stateful object, sharing out the state.
sharing :: Monad m => (forall a. e a -> StateT s m a) -> s -> Object (AccessT s e) m
-- | Like MonadState, but doesn't require Monad as a
-- prerequisite.
class Stateful s f | f -> s
get_ :: Stateful s f => f s
put_ :: Stateful s f => s -> f ()
-- | Inflicts external state accessibility to arbitrary effects.
data AccessT s f a
Get :: (s -> a) -> AccessT s f a
Put :: s -> a -> AccessT s f a
LiftAccessT :: (f a) -> AccessT s f a
-- | A mutable variable.
variable :: Applicative f => s -> Object (Access s) f
type Access s = AccessT s Zero
-- | Convert a method sequence into a sequential method
-- execution.
sequential :: Monad m => Object e m -> Object (Free e) m
instance Typeable Object
instance Typeable AccessT
instance Functor f => Functor (AccessT s f)
instance (Functor f, Stateful s f) => Stateful s (Free f)
instance Stateful s (AccessT s f)
module Control.Monad.Objective.Class
class Monad m => MonadObjective m where data family Address (e :: * -> *) (m :: * -> *) type family Residence (m :: * -> *) :: * -> *
(.-) :: MonadObjective m => Address e m -> e a -> m a
new :: MonadObjective m => Object e (Residence m) -> m (Address e m)
-- | Old synonym for new.
-- | Deprecated: Use new instead of misleading invoke
invoke :: MonadObjective m => Object e (Residence m) -> m (Address e m)
(.&) :: (MonadObjective m, Stateful s e) => Address e m -> StateT s m a -> m a
-- | like sequential, but it allows ad-hoc use of Free.
(.|-) :: MonadObjective m => Address e m -> Free e a -> m a
instance (Monoid w, MonadObjective m) => MonadObjective (WriterT w m)
instance (Monoid w, MonadObjective m) => MonadObjective (WriterT w m)
instance MonadObjective m => MonadObjective (StateT s m)
instance MonadObjective m => MonadObjective (StateT s m)
instance MonadObjective m => MonadObjective (MaybeT m)
instance MonadObjective m => MonadObjective (ListT m)
instance MonadObjective m => MonadObjective (IdentityT m)
instance MonadObjective m => MonadObjective (ExceptT er m)
instance MonadObjective m => MonadObjective (ContT r m)
instance (Monoid w, MonadObjective m) => MonadObjective (RWST r w s m)
instance (Monoid w, MonadObjective m) => MonadObjective (RWST r w s m)
instance MonadObjective m => MonadObjective (ReaderT r m)
-- | MonadObjective IO using MVar
module Control.Monad.Objective.IO
instance MonadObjective IO
module Control.Monad.Objective