#ifdef MTL
#endif
module Control.Effect.Lift (
EffectLift, Lift (..), runLift, lift, liftEffect
) where
import Control.Monad.Effect
#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 }
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)
(\(Lift m) k -> return $ m >>= runEffect . k)