----------------------------------------------------------------------------- -- | -- Module : Control.Comonad.Hoist.Class -- Copyright : (C) 2008-2011 Edward Kmett -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett -- Stability : provisional -- Portability : portable ---------------------------------------------------------------------------- module Control.Comonad.Hoist.Class (ComonadHoist(..)) where import Control.Comonad import Control.Monad.Trans.Identity import Data.Functor.Identity class ComonadHoist t where -- | Ideally we would offer a way to lift comonad homomorphisms -- but this isn't Haskell 98, so we settle for the most common case -- here. -- -- > liftTrans :: (forall a. w a -> v a) -> t w a -> t v a -- > cohoist = liftTrans (Identity . extract) cohoist :: Comonad w => t w a -> t Identity a -- avoiding orphans instance ComonadHoist IdentityT where cohoist = IdentityT . Identity . extract . runIdentityT