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


-- | Semigroupoids that depend on PolyKinds
--   
--   Semigroupoids that depend on PolyKinds
@package semigroupoid-extras
@version 5


module Data.Profunctor.Collage

-- | The cograph of a <a>Profunctor</a>.
data Collage k b a
[L] :: (b -> b') -> Collage k (Left b) (Left b')
[R] :: (a -> a') -> Collage k (Right a) (Right a')
[C] :: k b a -> Collage k (Left b) (Right a)
instance Data.Profunctor.Unsafe.Profunctor k => Data.Semigroupoid.Semigroupoid (Data.Profunctor.Collage.Collage k)
instance Data.Profunctor.Unsafe.Profunctor k => Data.Semigroupoid.Ob.Ob (Data.Profunctor.Collage.Collage k) ('Data.Either.Left a)
instance Data.Profunctor.Unsafe.Profunctor k => Data.Semigroupoid.Ob.Ob (Data.Profunctor.Collage.Collage k) ('Data.Either.Right a)


module Data.Semigroupoid.Coproduct
data Coproduct j k a b
[L] :: j a b -> Coproduct j k (Left a) (Left b)
[R] :: k a b -> Coproduct j k (Right a) (Right b)
distributeDualCoproduct :: Dual (Coproduct j k) a b -> Coproduct (Dual j) (Dual k) a b
factorDualCoproduct :: Coproduct (Dual j) (Dual k) a b -> Dual (Coproduct j k) a b
instance forall b a (j :: a -> a -> *) (k :: b -> b -> *). (Data.Semigroupoid.Semigroupoid j, Data.Semigroupoid.Semigroupoid k) => Data.Semigroupoid.Semigroupoid (Data.Semigroupoid.Coproduct.Coproduct j k)
instance forall b a (j :: a -> a -> *) (k :: b -> b -> *). (Data.Groupoid.Groupoid j, Data.Groupoid.Groupoid k) => Data.Groupoid.Groupoid (Data.Semigroupoid.Coproduct.Coproduct j k)
instance forall b a1 (l :: a1 -> a1 -> *) (a2 :: a1) (r :: b -> b -> *). (Data.Semigroupoid.Ob.Ob l a2, Data.Semigroupoid.Semigroupoid r) => Data.Semigroupoid.Ob.Ob (Data.Semigroupoid.Coproduct.Coproduct l r) ('Data.Either.Left a2)
instance forall b a1 (l :: a1 -> a1 -> *) (r :: b -> b -> *) (a2 :: b). (Data.Semigroupoid.Semigroupoid l, Data.Semigroupoid.Ob.Ob r a2) => Data.Semigroupoid.Ob.Ob (Data.Semigroupoid.Coproduct.Coproduct l r) ('Data.Either.Right a2)


module Data.Semigroupoid.Product
data Product j k a b
[Pair] :: j a b -> k a' b' -> Product j k '(a, a') '(b, b')
distributeDualProduct :: Dual (Product j k) a b -> Product (Dual j) (Dual k) a b
factorDualProduct :: Product (Dual j) (Dual k) a b -> Dual (Product j k) a b
instance forall k1 k2 (j :: k2 -> k2 -> *) (k3 :: k1 -> k1 -> *). (Data.Semigroupoid.Semigroupoid j, Data.Semigroupoid.Semigroupoid k3) => Data.Semigroupoid.Semigroupoid (Data.Semigroupoid.Product.Product j k3)
instance forall k1 k2 (j :: k2 -> k2 -> *) (k3 :: k1 -> k1 -> *). (Data.Groupoid.Groupoid j, Data.Groupoid.Groupoid k3) => Data.Groupoid.Groupoid (Data.Semigroupoid.Product.Product j k3)
instance forall k1 k2 (l :: k2 -> k2 -> *) (a :: k2) (r :: k1 -> k1 -> *) (b :: k1). (Data.Semigroupoid.Ob.Ob l a, Data.Semigroupoid.Ob.Ob r b) => Data.Semigroupoid.Ob.Ob (Data.Semigroupoid.Product.Product l r) '(a, b)


module Data.Semifunctor

-- | Semifunctors map objects to objects, and arrows to arrows preserving
--   connectivity as normal functors, but do not purport to preserve
--   identity arrows. We apply them to semigroupoids, because those don't
--   even claim to offer identity arrows!
class (Semigroupoid c, Semigroupoid d) => Semifunctor f c d | f c -> d, f d -> c
semimap :: Semifunctor f c d => c a b -> d (f a) (f b)

-- | Used to map a more traditional bifunctor into a semifunctor
data Bi p a
[Bi] :: p a b -> Bi p '(a, b)
(#) :: a -> b -> Bi (,) '(a, b)
semibimap :: Semifunctor p (Product l r) cod => l a b -> r c d -> cod (p '(a, c)) (p '(b, d))
semifirst :: (Semifunctor p (Product l r) cod, Ob r c) => l a b -> cod (p '(a, c)) (p '(b, c))
semisecond :: (Semifunctor p (Product l r) cod, Ob l a) => r b c -> cod (p '(a, b)) (p '(a, c))
first :: (Semifunctor p (Product l r) cod, Category r) => l a b -> cod (p '(a, c)) (p '(b, c))
second :: (Semifunctor p (Product l r) cod, Category l) => r b c -> cod (p '(a, b)) (p '(a, c))
data WrappedFunctor f a
WrapFunctor :: f a -> WrappedFunctor f a
[unwrapFunctor] :: WrappedFunctor f a -> f a
data WrappedTraversable1 f a
WrapTraversable1 :: f a -> WrappedTraversable1 f a
[unwrapTraversable1] :: WrappedTraversable1 f a -> f a
instance Data.Semifunctor.Semifunctor (Data.Semifunctor.Bi (,)) (Data.Semigroupoid.Product.Product (->) (->)) (->)
instance Data.Semifunctor.Semifunctor (Data.Semifunctor.Bi Data.Either.Either) (Data.Semigroupoid.Product.Product (->) (->)) (->)
instance Data.Functor.Bind.Class.Bind m => Data.Semifunctor.Semifunctor (Data.Semifunctor.Bi (,)) (Data.Semigroupoid.Product.Product (Control.Arrow.Kleisli m) (Control.Arrow.Kleisli m)) (Control.Arrow.Kleisli m)
instance Data.Functor.Bind.Class.Bind m => Data.Semifunctor.Semifunctor (Data.Semifunctor.Bi Data.Either.Either) (Data.Semigroupoid.Product.Product (Control.Arrow.Kleisli m) (Control.Arrow.Kleisli m)) (Control.Arrow.Kleisli m)
instance (Data.Semigroup.Traversable.Class.Traversable1 f, Data.Functor.Bind.Class.Bind m) => Data.Semifunctor.Semifunctor (Data.Semifunctor.WrappedTraversable1 f) (Control.Arrow.Kleisli m) (Control.Arrow.Kleisli m)
instance GHC.Base.Functor f => Data.Semifunctor.Semifunctor (Data.Semifunctor.WrappedFunctor f) (->) (->)
instance (Data.Traversable.Traversable f, Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Semifunctor (Data.Semifunctor.WrappedFunctor f) (Control.Arrow.Kleisli m) (Control.Arrow.Kleisli m)
instance forall k1 k2 (f :: k1 -> k2) (c :: k1 -> k1 -> *) (d :: k2 -> k2 -> *). Data.Semifunctor.Semifunctor f c d => Data.Semifunctor.Semifunctor f (Data.Semigroupoid.Dual.Dual c) (Data.Semigroupoid.Dual.Dual d)


module Data.Semifunctor.Associative
class Semifunctor p (Product k k) k => Associative k p
associate :: Associative k p => k (p '(p '(a, b), c)) (p '(a, p '(b, c)))
kleisliAssociate :: (Monad m, Semifunctor p (Product (Kleisli m) (Kleisli m)) (Kleisli m), Associative (->) p) => Kleisli m (p '(p '(a, b), c)) (p '(a, p '(b, c)))
class Semifunctor p (Product k k) k => Disassociative k p
disassociate :: Disassociative k p => k (p '(a, p '(b, c))) (p '(p '(a, b), c))
kleisliDisassociate :: (Monad m, Semifunctor p (Product (Kleisli m) (Kleisli m)) (Kleisli m), Disassociative (->) p) => Kleisli m (p '(a, p '(b, c))) (p '(p '(a, b), c))
instance Data.Semifunctor.Associative.Disassociative (->) (Data.Semifunctor.Bi Data.Either.Either)
instance Data.Semifunctor.Associative.Disassociative (->) (Data.Semifunctor.Bi (,))
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Associative.Disassociative (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi Data.Either.Either)
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Associative.Disassociative (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi (,))
instance Data.Semifunctor.Associative.Associative (->) (Data.Semifunctor.Bi Data.Either.Either)
instance Data.Semifunctor.Associative.Associative (->) (Data.Semifunctor.Bi (,))
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Associative.Associative (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi Data.Either.Either)
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Associative.Associative (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi (,))


module Data.Semifunctor.Braided
class Associative k p => Braided k p
braid :: Braided k p => k (p '(a, b)) (p '(b, a))
kleisliBraid :: (Monad m, Semifunctor p (Product (Kleisli m) (Kleisli m)) (Kleisli m), Braided (->) p) => Kleisli m (p '(a, b)) (p '(b, a))
class Braided k p => Symmetric k p
swap :: Symmetric k p => k (p '(a, b)) (p '(b, a))
instance Data.Semifunctor.Braided.Symmetric (->) (Data.Semifunctor.Bi Data.Either.Either)
instance Data.Semifunctor.Braided.Symmetric (->) (Data.Semifunctor.Bi (,))
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Braided.Symmetric (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi Data.Either.Either)
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Braided.Symmetric (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi (,))
instance Data.Semifunctor.Braided.Braided (->) (Data.Semifunctor.Bi Data.Either.Either)
instance Data.Semifunctor.Braided.Braided (->) (Data.Semifunctor.Bi (,))
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Braided.Braided (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi Data.Either.Either)
instance (Data.Functor.Bind.Class.Bind m, GHC.Base.Monad m) => Data.Semifunctor.Braided.Braided (Control.Arrow.Kleisli m) (Data.Semifunctor.Bi (,))
