{-# LANGUAGE ExistentialQuantification, RankNTypes #-}
module Control.Effect.Lift.Internal
( Lift(..)
) where
import Control.Effect.Class
import Data.Functor.Compose
data Lift sig m k
= forall a . LiftWith
(forall ctx . Functor ctx => ctx () -> (forall a . ctx (m a) -> sig (ctx a)) -> sig (ctx a))
(a -> m k)
instance Functor m => Functor (Lift sig m) where
fmap f (LiftWith with k) = LiftWith with (fmap f . k)
instance HFunctor (Lift sig) where
hmap f (LiftWith go k) = LiftWith (\c lift -> go c (lift . fmap f)) (f . k)
instance Functor sig => Effect (Lift sig) where
thread ctx dst (LiftWith with k) = LiftWith
(\ ctx' dst' -> getCompose <$> with (Compose (ctx <$ ctx')) (fmap Compose . dst' . fmap dst . getCompose))
(dst . fmap k)