{-# LANGUAGE CPP #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE Rank2Types #-} -- | Functor of Functors module Data.FFunctor where #ifdef HAVE_TRANSFORMERS import Control.Monad.Trans.Class (MonadTrans, lift) #endif import Control.Monad.IO.Class (MonadIO, liftIO) class FFunctor (f :: (* -> *) -> *) where --ffmap :: (Functor m, Functor n) => (m ~> n) -> f m -> f n ffmap :: (Functor m, Functor n) => (forall a . (m a -> n a)) -> f m -> f n -- | Lifts an IO impl of a record of functions into a more general MonadIO impl luftIO :: FFunctor f => MonadIO m => f IO -> f m luftIO = ffmap liftIO #ifdef HAVE_TRANSFORMERS -- | Lifts a record of functions (that has an FFunctor) into a monad transformer. -- -- e.g. `luft logger` lifts a `Logger m` into a `Logger (ReaderT m Foo)` luft :: FFunctor f => Monad m => MonadTrans t => Functor (t m) => f m -> f (t m) luft = ffmap lift #endif