{-# 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 ()