module Proarrow.Category.Instance.Cospan where

import Proarrow.Category.Enriched.Dagger (DaggerProfunctor (..))
import Proarrow.Category.Instance.Span (SPAN (..), Span (..))
import Proarrow.Category.Monoidal (Monoidal (..), MonoidalProfunctor (..), SymMonoidal (..))
import Proarrow.Category.Monoidal.CopyDiscard (CopyDiscard)
import Proarrow.Category.Monoidal.Hypergraph (ExpHG, Frobenius (..), Hypergraph, applyHG, curryHG, spiderDefault)
import Proarrow.Core (CAT, CategoryOf (..), Is, Profunctor (..), Promonad (..), UN, dimapDefault, tgt, type (+->))
import Proarrow.Functor (FunctorForRep (..))
import Proarrow.Monoid (Comonoid (..), Monoid (..))
import Proarrow.Object.BinaryCoproduct
  ( HasBinaryCoproducts (..)
  , associatorCoprod
  , associatorCoprodInv
  , leftUnitorCoprod
  , leftUnitorCoprodInv
  , rightUnitorCoprod
  , rightUnitorCoprodInv
  , swapCoprod
  )
import Proarrow.Object.Dual (CompactClosed (..), StarAutonomous (..))
import Proarrow.Object.Exponential (Closed (..))
import Proarrow.Object.Initial (HasInitialObject (..))
import Proarrow.Object.Pullback (Cone (..), Cosink (..), HasPullbacks (..))
import Proarrow.Object.Pushout (Cocone (..), HasPushouts (..), Sink (..))

newtype COSPAN k = CS k
type instance UN CS (CS k) = k

type Cospan :: CAT (COSPAN k)
data Cospan a b where
  Cospan :: forall c a b. a ~> c -> b ~> c -> Cospan (CS a) (CS b)

arr :: (CategoryOf k) => (a :: k) ~> b -> Cospan (CS a) (CS b)
arr :: forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr a ~> b
f = (a ~> b) -> (b ~> b) -> Cospan ('CS a) ('CS b)
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan a ~> b
f ((a ~> b) -> b ~> b
forall {k1} {k2} (a :: k2) (b :: k1) (p :: k1 +-> k2).
Profunctor p =>
p a b -> Obj b
tgt a ~> b
f)

coarr :: (CategoryOf k) => (a :: k) ~> b -> Cospan (CS b) (CS a)
coarr :: forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS b) ('CS a)
coarr a ~> b
f = (b ~> b) -> (a ~> b) -> Cospan ('CS b) ('CS a)
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan ((a ~> b) -> b ~> b
forall {k1} {k2} (a :: k2) (b :: k1) (p :: k1 +-> k2).
Profunctor p =>
p a b -> Obj b
tgt a ~> b
f) a ~> b
f

instance (HasPushouts k) => Profunctor (Cospan :: CAT (COSPAN k)) where
  dimap :: forall (c :: COSPAN k) (a :: COSPAN k) (b :: COSPAN k)
       (d :: COSPAN k).
(c ~> a) -> (b ~> d) -> Cospan a b -> Cospan c d
dimap = (c ~> a) -> (b ~> d) -> Cospan a b -> Cospan c d
Cospan c a -> Cospan b d -> Cospan a b -> Cospan c d
forall {k} (p :: k +-> k) (c :: k) (a :: k) (b :: k) (d :: k).
Promonad p =>
p c a -> p b d -> p a b -> p c d
dimapDefault
  (Ob a, Ob b) => r
r \\ :: forall (a :: COSPAN k) (b :: COSPAN k) r.
((Ob a, Ob b) => r) -> Cospan a b -> r
\\ Cospan a ~> c
f b ~> c
g = r
(Ob a, Ob c) => r
(Ob a, Ob b) => r
r ((Ob a, Ob c) => r) -> (a ~> c) -> r
forall (a :: k) (b :: k) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ a ~> c
f ((Ob b, Ob c) => r) -> (b ~> c) -> r
forall (a :: k) (b :: k) r. ((Ob a, Ob b) => r) -> (a ~> b) -> r
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j) r.
Profunctor p =>
((Ob a, Ob b) => r) -> p a b -> r
\\ b ~> c
g
instance (HasPushouts k) => Promonad (Cospan :: CAT (COSPAN k)) where
  id :: forall (a :: COSPAN k). Ob a => Cospan a a
id = (UN 'CS a ~> UN 'CS a)
-> (UN 'CS a ~> UN 'CS a)
-> Cospan ('CS (UN 'CS a)) ('CS (UN 'CS a))
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan UN 'CS a ~> UN 'CS a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id UN 'CS a ~> UN 'CS a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id
  Cospan a ~> c
f b ~> c
g . :: forall (b :: COSPAN k) (c :: COSPAN k) (a :: COSPAN k).
Cospan b c -> Cospan a b -> Cospan a c
. Cospan a ~> c
h b ~> c
i = case (a ~> c) -> (a ~> c) -> Sink '[c, c]
forall (o :: k) (a :: k) (b :: k).
(o ~> a) -> (o ~> b) -> Sink '[a, b]
forall k (o :: k) (a :: k) (b :: k).
HasPushouts k =>
(o ~> a) -> (o ~> b) -> Sink '[a, b]
pushout a ~> c
b ~> c
i a ~> c
f of Cocone (Coleg b ~> a1
l (Coleg b ~> a1
r Cocone (L bs1) ('COPR a1)
Coapex)) -> (a ~> a) -> (b ~> a) -> Cospan ('CS a) ('CS b)
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan (c ~> a
b ~> a1
l (c ~> a) -> (a ~> c) -> a ~> a
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. a ~> c
h) (c ~> a
b ~> a1
r (c ~> a) -> (b ~> c) -> b ~> a
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. b ~> c
g)
instance (HasPushouts k) => CategoryOf (COSPAN k) where
  type (~>) = Cospan
  type Ob a = (Is CS a, Ob (UN CS a))

instance (HasPushouts k) => MonoidalProfunctor (Cospan :: CAT (COSPAN k)) where
  par0 :: Cospan Unit Unit
par0 = Cospan Unit Unit
Cospan ('CS InitialObject) ('CS InitialObject)
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
forall (a :: COSPAN k). Ob a => Cospan a a
id
  Cospan a ~> c
l1 b ~> c
l2 par :: forall (x1 :: COSPAN k) (x2 :: COSPAN k) (y1 :: COSPAN k)
       (y2 :: COSPAN k).
Cospan x1 x2 -> Cospan y1 y2 -> Cospan (x1 ** y1) (x2 ** y2)
`par` Cospan a ~> c
r1 b ~> c
r2 = ((a || a) ~> (c || c))
-> ((b || b) ~> (c || c)) -> Cospan ('CS (a || a)) ('CS (b || b))
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan (a ~> c
l1 (a ~> c) -> (a ~> c) -> (a || a) ~> (c || c)
forall (a :: k) (b :: k) (x :: k) (y :: k).
(a ~> x) -> (b ~> y) -> (a || b) ~> (x || y)
forall k (a :: k) (b :: k) (x :: k) (y :: k).
HasBinaryCoproducts k =>
(a ~> x) -> (b ~> y) -> (a || b) ~> (x || y)
+++ a ~> c
r1) (b ~> c
l2 (b ~> c) -> (b ~> c) -> (b || b) ~> (c || c)
forall (a :: k) (b :: k) (x :: k) (y :: k).
(a ~> x) -> (b ~> y) -> (a || b) ~> (x || y)
forall k (a :: k) (b :: k) (x :: k) (y :: k).
HasBinaryCoproducts k =>
(a ~> x) -> (b ~> y) -> (a || b) ~> (x || y)
+++ b ~> c
r2)
instance (HasPushouts k) => Monoidal (COSPAN k) where
  type CS a ** CS b = CS (a || b)
  type Unit = CS InitialObject
  withOb2 :: forall (a :: COSPAN k) (b :: COSPAN k) r.
(Ob a, Ob b) =>
(Ob (a ** b) => r) -> r
withOb2 @(CS a) @(CS b) Ob (a ** b) => r
r = forall k (a :: k) (b :: k) r.
(HasBinaryCoproducts k, Ob a, Ob b) =>
(Ob (a || b) => r) -> r
withObCoprod @k @a @b r
Ob (UN 'CS a || UN 'CS b) => r
Ob (a ** b) => r
r
  leftUnitor :: forall (a :: COSPAN k). Ob a => (Unit ** a) ~> a
leftUnitor = ((InitialObject || UN 'CS a) ~> UN 'CS a)
-> Cospan ('CS (InitialObject || UN 'CS a)) ('CS (UN 'CS a))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (InitialObject || UN 'CS a) ~> UN 'CS a
forall {k} (a :: k).
(HasCoproducts k, Ob a) =>
(InitialObject || a) ~> a
leftUnitorCoprod
  leftUnitorInv :: forall (a :: COSPAN k). Ob a => a ~> (Unit ** a)
leftUnitorInv = (UN 'CS a ~> (InitialObject || UN 'CS a))
-> Cospan ('CS (UN 'CS a)) ('CS (InitialObject || UN 'CS a))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr UN 'CS a ~> (InitialObject || UN 'CS a)
forall {k} (a :: k).
(HasCoproducts k, Ob a) =>
a ~> (InitialObject || a)
leftUnitorCoprodInv
  rightUnitor :: forall (a :: COSPAN k). Ob a => (a ** Unit) ~> a
rightUnitor = ((UN 'CS a || InitialObject) ~> UN 'CS a)
-> Cospan ('CS (UN 'CS a || InitialObject)) ('CS (UN 'CS a))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (UN 'CS a || InitialObject) ~> UN 'CS a
forall {k} (a :: k).
(HasCoproducts k, Ob a) =>
(a || InitialObject) ~> a
rightUnitorCoprod
  rightUnitorInv :: forall (a :: COSPAN k). Ob a => a ~> (a ** Unit)
rightUnitorInv = (UN 'CS a ~> (UN 'CS a || InitialObject))
-> Cospan ('CS (UN 'CS a)) ('CS (UN 'CS a || InitialObject))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr UN 'CS a ~> (UN 'CS a || InitialObject)
forall {k} (a :: k).
(HasCoproducts k, Ob a) =>
a ~> (a || InitialObject)
rightUnitorCoprodInv
  associator :: forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Ob a, Ob b, Ob c) =>
((a ** b) ** c) ~> (a ** (b ** c))
associator @(CS a) @(CS b) @(CS c) = (((UN 'CS a || UN 'CS b) || UN 'CS c)
 ~> (UN 'CS a || (UN 'CS b || UN 'CS c)))
-> Cospan
     ('CS ((UN 'CS a || UN 'CS b) || UN 'CS c))
     ('CS (UN 'CS a || (UN 'CS b || UN 'CS c)))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (forall (a :: k) (b :: k) (c :: k).
(HasCoproducts k, Ob a, Ob b, Ob c) =>
((a || b) || c) ~> (a || (b || c))
forall {k} (a :: k) (b :: k) (c :: k).
(HasCoproducts k, Ob a, Ob b, Ob c) =>
((a || b) || c) ~> (a || (b || c))
associatorCoprod @a @b @c)
  associatorInv :: forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Ob a, Ob b, Ob c) =>
(a ** (b ** c)) ~> ((a ** b) ** c)
associatorInv @(CS a) @(CS b) @(CS c) = ((UN 'CS a || (UN 'CS b || UN 'CS c))
 ~> ((UN 'CS a || UN 'CS b) || UN 'CS c))
-> Cospan
     ('CS (UN 'CS a || (UN 'CS b || UN 'CS c)))
     ('CS ((UN 'CS a || UN 'CS b) || UN 'CS c))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (forall (a :: k) (b :: k) (c :: k).
(HasCoproducts k, Ob a, Ob b, Ob c) =>
(a || (b || c)) ~> ((a || b) || c)
forall {k} (a :: k) (b :: k) (c :: k).
(HasCoproducts k, Ob a, Ob b, Ob c) =>
(a || (b || c)) ~> ((a || b) || c)
associatorCoprodInv @a @b @c)
instance (HasPushouts k) => SymMonoidal (COSPAN k) where
  swap :: forall (a :: COSPAN k) (b :: COSPAN k).
(Ob a, Ob b) =>
(a ** b) ~> (b ** a)
swap @(CS a) @(CS b) = ((UN 'CS a || UN 'CS b) ~> (UN 'CS b || UN 'CS a))
-> Cospan ('CS (UN 'CS a || UN 'CS b)) ('CS (UN 'CS b || UN 'CS a))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (forall (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
(a || b) ~> (b || a)
forall {k} (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
(a || b) ~> (b || a)
swapCoprod @a @b)

instance (HasPushouts k, Ob a) => Monoid (CS (a :: k)) where
  mempty :: Unit ~> 'CS a
mempty = (InitialObject ~> a) -> Cospan ('CS InitialObject) ('CS a)
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr InitialObject ~> a
forall (a :: k). Ob a => InitialObject ~> a
forall k (a :: k). (HasInitialObject k, Ob a) => InitialObject ~> a
initiate
  mappend :: ('CS a ** 'CS a) ~> 'CS a
mappend = ((a || a) ~> a) -> Cospan ('CS (a || a)) ('CS a)
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS a) ('CS b)
arr (a ~> a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id (a ~> a) -> (a ~> a) -> (a || a) ~> a
forall (x :: k) (a :: k) (y :: k).
(x ~> a) -> (y ~> a) -> (x || y) ~> a
forall k (x :: k) (a :: k) (y :: k).
HasBinaryCoproducts k =>
(x ~> a) -> (y ~> a) -> (x || y) ~> a
||| a ~> a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id)
instance (HasPushouts k, Ob a) => Comonoid (CS (a :: k)) where
  counit :: 'CS a ~> Unit
counit = (InitialObject ~> a) -> Cospan ('CS a) ('CS InitialObject)
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS b) ('CS a)
coarr InitialObject ~> a
forall (a :: k). Ob a => InitialObject ~> a
forall k (a :: k). (HasInitialObject k, Ob a) => InitialObject ~> a
initiate
  comult :: 'CS a ~> ('CS a ** 'CS a)
comult = ((a || a) ~> a) -> Cospan ('CS a) ('CS (a || a))
forall k (a :: k) (b :: k).
CategoryOf k =>
(a ~> b) -> Cospan ('CS b) ('CS a)
coarr (a ~> a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id (a ~> a) -> (a ~> a) -> (a || a) ~> a
forall (x :: k) (a :: k) (y :: k).
(x ~> a) -> (y ~> a) -> (x || y) ~> a
forall k (x :: k) (a :: k) (y :: k).
HasBinaryCoproducts k =>
(x ~> a) -> (y ~> a) -> (x || y) ~> a
||| a ~> a
forall (a :: k). Ob a => a ~> a
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
id)
instance (HasPushouts k, Ob a) => Frobenius (CS (a :: k)) where
  spider :: forall (n :: Nat) (m :: Nat).
(SNatI n, SNatI m) =>
NFold n ('CS a) ~> NFold m ('CS a)
spider @x @y = forall {k} (n :: Nat) (m :: Nat) (a :: k).
(Monoid a, Comonoid a, SNatI n, SNatI m) =>
NFold n a ~> NFold m a
forall (n :: Nat) (m :: Nat) (a :: COSPAN k).
(Monoid a, Comonoid a, SNatI n, SNatI m) =>
NFold n a ~> NFold m a
spiderDefault @x @y @(CS a)
instance (HasPushouts k) => Hypergraph (COSPAN k)
instance (HasPushouts k) => CopyDiscard (COSPAN k)

instance (HasPushouts k) => Closed (COSPAN k) where
  type a ~~> b = ExpHG a b
  withObExp :: forall (a :: COSPAN k) (b :: COSPAN k) r.
(Ob a, Ob b) =>
(Ob (a ~~> b) => r) -> r
withObExp @(CS a) @(CS b) Ob (a ~~> b) => r
r = forall k (a :: k) (b :: k) r.
(HasBinaryCoproducts k, Ob a, Ob b) =>
(Ob (a || b) => r) -> r
withObCoprod @k @a @b r
Ob (UN 'CS a || UN 'CS b) => r
Ob (a ~~> b) => r
r
  curry :: forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Ob a, Ob b) =>
((a ** b) ~> c) -> a ~> (b ~~> c)
curry @a @b = forall {k} (a :: k) (b :: k) (c :: k).
(Hypergraph k, Ob a, Ob b) =>
((a ** b) ~> c) -> a ~> ExpHG b c
forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Hypergraph (COSPAN k), Ob a, Ob b) =>
((a ** b) ~> c) -> a ~> ExpHG b c
curryHG @a @b
  apply :: forall (a :: COSPAN k) (b :: COSPAN k).
(Ob a, Ob b) =>
((a ~~> b) ** a) ~> b
apply @b @c = forall {k} (b :: k) (c :: k).
(Hypergraph k, Ob b, Ob c) =>
(ExpHG b c ** b) ~> c
forall (b :: COSPAN k) (c :: COSPAN k).
(Hypergraph (COSPAN k), Ob b, Ob c) =>
(ExpHG b c ** b) ~> c
applyHG @b @c

instance (HasPushouts k) => StarAutonomous (COSPAN k) where
  type Dual a = a
  dual :: forall (a :: COSPAN k) (b :: COSPAN k).
(a ~> b) -> Dual b ~> Dual a
dual (Cospan a ~> c
f b ~> c
g) = (b ~> c) -> (a ~> c) -> Cospan ('CS b) ('CS a)
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan b ~> c
g a ~> c
f
  dualInv :: forall (a :: COSPAN k) (b :: COSPAN k).
(Ob a, Ob b) =>
(Dual a ~> Dual b) -> b ~> a
dualInv (Cospan a ~> c
f b ~> c
g) = (UN 'CS b ~> c)
-> (UN 'CS a ~> c) -> Cospan ('CS (UN 'CS b)) ('CS (UN 'CS a))
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan b ~> c
UN 'CS b ~> c
g a ~> c
UN 'CS a ~> c
f
  linDist :: forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Ob a, Ob b, Ob c) =>
((a ** b) ~> Dual c) -> a ~> Dual (b ** c)
linDist @(CS a) @(CS b) (Cospan a ~> c
f b ~> c
g) = (UN 'CS a ~> c)
-> ((UN 'CS b || UN 'CS c) ~> c)
-> Cospan ('CS (UN 'CS a)) ('CS (UN 'CS b || UN 'CS c))
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan (a ~> c
f (a ~> c) -> (UN 'CS a ~> a) -> UN 'CS a ~> c
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. forall k (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
a ~> (a || b)
lft @k @a @b) (a ~> c
f (a ~> c) -> (UN 'CS b ~> a) -> UN 'CS b ~> c
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. forall k (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
b ~> (a || b)
rgt @k @a @b (UN 'CS b ~> c) -> (UN 'CS c ~> c) -> (UN 'CS b || UN 'CS c) ~> c
forall (x :: k) (a :: k) (y :: k).
(x ~> a) -> (y ~> a) -> (x || y) ~> a
forall k (x :: k) (a :: k) (y :: k).
HasBinaryCoproducts k =>
(x ~> a) -> (y ~> a) -> (x || y) ~> a
||| b ~> c
UN 'CS c ~> c
g)
  linDistInv :: forall (a :: COSPAN k) (b :: COSPAN k) (c :: COSPAN k).
(Ob a, Ob b, Ob c) =>
(a ~> Dual (b ** c)) -> (a ** b) ~> Dual c
linDistInv @_ @(CS b) @(CS c) (Cospan a ~> c
f b ~> c
g) = ((UN 'CS a || UN 'CS b) ~> c)
-> (UN 'CS c ~> c)
-> Cospan ('CS (UN 'CS a || UN 'CS b)) ('CS (UN 'CS c))
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan (a ~> c
UN 'CS a ~> c
f (UN 'CS a ~> c) -> (UN 'CS b ~> c) -> (UN 'CS a || UN 'CS b) ~> c
forall (x :: k) (a :: k) (y :: k).
(x ~> a) -> (y ~> a) -> (x || y) ~> a
forall k (x :: k) (a :: k) (y :: k).
HasBinaryCoproducts k =>
(x ~> a) -> (y ~> a) -> (x || y) ~> a
||| b ~> c
g (b ~> c) -> (UN 'CS b ~> b) -> UN 'CS b ~> c
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. forall k (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
a ~> (a || b)
lft @k @b @c) (b ~> c
g (b ~> c) -> (UN 'CS c ~> b) -> UN 'CS c ~> c
forall (b :: k) (c :: k) (a :: k). (b ~> c) -> (a ~> b) -> a ~> c
forall {k} (p :: k +-> k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. forall k (a :: k) (b :: k).
(HasBinaryCoproducts k, Ob a, Ob b) =>
b ~> (a || b)
rgt @k @b @c)
instance (HasPushouts k) => CompactClosed (COSPAN k) where
  distribDual :: forall (a :: COSPAN k) (b :: COSPAN k).
(Ob a, Ob b) =>
Dual (a ** b) ~> (Dual a ** Dual b)
distribDual @(CS a) @(CS b) = forall k (a :: k) (b :: k) r.
(HasBinaryCoproducts k, Ob a, Ob b) =>
(Ob (a || b) => r) -> r
withObCoprod @k @a @b Cospan ('CS (UN 'CS a || UN 'CS b)) ('CS (UN 'CS a || UN 'CS b))
Ob (UN 'CS a || UN 'CS b) =>
Cospan ('CS (UN 'CS a || UN 'CS b)) ('CS (UN 'CS a || UN 'CS b))
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
forall (a :: COSPAN k). Ob a => Cospan a a
id
  dualUnit :: Dual Unit ~> Unit
dualUnit = Dual Unit ~> Unit
Cospan ('CS InitialObject) ('CS InitialObject)
forall {k} (p :: k +-> k) (a :: k). (Promonad p, Ob a) => p a a
forall (a :: COSPAN k). Ob a => Cospan a a
id

instance (HasPushouts k) => DaggerProfunctor (Cospan :: CAT (COSPAN k)) where
  dagger :: forall (a :: COSPAN k) (b :: COSPAN k). Cospan a b -> Cospan b a
dagger = (a ~> b) -> Dual b ~> Dual a
Cospan a b -> Cospan b a
forall k (a :: k) (b :: k).
StarAutonomous k =>
(a ~> b) -> Dual b ~> Dual a
forall (a :: COSPAN k) (b :: COSPAN k).
(a ~> b) -> Dual b ~> Dual a
dual

data family Pushout :: SPAN k +-> COSPAN k
instance (HasPushouts k, HasPullbacks k) => FunctorForRep (Pushout :: SPAN k +-> COSPAN k) where
  type Pushout @ (SP a) = CS a
  fmap :: forall (a :: SPAN k) (b :: SPAN k).
(a ~> b) -> (Pushout @ a) ~> (Pushout @ b)
fmap (Span c ~> a1
l c ~> b1
r) = case (c ~> a1) -> (c ~> b1) -> Sink '[a1, b1]
forall (o :: k) (a :: k) (b :: k).
(o ~> a) -> (o ~> b) -> Sink '[a, b]
forall k (o :: k) (a :: k) (b :: k).
HasPushouts k =>
(o ~> a) -> (o ~> b) -> Sink '[a, b]
pushout c ~> a1
l c ~> b1
r of Cocone (Coleg b ~> a1
f (Coleg b ~> a1
g Cocone (L bs1) ('COPR a1)
Coapex)) -> (a1 ~> a) -> (b1 ~> a) -> Cospan ('CS a1) ('CS b1)
forall {k} (c :: k) (a :: k) (b :: k).
(a ~> c) -> (b ~> c) -> Cospan ('CS a) ('CS b)
Cospan a1 ~> a
b ~> a1
f b1 ~> a
b ~> a1
g

data family Pullback :: COSPAN k +-> SPAN k
instance (HasPushouts k, HasPullbacks k) => FunctorForRep (Pullback :: COSPAN k +-> SPAN k) where
  type Pullback @ (CS a) = SP a
  fmap :: forall (a :: COSPAN k) (b :: COSPAN k).
(a ~> b) -> (Pullback @ a) ~> (Pullback @ b)
fmap (Cospan a ~> c
l b ~> c
r) = case (a ~> c) -> (b ~> c) -> Cosink '[a, b]
forall (o :: k) (a :: k) (b :: k).
(a ~> o) -> (b ~> o) -> Cosink '[a, b]
forall k (o :: k) (a :: k) (b :: k).
HasPullbacks k =>
(a ~> o) -> (b ~> o) -> Cosink '[a, b]
pullback a ~> c
l b ~> c
r of Cone (Leg a1 ~> b
f (Leg a1 ~> b
g Cone ('PR a1) (L bs1)
Apex)) -> (a ~> a) -> (a ~> b) -> Span ('SP a) ('SP b)
forall {k} (c :: k) (a1 :: k) (b1 :: k).
(c ~> a1) -> (c ~> b1) -> Span ('SP a1) ('SP b1)
Span a ~> a
a1 ~> b
f a ~> b
a1 ~> b
g