-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | An approach to managing composable effects, ala mtl/transformers/extensible-effects/Eff
--
-- An approach to managing composable effects, ala
-- mtltransformersextensible-effects/Eff
@package transformers-eff
@version 0.2.0.0
module Control.Effect
-- | The Eff monad transformer is used to write programs that
-- require access to specific effects. In this library, effects are
-- combined by stacking multiple Effs together, just as you would
-- do with traditional monad transformers. Effs are parameterized
-- by an effect algebra. This is a description of programs in a
-- single effect, such as non-determinism ([])or exceptions
-- (Either e). As Eff is a monad transformer, m
-- is the monad that Eff transforms, which can itself be another
-- instance of Eff.
newtype Eff f m a
Eff :: (forall g r. (forall x. Sum f m x -> Cont (g r) x) -> Cont (g r) a) -> Eff f m a
-- | In order to run Eff computations, we need to provide a way to
-- run its effects in a specific monad transformer. Notice that
-- run eliminates one layer of Eff, returning you with
-- the original a now captured under the result of the effects
-- described by the effect functor.
translate :: (Monad m, Monad (t m), MonadTrans t) => (forall x r. f x -> ContT r (t m) x) -> Eff f m a -> t m a
-- | LiftProgram defines an mtl-style type class for
-- automatically lifting effects into Eff stacks. When exporting
-- libraries that you intend to publish on Hackage, it's suggested that
-- you still provide your own type class (such as MonadThrow or
-- MonadHTTP) to avoid locking people into this library, but
-- interpret can be useful to define your own instances of that
-- type class for Eff.
class (IsEff m, Monad m) => Interprets p m | m -> p
interpret :: Interprets p m => p a -> m a
interpret :: Interprets p m => p a -> m a
-- | The IsEff type family is used to make sure that a given monad
-- stack is based around Eff. This is important, as it allows us
-- to reason about Eff-based type classes, knowing that only
-- Eff implements them, thus giving us the orthogonal-handling
-- properties that we desire.
instance GHC.Base.Monad m => Control.Effect.Interprets f (Control.Effect.Eff f m)
instance (GHC.Base.Monad m, Control.Effect.Interprets f (Control.Effect.Eff h m)) => Control.Effect.Interprets f (Control.Effect.Eff g (Control.Effect.Eff h m))
instance GHC.Base.Functor (Control.Effect.Eff f m)
instance GHC.Base.Applicative (Control.Effect.Eff f m)
instance GHC.Base.Monad (Control.Effect.Eff f m)
instance Control.Monad.Trans.Class.MonadTrans (Control.Effect.Eff f)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Effect.Eff effect m)
instance GHC.Base.Functor (Control.Effect.Cont r)
instance GHC.Base.Applicative (Control.Effect.Cont r)
instance GHC.Base.Monad (Control.Effect.Cont r)
module Control.Effect.Environment
class (Monad m) => EffEnvironment env m | m -> env
liftReader :: EffEnvironment env m => Reader env a -> m a
runInEnvironment :: Monad m => Eff (Reader env) m a -> env -> m a
ask :: (EffEnvironment env m) => m env
asks :: (EffEnvironment a m) => (a -> b) -> m b
mapEnvironment :: (EffEnvironment env m) => (env -> env') -> Eff (Reader env') m a -> m a
liftReader :: EffEnvironment env m => Reader env a -> m a
effToReaderT :: Monad m => Eff (Reader e) m a -> ReaderT e m a
readerTToEff :: (Monad m, EffEnvironment e m) => ReaderT e m a -> m a
instance GHC.Base.Monad m => Control.Effect.Environment.EffEnvironment env (Control.Effect.Eff (Control.Monad.Trans.Reader.Reader env) m)
instance Control.Effect.Environment.EffEnvironment env m => Control.Effect.Environment.EffEnvironment env (Control.Effect.Eff effects m)
module Control.Effect.Exception
class Monad m => EffException e m | m -> e
liftEither :: EffException e m => Either e a -> m a
try :: Monad m => Eff (Either e) m a -> m (Either e a)
throw :: EffException e m => e -> m a
liftEither :: EffException e m => Either e a -> m a
effToExceptT :: Monad m => Eff (Either e) m a -> ExceptT e m a
exceptTToEff :: (Monad m, EffException e m) => ExceptT e m a -> m a
instance GHC.Base.Monad m => Control.Effect.Exception.EffException e (Control.Effect.Eff (Data.Either.Either e) m)
instance Control.Effect.Exception.EffException e m => Control.Effect.Exception.EffException e (Control.Effect.Eff f m)
module Control.Effect.IO
data UIO a
runUIO :: UIO a -> IO a
-- | Lift an IO action and explictly throw an synchronous IO
-- exceptions that occur.
syncIO :: (Interprets (Either SomeException) m, EffUIO m) => IO a -> m a
class Monad m => EffUIO m
liftUIO :: EffUIO m => UIO a -> m a
runExceptionalIO :: Eff (Either SomeException) IO a -> IO a
instance GHC.Base.Monad Control.Effect.IO.UIO
instance GHC.Base.Applicative Control.Effect.IO.UIO
instance GHC.Base.Functor Control.Effect.IO.UIO
instance Control.Effect.IO.EffUIO GHC.Types.IO
instance Control.Effect.IO.EffUIO Control.Effect.IO.UIO
instance Control.Effect.IO.EffUIO m => Control.Effect.IO.EffUIO (Control.Effect.Eff r m)
module Control.Effect.Identity
runIdentity :: Monad m => Eff Identity m a -> m a
module Control.Effect.Nondeterminism
class Monad m => Nondeterministic m
liftNondeterminism :: Nondeterministic m => [a] -> m a
choose :: (Nondeterministic m, Foldable f) => f a -> m a
runNondeterminism :: (Monad m, Foldable f) => (b -> a -> b) -> b -> Eff f m a -> m b
runNondeterminismM :: (Monad m, Foldable f) => (b -> a -> m b) -> m b -> Eff f m a -> m b
mzero :: Nondeterministic m => m a
mplus :: Nondeterministic m => m a -> m a -> m a
instance GHC.Base.Monad m => Control.Effect.Nondeterminism.Nondeterministic (Control.Effect.Eff [] m)
instance Control.Effect.Nondeterminism.Nondeterministic m => Control.Effect.Nondeterminism.Nondeterministic (Control.Effect.Eff f m)
module Control.Effect.State
runState :: Monad m => Eff (State s) m a -> s -> m (a, s)
evalState :: Monad m => Eff (State s) m a -> s -> m a
execState :: Monad m => Eff (State s) m a -> s -> m s
get :: (Interprets (State state) m) => m state
put :: (Interprets (State state) m) => state -> m ()
modify :: (Interprets (State state) m) => (state -> state) -> m ()
modify' :: (Interprets (State state) m) => (state -> state) -> m ()
gets :: (Interprets (State state) m) => (state -> a) -> m a