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