-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Comonad transformers
--   
--   Comonad transformers
@package comonad-transformers
@version 3.0.1


module Data.Functor.Coproduct
newtype Coproduct f g a
Coproduct :: Either (f a) (g a) -> Coproduct f g a
getCoproduct :: Coproduct f g a -> Either (f a) (g a)
left :: f a -> Coproduct f g a
right :: g a -> Coproduct f g a
coproduct :: (f a -> b) -> (g a -> b) -> Coproduct f g a -> b
instance (Contravariant f, Contravariant g) => Contravariant (Coproduct f g)
instance (Comonad f, Comonad g) => Comonad (Coproduct f g)
instance (Extend f, Extend g) => Extend (Coproduct f g)
instance (Traversable1 f, Traversable1 g) => Traversable1 (Coproduct f g)
instance (Traversable f, Traversable g) => Traversable (Coproduct f g)
instance (Foldable1 f, Foldable1 g) => Foldable1 (Coproduct f g)
instance (Foldable f, Foldable g) => Foldable (Coproduct f g)
instance (Functor f, Functor g) => Functor (Coproduct f g)


module Control.Comonad.Hoist.Class
class ComonadHoist t
cohoist :: (ComonadHoist t, Comonad w) => t w a -> t Identity a
instance ComonadHoist IdentityT


module Control.Comonad.Trans.Class
class ComonadTrans t
lower :: (ComonadTrans t, Comonad w) => t w a -> w a
instance ComonadTrans IdentityT


-- | The environment comonad transformer (aka coreader). This adds an extra
--   value that can be accessed in the environment.
--   
--   Left adjoint to the reader comonad.
module Control.Comonad.Trans.Env
type Env e = EnvT e Identity
env :: e -> a -> Env e a
runEnv :: Env e a -> (e, a)
data EnvT e w a
EnvT :: e -> (w a) -> EnvT e w a
runEnvT :: EnvT e w a -> (e, w a)
lowerEnvT :: EnvT e w a -> w a
ask :: EnvT e w a -> e
asks :: (e -> f) -> EnvT e w a -> f
local :: (e -> e) -> EnvT e w a -> EnvT e w a
instance Traversable w => Traversable (EnvT e w)
instance Foldable w => Foldable (EnvT e w)
instance (Semigroup e, ComonadApply w) => ComonadApply (EnvT e w)
instance (Semigroup e, Apply w) => Apply (EnvT e w)
instance ComonadHoist (EnvT e)
instance ComonadTrans (EnvT e)
instance Comonad w => Comonad (EnvT e w)
instance Extend w => Extend (EnvT e w)
instance Functor w => Functor (EnvT e w)
instance (Data e, Typeable1 w, Data (w a), Data a) => Data (EnvT e w a)
instance (Typeable s, Typeable1 w, Typeable a) => Typeable (EnvT s w a)
instance (Typeable s, Typeable1 w) => Typeable1 (EnvT s w)


-- | The strict store (state-in-context/costate) comonad transformer is
--   subject to the laws:
--   
--   <pre>
--   x = seek (pos x) x
--   y = pos (seek y x)
--   seek y x = seek y (seek z x)
--   </pre>
--   
--   Thanks go to Russell O'Connor and Daniel Peebles for their help
--   formulating and proving the laws for this comonad transformer.
module Control.Comonad.Trans.Store
type Store s = StoreT s Identity
store :: (s -> a) -> s -> Store s a
runStore :: Store s a -> (s -> a, s)
data StoreT s w a
StoreT :: (w (s -> a)) -> s -> StoreT s w a
runStoreT :: StoreT s w a -> (w (s -> a), s)

-- | Read the current position
pos :: StoreT s w a -> s

-- | Seek to an absolute location
--   
--   <pre>
--   seek s = peek s . duplicate
--   </pre>
seek :: Comonad w => s -> StoreT s w a -> StoreT s w a

-- | Seek to a relative location
--   
--   <pre>
--   seeks f = peeks f . duplicate
--   </pre>
seeks :: Comonad w => (s -> s) -> StoreT s w a -> StoreT s w a

-- | Peek at a value at a given absolute location
--   
--   <pre>
--   peek x . extend (peek y) = peek y
--   </pre>
peek :: Comonad w => s -> StoreT s w a -> a

-- | Peek at a value at a given relative location
peeks :: Comonad w => (s -> s) -> StoreT s w a -> a
experiment :: (Comonad w, Functor f) => (s -> f s) -> StoreT s w a -> f a
instance ComonadHoist (StoreT s)
instance ComonadTrans (StoreT s)
instance Comonad w => Comonad (StoreT s w)
instance Extend w => Extend (StoreT s w)
instance (Applicative w, Monoid s) => Applicative (StoreT s w)
instance (ComonadApply w, Semigroup s) => ComonadApply (StoreT s w)
instance (Apply w, Semigroup s) => Apply (StoreT s w)
instance Functor w => Functor (StoreT s w)
instance (Typeable s, Typeable1 w, Typeable a) => Typeable (StoreT s w a)
instance (Typeable s, Typeable1 w) => Typeable1 (StoreT s w)


-- | The trace comonad transformer (aka the cowriter or exponential comonad
--   transformer).
module Control.Comonad.Trans.Traced
type Traced m = TracedT m Identity
traced :: (m -> a) -> Traced m a
runTraced :: Traced m a -> m -> a
newtype TracedT m w a
TracedT :: w (m -> a) -> TracedT m w a
runTracedT :: TracedT m w a -> w (m -> a)
trace :: Comonad w => m -> TracedT m w a -> a
listen :: Functor w => TracedT m w a -> TracedT m w (a, m)
listens :: Functor w => (m -> b) -> TracedT m w a -> TracedT m w (a, b)
censor :: Functor w => (m -> m) -> TracedT m w a -> TracedT m w a
instance (Typeable s, Typeable1 w) => Typeable1 (TracedT s w)
instance Distributive w => Distributive (TracedT m w)
instance Monoid m => ComonadHoist (TracedT m)
instance Monoid m => ComonadTrans (TracedT m)
instance (Comonad w, Monoid m) => Comonad (TracedT m w)
instance (Extend w, Semigroup m) => Extend (TracedT m w)
instance Applicative w => Applicative (TracedT m w)
instance (ComonadApply w, Monoid m) => ComonadApply (TracedT m w)
instance Apply w => Apply (TracedT m w)
instance Functor w => Functor (TracedT m w)

module Data.Functor.Composition

-- | We often need to distinguish between various forms of Functor-like
--   composition in Haskell in order to please the type system. This lets
--   us work with these representations uniformly.
class Composition o
decompose :: Composition o => o f g x -> f (g x)
compose :: Composition o => f (g x) -> o f g x
instance Composition Compose


module Control.Comonad.Trans.Identity

-- | The trivial monad transformer, which maps a monad to an equivalent
--   monad.
newtype IdentityT (m :: * -> *) a :: (* -> *) -> * -> *
IdentityT :: m a -> IdentityT a
runIdentityT :: IdentityT a -> m a
