#ifdef MTL
#endif
module Control.Effect.Lift (
EffectLift, Lift (..), runLift, lift, liftEffect
) where
import Control.Monad.Effect
import Control.Monad (join, liftM)
#ifdef MTL
import Control.Monad.Trans (MonadIO (..))
instance EffectLift IO l => MonadIO (Effect l) where
liftIO = lift
#endif
newtype Lift m a = Lift { unLift :: m a }
instance Monad m => Functor (Lift m) where
fmap f = Lift . liftM f . unLift
type instance Is Lift f = IsLift f
type family IsLift f where
IsLift (Lift m) = True
IsLift f = False
class (Monad m, MemberEffect Lift (Lift m) l) => EffectLift m l
instance (Monad m, MemberEffect Lift (Lift m) l) => EffectLift m l
lift :: EffectLift m l => m a -> Effect l a
lift = send . Lift
liftEffect :: EffectLift m l => m (Effect l a) -> Effect l a
liftEffect = sendEffect . Lift
runLift :: Monad m => Effect (Lift m :+ Nil) a -> m a
runLift = runEffect . eliminate
(return . return)
(return . join . liftM runEffect . unLift)