{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE KindSignatures #-}
module Control.Monad.Trans.Has where
import "transformers" Control.Monad.Trans.Class
class Has (t :: (* -> *) -> * -> *) m where
liftH :: (forall n . Monad n => t n a) -> m a
instance Monad m => Has t (t m) where
liftH :: (forall (n :: * -> *). Monad n => t n a) -> t m a
liftH forall (n :: * -> *). Monad n => t n a
action = t m a
forall (n :: * -> *). Monad n => t n a
action
{-# INLINE liftH #-}
instance {-# Overlappable #-} (Monad m, MonadTrans t1, Has t m) => Has t (t1 m) where
liftH :: (forall (n :: * -> *). Monad n => t n a) -> t1 m a
liftH forall (n :: * -> *). Monad n => t n a
action = m a -> t1 m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> t1 m a) -> m a -> t1 m a
forall a b. (a -> b) -> a -> b
$ (forall (n :: * -> *). Monad n => t n a) -> m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Has t m =>
(forall (n :: * -> *). Monad n => t n a) -> m a
liftH forall (n :: * -> *). Monad n => t n a
action
{-# INLINE liftH #-}