unliftio-core-0.2.1.0: The MonadUnliftIO typeclass for unlifting monads to IO
Safe Haskell Safe-Inferred
Language Haskell2010

Control.Monad.IO.Unlift

Description

Please see the README.md file for information on using this package at https://www.stackage.org/package/unliftio-core .

Synopsis

Documentation

class MonadIO m => MonadUnliftIO m where Source #

Monads which allow their actions to be run in IO .

While MonadIO allows an IO action to be lifted into another monad, this class captures the opposite concept: allowing you to capture the monadic context. Note that, in order to meet the laws given below, the intuition is that a monad must have no monadic state, but may have monadic context. This essentially limits MonadUnliftIO to ReaderT and IdentityT transformers on top of IO .

Laws. For any function run provided by withRunInIO , it must meet the monad transformer laws as reformulated for MonadUnliftIO :

  • run . return = return
  • run (m >>= f) = run m >>= run . f

Instances of MonadUnliftIO must also satisfy the following laws:

Identity law
withRunInIO (\run -> run m) = m
Inverse law
withRunInIO (\_ -> m) = liftIO m

As an example of an invalid instance, a naive implementation of MonadUnliftIO (StateT s m) might be

withRunInIO inner =
  StateT $ \s ->
    withRunInIO $ \run ->
      inner (run . flip evalStateT s)

This breaks the identity law because the inner run m would throw away any state changes in m .

Since: 0.1.0.0

Methods

withRunInIO :: (( forall a. m a -> IO a) -> IO b) -> m b Source #

Convenience function for capturing the monadic context and running an IO action with a runner function. The runner function is used to run a monadic action m in IO .

Since: 0.1.0.0

Instances

Instances details
MonadUnliftIO IO Source #
Instance details

Defined in Control.Monad.IO.Unlift

Methods

withRunInIO :: (( forall a. IO a -> IO a) -> IO b) -> IO b Source #

MonadUnliftIO m => MonadUnliftIO ( ReaderT r m) Source #
Instance details

Defined in Control.Monad.IO.Unlift

Methods

withRunInIO :: (( forall a. ReaderT r m a -> IO a) -> IO b) -> ReaderT r m b Source #

MonadUnliftIO m => MonadUnliftIO ( IdentityT m) Source #
Instance details

Defined in Control.Monad.IO.Unlift

Methods

withRunInIO :: (( forall a. IdentityT m a -> IO a) -> IO b) -> IdentityT m b Source #

newtype UnliftIO m Source #

The ability to run any monadic action m a as IO a .

This is more precisely a natural transformation. We need to new datatype (instead of simply using a forall ) due to lack of support in GHC for impredicative types.

Since: 0.1.0.0

Constructors

UnliftIO

Fields

askUnliftIO :: MonadUnliftIO m => m ( UnliftIO m) Source #

Capture the current monadic context, providing the ability to run monadic actions in IO .

See UnliftIO for an explanation of why we need a helper datatype here.

Prior to version 0.2.0.0 of this library, this was a method in the MonadUnliftIO type class. It was moved out due to https://github.com/fpco/unliftio/issues/55 .

Since: 0.1.0.0

askRunInIO :: MonadUnliftIO m => m (m a -> IO a) Source #

Same as askUnliftIO , but returns a monomorphic function instead of a polymorphic newtype wrapper. If you only need to apply the transformation on one concrete type, this function can be more convenient.

Since: 0.1.0.0

withUnliftIO :: MonadUnliftIO m => ( UnliftIO m -> IO a) -> m a Source #

Convenience function for capturing the monadic context and running an IO action. The UnliftIO newtype wrapper is rarely needed, so prefer withRunInIO to this function.

Since: 0.1.0.0

toIO :: MonadUnliftIO m => m a -> m ( IO a) Source #

Convert an action in m to an action in IO .

Since: 0.1.0.0

wrappedWithRunInIO Source #

Arguments

:: MonadUnliftIO n
=> (n b -> m b)

The wrapper, for instance IdentityT .

-> ( forall a. m a -> n a)

The inverse, for instance runIdentityT .

-> (( forall a. m a -> IO a) -> IO b)

The actual function to invoke withRunInIO with.

-> m b

A helper function for implementing MonadUnliftIO instances. Useful for the common case where you want to simply delegate to the underlying transformer.

Note: You can derive MonadUnliftIO for newtypes without this helper function in unliftio-core 0.2.0.0 and later.

Example

Expand
newtype AppT m a = AppT { unAppT :: ReaderT Int (ResourceT m) a }
  deriving (Functor, Applicative, Monad, MonadIO)

-- Same as `deriving newtype (MonadUnliftIO)`
instance MonadUnliftIO m => MonadUnliftIO (AppT m) where
  withRunInIO = wrappedWithRunInIO AppT unAppT

Since: 0.1.2.0

liftIOOp :: MonadUnliftIO m => ( IO a -> IO b) -> m a -> m b Source #

A helper function for lifting IO a -> IO b functions into any MonadUnliftIO .

Example

Expand
liftedTry :: (Exception e, MonadUnliftIO m) => m a -> m (Either e a)
liftedTry m = liftIOOp Control.Exception.try m

Since: 0.2.1.0

class Monad m => MonadIO (m :: Type -> Type ) where Source #

Monads in which IO computations may be embedded. Any monad built by applying a sequence of monad transformers to the IO monad will be an instance of this class.

Instances should satisfy the following laws, which state that liftIO is a transformer of monads:

Methods

liftIO :: IO a -> m a Source #

Lift a computation from the IO monad.

Instances

Instances details
MonadIO IO

Since: base-4.9.0.0

Instance details

Defined in Control.Monad.IO.Class

MonadIO m => MonadIO ( ReaderT r m)
Instance details

Defined in Control.Monad.Trans.Reader

MonadIO m => MonadIO ( IdentityT m)
Instance details

Defined in Control.Monad.Trans.Identity