{-# LANGUAGE TupleSections #-} module Data.Bifunctor.Monoidal.Specialized where import Prelude hiding ((&&), (||)) import Control.Category.Tensor import Data.Bifunctor.Monoidal import Data.Functor.Contravariant import Data.Profunctor import Data.Void mux :: Semigroupal (->) (,) (,) (,) p => p a b -> p c d -> p (a, c) (b, d) mux :: p a b -> p c d -> p (a, c) (b, d) mux = ((p a b, p c d) -> p (a, c) (b, d)) -> p a b -> p c d -> p (a, c) (b, d) forall a b c. ((a, b) -> c) -> a -> b -> c curry (p a b, p c d) -> p (a, c) (b, d) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine infixr 5 && (&&) :: Semigroupal (->) (,) (,) (,) p => p a b -> p c d -> p (a, c) (b, d) && :: p a b -> p c d -> p (a, c) (b, d) (&&) = p a b -> p c d -> p (a, c) (b, d) forall (p :: * -> * -> *) a b c d. Semigroupal (->) (,) (,) (,) p => p a b -> p c d -> p (a, c) (b, d) mux zip :: (Profunctor p, Semigroupal (->) (,) (,) (,) p) => p x a -> p x b -> p x (a, b) zip :: p x a -> p x b -> p x (a, b) zip p x a pxa p x b pxb = (x -> (x, x)) -> p (x, x) (a, b) -> p x (a, b) forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap x -> (x, x) forall a. a -> (a, a) dup (p (x, x) (a, b) -> p x (a, b)) -> p (x, x) (a, b) -> p x (a, b) forall a b. (a -> b) -> a -> b $ p x a pxa p x a -> p x b -> p (x, x) (a, b) forall (p :: * -> * -> *) a b c d. Semigroupal (->) (,) (,) (,) p => p a b -> p c d -> p (a, c) (b, d) && p x b pxb demux :: Semigroupal (->) Either Either (,) p => p a b -> p c d -> p (Either a c) (Either b d) demux :: p a b -> p c d -> p (Either a c) (Either b d) demux = ((p a b, p c d) -> p (Either a c) (Either b d)) -> p a b -> p c d -> p (Either a c) (Either b d) forall a b c. ((a, b) -> c) -> a -> b -> c curry (p a b, p c d) -> p (Either a c) (Either b d) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine infixr 4 || (||) :: Semigroupal (->) Either Either (,) p => p a b -> p c d -> p (Either a c) (Either b d) || :: p a b -> p c d -> p (Either a c) (Either b d) (||) = p a b -> p c d -> p (Either a c) (Either b d) forall (p :: * -> * -> *) a b c d. Semigroupal (->) Either Either (,) p => p a b -> p c d -> p (Either a c) (Either b d) demux fanin :: (Profunctor p, Semigroupal (->) Either Either (,) p) => p a x -> p b x -> p (Either a b) x fanin :: p a x -> p b x -> p (Either a b) x fanin p a x pax p b x pbx = (Either x x -> x) -> p (Either a b) (Either x x) -> p (Either a b) x forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap Either x x -> x forall a. Either a a -> a merge (p (Either a b) (Either x x) -> p (Either a b) x) -> p (Either a b) (Either x x) -> p (Either a b) x forall a b. (a -> b) -> a -> b $ p a x pax p a x -> p b x -> p (Either a b) (Either x x) forall (p :: * -> * -> *) a b c d. Semigroupal (->) Either Either (,) p => p a b -> p c d -> p (Either a c) (Either b d) || p b x pbx switch :: Semigroupal (->) (,) Either (,) p => p a b -> p c d -> p (a, c) (Either b d) switch :: p a b -> p c d -> p (a, c) (Either b d) switch = ((p a b, p c d) -> p (a, c) (Either b d)) -> p a b -> p c d -> p (a, c) (Either b d) forall a b c. ((a, b) -> c) -> a -> b -> c curry (p a b, p c d) -> p (a, c) (Either b d) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine infixr 5 &| (&|) :: Semigroupal (->) (,) Either (,) p => p a b -> p c d -> p (a, c) (Either b d) &| :: p a b -> p c d -> p (a, c) (Either b d) (&|) = p a b -> p c d -> p (a, c) (Either b d) forall (p :: * -> * -> *) a b c d. Semigroupal (->) (,) Either (,) p => p a b -> p c d -> p (a, c) (Either b d) switch union :: Profunctor p => Semigroupal (->) (,) Either (,) p => p x a -> p x b -> p x (Either a b) union :: p x a -> p x b -> p x (Either a b) union p x a pxa p x b pxb = (x -> (x, x)) -> p (x, x) (Either a b) -> p x (Either a b) forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap x -> (x, x) forall a. a -> (a, a) dup (p (x, x) (Either a b) -> p x (Either a b)) -> p (x, x) (Either a b) -> p x (Either a b) forall a b. (a -> b) -> a -> b $ p x a pxa p x a -> p x b -> p (x, x) (Either a b) forall (p :: * -> * -> *) a b c d. Semigroupal (->) (,) Either (,) p => p a b -> p c d -> p (a, c) (Either b d) &| p x b pxb divide :: (Profunctor p, Semigroupal (->) (,) Either (,) p) => p a x -> p b x -> p (a, b) x divide :: p a x -> p b x -> p (a, b) x divide p a x pxa p b x pxb = (Either x x -> x) -> p (a, b) (Either x x) -> p (a, b) x forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap Either x x -> x forall a. Either a a -> a merge (p (a, b) (Either x x) -> p (a, b) x) -> p (a, b) (Either x x) -> p (a, b) x forall a b. (a -> b) -> a -> b $ p a x pxa p a x -> p b x -> p (a, b) (Either x x) forall (p :: * -> * -> *) a b c d. Semigroupal (->) (,) Either (,) p => p a b -> p c d -> p (a, c) (Either b d) &| p b x pxb splice :: Semigroupal (->) Either (,) (,) p => p a b -> p c d -> p (Either a c) (b, d) splice :: p a b -> p c d -> p (Either a c) (b, d) splice = ((p a b, p c d) -> p (Either a c) (b, d)) -> p a b -> p c d -> p (Either a c) (b, d) forall a b c. ((a, b) -> c) -> a -> b -> c curry (p a b, p c d) -> p (Either a c) (b, d) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine infix 5 |& (|&) :: Semigroupal (->) Either (,) (,) p => p a b -> p c d -> p (Either a c) (b, d) |& :: p a b -> p c d -> p (Either a c) (b, d) (|&) = p a b -> p c d -> p (Either a c) (b, d) forall (p :: * -> * -> *) a b c d. Semigroupal (->) Either (,) (,) p => p a b -> p c d -> p (Either a c) (b, d) splice diverge :: Semigroupal (->) Either Either Either p => Either (p a b) (p c d) -> p (Either a c) (Either b d) diverge :: Either (p a b) (p c d) -> p (Either a c) (Either b d) diverge = Either (p a b) (p c d) -> p (Either a c) (Either b d) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine contramapMaybe :: Profunctor p => Semigroupal (->) Either Either Either p => (a -> Maybe b) -> p b x -> p a x contramapMaybe :: (a -> Maybe b) -> p b x -> p a x contramapMaybe a -> Maybe b f = (a -> Either b ()) -> (Either x x -> x) -> p (Either b ()) (Either x x) -> p a x forall (p :: * -> * -> *) a b c d. Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d dimap (Either b () -> (b -> Either b ()) -> Maybe b -> Either b () forall b a. b -> (a -> b) -> Maybe a -> b maybe (() -> Either b () forall a b. b -> Either a b Right ()) b -> Either b () forall a b. a -> Either a b Left (Maybe b -> Either b ()) -> (a -> Maybe b) -> a -> Either b () forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> Maybe b f) Either x x -> x forall a. Either a a -> a merge (p (Either b ()) (Either x x) -> p a x) -> (p b x -> p (Either b ()) (Either x x)) -> p b x -> p a x forall b c a. (b -> c) -> (a -> b) -> a -> c . p b x -> p (Either b ()) (Either x x) forall (p :: * -> * -> *) a b x y. (Profunctor p, Semigroupal (->) Either Either Either p) => p a b -> p (Either a x) (Either b y) ultraleft zig :: (Profunctor p, Semigroupal (->) (,) t Either p) => Either (p x a) (p x b) -> p x (t a b) zig :: Either (p x a) (p x b) -> p x (t a b) zig = (x -> (x, x)) -> p (x, x) (t a b) -> p x (t a b) forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap x -> (x, x) forall a. a -> (a, a) dup (p (x, x) (t a b) -> p x (t a b)) -> (Either (p x a) (p x b) -> p (x, x) (t a b)) -> Either (p x a) (p x b) -> p x (t a b) forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p x a) (p x b) -> p (x, x) (t a b) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine zag :: (Profunctor p, Semigroupal (->) t Either Either p) => Either (p a x) (p b x) -> p (t a b) x zag :: Either (p a x) (p b x) -> p (t a b) x zag = (Either x x -> x) -> p (t a b) (Either x x) -> p (t a b) x forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap Either x x -> x forall a. Either a a -> a merge (p (t a b) (Either x x) -> p (t a b) x) -> (Either (p a x) (p b x) -> p (t a b) (Either x x)) -> Either (p a x) (p b x) -> p (t a b) x forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p a x) (p b x) -> p (t a b) (Either x x) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine ultrafirst :: (Profunctor p, Semigroupal (->) (,) (,) Either p) => p a b -> p (a, x) (b, y) ultrafirst :: p a b -> p (a, x) (b, y) ultrafirst = Either (p a (b, y)) (p x (b, y)) -> p (a, x) (b, y) forall (p :: * -> * -> *) (t :: * -> * -> *) a x b. (Profunctor p, Semigroupal (->) t Either Either p) => Either (p a x) (p b x) -> p (t a b) x zag (Either (p a (b, y)) (p x (b, y)) -> p (a, x) (b, y)) -> (p a b -> Either (p a (b, y)) (p x (b, y))) -> p a b -> p (a, x) (b, y) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a (b, y) -> Either (p a (b, y)) (p x (b, y)) forall a b. a -> Either a b Left (p a (b, y) -> Either (p a (b, y)) (p x (b, y))) -> (p a b -> p a (b, y)) -> p a b -> Either (p a (b, y)) (p x (b, y)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p a b) (p a y) -> p a (b, y) forall (p :: * -> * -> *) (t :: * -> * -> *) x a b. (Profunctor p, Semigroupal (->) (,) t Either p) => Either (p x a) (p x b) -> p x (t a b) zig (Either (p a b) (p a y) -> p a (b, y)) -> (p a b -> Either (p a b) (p a y)) -> p a b -> p a (b, y) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a b -> Either (p a b) (p a y) forall a b. a -> Either a b Left ultrasecond :: (Profunctor p, Semigroupal (->) (,) (,) Either p) => p a b -> p (x, a) (y, b) ultrasecond :: p a b -> p (x, a) (y, b) ultrasecond = Either (p x (y, b)) (p a (y, b)) -> p (x, a) (y, b) forall (p :: * -> * -> *) (t :: * -> * -> *) a x b. (Profunctor p, Semigroupal (->) t Either Either p) => Either (p a x) (p b x) -> p (t a b) x zag (Either (p x (y, b)) (p a (y, b)) -> p (x, a) (y, b)) -> (p a b -> Either (p x (y, b)) (p a (y, b))) -> p a b -> p (x, a) (y, b) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a (y, b) -> Either (p x (y, b)) (p a (y, b)) forall a b. b -> Either a b Right (p a (y, b) -> Either (p x (y, b)) (p a (y, b))) -> (p a b -> p a (y, b)) -> p a b -> Either (p x (y, b)) (p a (y, b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p a y) (p a b) -> p a (y, b) forall (p :: * -> * -> *) (t :: * -> * -> *) x a b. (Profunctor p, Semigroupal (->) (,) t Either p) => Either (p x a) (p x b) -> p x (t a b) zig (Either (p a y) (p a b) -> p a (y, b)) -> (p a b -> Either (p a y) (p a b)) -> p a b -> p a (y, b) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a b -> Either (p a y) (p a b) forall a b. b -> Either a b Right ultraleft :: (Profunctor p, Semigroupal (->) Either Either Either p) => p a b -> p (Either a x) (Either b y) ultraleft :: p a b -> p (Either a x) (Either b y) ultraleft = Either (p a (Either b y)) (p x (Either b y)) -> p (Either a x) (Either b y) forall (p :: * -> * -> *) (t :: * -> * -> *) a x b. (Profunctor p, Semigroupal (->) t Either Either p) => Either (p a x) (p b x) -> p (t a b) x zag (Either (p a (Either b y)) (p x (Either b y)) -> p (Either a x) (Either b y)) -> (p a b -> Either (p a (Either b y)) (p x (Either b y))) -> p a b -> p (Either a x) (Either b y) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a (Either b y) -> Either (p a (Either b y)) (p x (Either b y)) forall a b. a -> Either a b Left (p a (Either b y) -> Either (p a (Either b y)) (p x (Either b y))) -> (p a b -> p a (Either b y)) -> p a b -> Either (p a (Either b y)) (p x (Either b y)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p a b) (p a y) -> p a (Either b y) forall (p :: * -> * -> *) (t :: * -> * -> *) x a b. (Profunctor p, Semigroupal (->) (,) t Either p) => Either (p x a) (p x b) -> p x (t a b) zig (Either (p a b) (p a y) -> p a (Either b y)) -> (p a b -> Either (p a b) (p a y)) -> p a b -> p a (Either b y) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a b -> Either (p a b) (p a y) forall a b. a -> Either a b Left ultraright :: (Profunctor p, Semigroupal (->) Either Either Either p) => p a b -> p (Either x a) (Either y b) ultraright :: p a b -> p (Either x a) (Either y b) ultraright = Either (p x (Either y b)) (p a (Either y b)) -> p (Either x a) (Either y b) forall (p :: * -> * -> *) (t :: * -> * -> *) a x b. (Profunctor p, Semigroupal (->) t Either Either p) => Either (p a x) (p b x) -> p (t a b) x zag (Either (p x (Either y b)) (p a (Either y b)) -> p (Either x a) (Either y b)) -> (p a b -> Either (p x (Either y b)) (p a (Either y b))) -> p a b -> p (Either x a) (Either y b) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a (Either y b) -> Either (p x (Either y b)) (p a (Either y b)) forall a b. b -> Either a b Right (p a (Either y b) -> Either (p x (Either y b)) (p a (Either y b))) -> (p a b -> p a (Either y b)) -> p a b -> Either (p x (Either y b)) (p a (Either y b)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Either (p a y) (p a b) -> p a (Either y b) forall (p :: * -> * -> *) (t :: * -> * -> *) x a b. (Profunctor p, Semigroupal (->) (,) t Either p) => Either (p x a) (p x b) -> p x (t a b) zig (Either (p a y) (p a b) -> p a (Either y b)) -> (p a b -> Either (p a y) (p a b)) -> p a b -> p a (Either y b) forall b c a. (b -> c) -> (a -> b) -> a -> c . p a b -> Either (p a y) (p a b) forall a b. b -> Either a b Right comux :: forall p a b c d. Semigroupal Op (,) (,) (,) p => p (a, c) (b, d) -> (p a b, p c d) comux :: p (a, c) (b, d) -> (p a b, p c d) comux = Op (p a b, p c d) (p (a, c) (b, d)) -> p (a, c) (b, d) -> (p a b, p c d) forall a b. Op a b -> b -> a getOp Op (p a b, p c d) (p (a, c) (b, d)) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine undivide :: forall p x a b. Profunctor p => Semigroupal Op (,) (,) (,) p => p (a, b) x -> (p a x, p b x) undivide :: p (a, b) x -> (p a x, p b x) undivide = p (a, b) (x, x) -> (p a x, p b x) forall (p :: * -> * -> *) a b c d. Semigroupal Op (,) (,) (,) p => p (a, c) (b, d) -> (p a b, p c d) comux (p (a, b) (x, x) -> (p a x, p b x)) -> (p (a, b) x -> p (a, b) (x, x)) -> p (a, b) x -> (p a x, p b x) forall b c a. (b -> c) -> (a -> b) -> a -> c . (x -> (x, x)) -> p (a, b) x -> p (a, b) (x, x) forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap x -> (x, x) forall a. a -> (a, a) dup codemux :: forall p a b c d. Semigroupal Op Either Either (,) p => p (Either a c) (Either b d) -> (p a b, p c d) codemux :: p (Either a c) (Either b d) -> (p a b, p c d) codemux = Op (p a b, p c d) (p (Either a c) (Either b d)) -> p (Either a c) (Either b d) -> (p a b, p c d) forall a b. Op a b -> b -> a getOp Op (p a b, p c d) (p (Either a c) (Either b d)) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine partition :: forall p x a b. Profunctor p => Semigroupal Op Either Either (,) p => p x (Either a b) -> (p x a, p x b) partition :: p x (Either a b) -> (p x a, p x b) partition = p (Either x x) (Either a b) -> (p x a, p x b) forall (p :: * -> * -> *) a b c d. Semigroupal Op Either Either (,) p => p (Either a c) (Either b d) -> (p a b, p c d) codemux (p (Either x x) (Either a b) -> (p x a, p x b)) -> (p x (Either a b) -> p (Either x x) (Either a b)) -> p x (Either a b) -> (p x a, p x b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Either x x -> x) -> p x (Either a b) -> p (Either x x) (Either a b) forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap Either x x -> x forall a. Either a a -> a merge coswitch :: forall p a b c d. Semigroupal Op Either (,) (,) p => p (Either a c) (b, d) -> (p a b, p c d) coswitch :: p (Either a c) (b, d) -> (p a b, p c d) coswitch = Op (p a b, p c d) (p (Either a c) (b, d)) -> p (Either a c) (b, d) -> (p a b, p c d) forall a b. Op a b -> b -> a getOp Op (p a b, p c d) (p (Either a c) (b, d)) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine unfanin :: forall p x a b. Profunctor p => Semigroupal Op Either (,) (,) p => p (Either a b) x -> (p a x, p b x) unfanin :: p (Either a b) x -> (p a x, p b x) unfanin = p (Either a b) (x, x) -> (p a x, p b x) forall (p :: * -> * -> *) a b c d. Semigroupal Op Either (,) (,) p => p (Either a c) (b, d) -> (p a b, p c d) coswitch (p (Either a b) (x, x) -> (p a x, p b x)) -> (p (Either a b) x -> p (Either a b) (x, x)) -> p (Either a b) x -> (p a x, p b x) forall b c a. (b -> c) -> (a -> b) -> a -> c . (x -> (x, x)) -> p (Either a b) x -> p (Either a b) (x, x) forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap x -> (x, x) forall a. a -> (a, a) dup unzip :: forall p x a b. Profunctor p => Semigroupal Op Either (,) (,) p => p x (a, b) -> (p x a, p x b) unzip :: p x (a, b) -> (p x a, p x b) unzip = p (Either x x) (a, b) -> (p x a, p x b) forall (p :: * -> * -> *) a b c d. Semigroupal Op Either (,) (,) p => p (Either a c) (b, d) -> (p a b, p c d) coswitch (p (Either x x) (a, b) -> (p x a, p x b)) -> (p x (a, b) -> p (Either x x) (a, b)) -> p x (a, b) -> (p x a, p x b) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Either x x -> x) -> p x (a, b) -> p (Either x x) (a, b) forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap Either x x -> x forall a. Either a a -> a merge cosplice :: forall p a b c d. Semigroupal Op (,) Either (,) p => p (a, c) (Either b d) -> (p a b, p c d) cosplice :: p (a, c) (Either b d) -> (p a b, p c d) cosplice = Op (p a b, p c d) (p (a, c) (Either b d)) -> p (a, c) (Either b d) -> (p a b, p c d) forall a b. Op a b -> b -> a getOp Op (p a b, p c d) (p (a, c) (Either b d)) forall (cat :: * -> * -> *) (t1 :: * -> * -> *) (t2 :: * -> * -> *) (to :: * -> * -> *) (f :: * -> * -> *) x y x' y'. Semigroupal cat t1 t2 to f => cat (to (f x y) (f x' y')) (f (t1 x x') (t2 y y')) combine terminal :: forall p a. Profunctor p => Unital (->) () () () p => p a () terminal :: p a () terminal = (a -> ()) -> p () () -> p a () forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap (() -> a -> () forall a b. a -> b -> a const ()) (p () () -> p a ()) -> p () () -> p a () forall a b. (a -> b) -> a -> b $ () -> p () () forall (cat :: * -> * -> *) i1 i2 io (f :: * -> * -> *). Unital cat i1 i2 io f => cat io (f i1 i2) introduce () ppure :: forall p a. Profunctor p => Unital (->) () () () p => Strong p => p a a ppure :: p a a ppure = (a -> ((), a)) -> (((), a) -> a) -> p ((), a) ((), a) -> p a a forall (p :: * -> * -> *) a b c d. Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d dimap ((),) ((), a) -> a forall a b. (a, b) -> b snd (p ((), a) ((), a) -> p a a) -> p ((), a) ((), a) -> p a a forall a b. (a -> b) -> a -> b $ p () () -> p ((), a) ((), a) forall (p :: * -> * -> *) a b c. Strong p => p a b -> p (a, c) (b, c) first' (() -> p () () forall (cat :: * -> * -> *) i1 i2 io (f :: * -> * -> *). Unital cat i1 i2 io f => cat io (f i1 i2) introduce () :: p () ()) initial :: forall p a. Profunctor p => Unital (->) Void Void () p => p Void a initial :: p Void a initial = (Void -> a) -> p Void Void -> p Void a forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap Void -> a forall a. Void -> a absurd (p Void Void -> p Void a) -> p Void Void -> p Void a forall a b. (a -> b) -> a -> b $ () -> p Void Void forall (cat :: * -> * -> *) i1 i2 io (f :: * -> * -> *). Unital cat i1 i2 io f => cat io (f i1 i2) introduce () poly :: forall p a b. Profunctor p => Unital (->) () Void () p => p a b poly :: p a b poly = (a -> ()) -> (Void -> b) -> p () Void -> p a b forall (p :: * -> * -> *) a b c d. Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d dimap (() -> a -> () forall a b. a -> b -> a const ()) Void -> b forall a. Void -> a absurd (p () Void -> p a b) -> p () Void -> p a b forall a b. (a -> b) -> a -> b $ () -> p () Void forall (cat :: * -> * -> *) i1 i2 io (f :: * -> * -> *). Unital cat i1 i2 io f => cat io (f i1 i2) introduce () mono :: forall p. Unital (->) Void () () p => p Void () mono :: p Void () mono = () -> p Void () forall (cat :: * -> * -> *) i1 i2 io (f :: * -> * -> *). Unital cat i1 i2 io f => cat io (f i1 i2) introduce ()