comonad-coactions-0.1.0.1: src/Control/Comonad/TransformerStack.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-|
Module : Control.Comonad.TransformerStack
Description : stacks of comonad transformers
Copyright : © noiioiu
License : LGPL-2
Maintainer : noiioiu@cocaine.ninja
Stability : experimental
-}
module Control.Comonad.TransformerStack (ComonadTransStack (..)) where
import Control.Comonad.Coaction.TH
import Control.Comonad.Trans.Cofree ()
import Control.Comonad.Trans.Env ()
import Control.Comonad.Trans.Identity ()
import Control.Comonad.Trans.Store ()
import Control.Comonad.Trans.Traced ()
$mkLowerBy
{-| All @'ComonadTransStack'@ instances are defined inductively using @'Control.Comonad.Trans.Class.ComonadTrans'@ instances.
No laws are given in the documentation for @'Control.Comonad.Trans.Class.ComonadTrans'@,
but all instances should satisfy the following laws, dual to the laws for
@'Control.Monad.Trans.Class.MonadTrans'@, which state that @'Control.Comonad.Trans.Class.lower'@ is a comonad homomorphism:
* @'Control.Comonad.extract' '.' 'Control.Comonad.Trans.Class.lower' = 'Control.Comonad.extract'@
* @'Control.Comonad.duplicate' '.' 'Control.Comonad.Trans.Class.lower' = 'Control.Comonad.Trans.Class.lower' '.' 'fmap' 'Control.Comonad.Trans.Class.lower' . 'Control.Comonad.duplicate'@
It follows by induction that @'lowerStack'@ is a comonad homomorphism.
The proofs of the comodule laws may be obtained by looking at the corresponding
proofs of the module laws in a mirror.
-}
class (LowerBy (Steps w q) w q) => ComonadTransStack w q where
lowerStack :: forall a. q a -> w a
instance (LowerBy (Steps w q) w q) => ComonadTransStack w q where
lowerStack = lowerBy @(Steps w q)