lio-0.1.2: LIO/MonadLIO.hs
{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Trustworthy #-}
#endif
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverlappingInstances #-}
-- | This module provides a function 'liftLIO' for executing 'LIO'
-- computations from transformed versions of the 'LIO' monad.
-- There is also a method 'liftIO', which is a synonym for 'liftLIO',
-- to help with porting code that expects to run in the @IO@ monad.
module LIO.MonadLIO (MonadLIO(..)) where
import LIO.TCB (LIO, LabelState)
import Control.Monad.Trans (MonadTrans(..))
-- | MonadIO-like class.
class (Monad m, LabelState l p s) => MonadLIO m l p s | m -> l p s where
liftLIO :: LIO l p s a -> m a
liftIO :: LIO l p s a -> m a
liftIO = liftLIO
instance (LabelState l p s) => MonadLIO (LIO l p s) l p s where
liftLIO = id
instance (MonadLIO m l p s, MonadTrans t, Monad (t m))
=> MonadLIO (t m) l p s where
liftLIO = lift . liftLIO