module Control.Eff.Lift( Lift
, lift
, runLift
) where
import Control.Eff
import Data.Typeable
data Lift m v = forall a. Lift (m a) (a -> v)
instance Typeable1 m => Typeable1 (Lift m) where
typeOf1 _ = mkTyConApp (mkTyCon3 "" "Eff" "Lift")
[typeOf1 (undefined :: m ())]
instance Functor (Lift m) where
fmap f (Lift m k) = Lift m (f . k)
instance SetMember Lift (Lift m) (Lift m :> ())
lift :: (Typeable1 m, Member (Lift m) r, SetMember Lift (Lift m) r) => m a -> Eff r a
lift m = send (inj . Lift m)
runLift :: (Monad m, Typeable1 m) => Eff (Lift m :> ()) w -> m w
runLift m = loop (admin m) where
loop (Val x) = return x
loop (E u) = prjForce u $ \(Lift m' k) -> m' >>= loop . k