{-# OPTIONS_GHC -Wno-orphans #-}
module Proarrow.Profunctor.Instance.Arrow where
import Control.Arrow
( Arrow (..)
, ArrowApply (..)
, ArrowChoice (..)
, ArrowLoop (..)
, Kleisli (..)
, (>>>)
)
import Control.Category qualified as P
import Control.Monad (MonadPlus)
import Control.Monad.Fix (MonadFix)
import Data.Kind (Type)
import Prelude (Either (..), Functor (..), Monad (..))
import Proarrow.Category.Monoidal (MonoidalProfunctor (..), Tensor)
import Proarrow.Category.Monoidal.Action (CoprodAction)
import Proarrow.Category.Monoidal.Distributive (DistributiveProfunctor)
import Proarrow.Category.Monoidal.Strength (Costrong (..), Strong (..))
import Proarrow.Colimit.BinaryCoproduct (Coprod (..), (++))
import Proarrow.Core (CAT, Profunctor (..), Promonad (..), rmap, type (+->))
import Proarrow.Functor (FromProfunctor (..))
import Proarrow.Limit.BinaryProduct ()
import Proarrow.Profunctor.Representable (Representable (..))
swap :: (b, a) -> (a, b)
swap :: forall b a. (b, a) -> (a, b)
swap ~(b
x, a
y) = (a
y, b
x)
type Arr :: CAT Type -> CAT Type
newtype Arr arr a b = Arr {forall (arr :: CAT Type) a b. Arr arr a b -> arr a b
unArr :: arr a b}
instance (Arrow arr) => Profunctor (Arr arr) where
dimap :: forall c a b d. (c ~> a) -> (b ~> d) -> Arr arr a b -> Arr arr c d
dimap c ~> a
l b ~> d
r (Arr arr a b
a) = arr c d -> Arr arr c d
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr ((c -> a) -> arr c a
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr c ~> a
c -> a
l arr c a -> arr a d -> arr c d
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> arr a b
a arr a b -> arr b d -> arr a d
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (b -> d) -> arr b d
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr b ~> d
b -> d
r)
instance (Arrow arr) => Promonad (Arr arr) where
id :: forall a. Ob a => Arr arr a a
id = arr a a -> Arr arr a a
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr ((a -> a) -> arr a a
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr a -> a
forall a. Ob a => a -> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id)
Arr arr b c
f . :: forall b c a. Arr arr b c -> Arr arr a b -> Arr arr a c
. Arr arr a b
g = arr a c -> Arr arr a c
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr (arr a b
g arr a b -> arr b c -> arr a c
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> arr b c
f)
instance (Arrow arr) => Strong Tensor (Arr arr) where
act :: forall a x y.
Ob a =>
Arr arr x y -> Arr arr (Act Tensor a x) (Act Tensor a y)
act (Arr arr x y
a) = arr (a, x) (a, y) -> Arr arr (a, x) (a, y)
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr (arr x y -> arr (a, x) (a, y)
forall b c d. arr b c -> arr (d, b) (d, c)
forall (a :: CAT Type) b c d. Arrow a => a b c -> a (d, b) (d, c)
second arr x y
a)
instance (ArrowLoop arr) => Costrong Tensor (Arr arr) where
coact :: forall a x y.
(Ob a, Ob x, Ob y) =>
Arr arr (Act Tensor a x) (Act Tensor a y) -> Arr arr x y
coact (Arr arr (Act Tensor a x) (Act Tensor a y)
f) = arr x y -> Arr arr x y
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr (arr (x, a) (y, a) -> arr x y
forall b d c. arr (b, d) (c, d) -> arr b c
forall (a :: CAT Type) b d c.
ArrowLoop a =>
a (b, d) (c, d) -> a b c
loop (((x, a) -> (a, x)) -> arr (x, a) (a, x)
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (x, a) -> (a, x)
forall b a. (b, a) -> (a, b)
swap arr (x, a) (a, x) -> arr (a, x) (y, a) -> arr (x, a) (y, a)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> arr (a, x) (a, y)
arr (Act Tensor a x) (Act Tensor a y)
f arr (a, x) (a, y) -> arr (a, y) (y, a) -> arr (a, x) (y, a)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ((a, y) -> (y, a)) -> arr (a, y) (y, a)
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (a, y) -> (y, a)
forall b a. (b, a) -> (a, b)
swap))
instance (Arrow arr) => MonoidalProfunctor (Arr arr) where
one :: Arr arr Unit Unit
one = arr () () -> Arr arr () ()
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr ((() -> ()) -> arr () ()
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr () -> ()
forall a. Ob a => a -> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id)
Arr arr x1 x2
l ** :: forall x1 x2 y1 y2.
Arr arr x1 x2 -> Arr arr y1 y2 -> Arr arr (x1 ** y1) (x2 ** y2)
** Arr arr y1 y2
r = arr (x1, y1) (x2, y2) -> Arr arr (x1, y1) (x2, y2)
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr (arr x1 x2
l arr x1 x2 -> arr y1 y2 -> arr (x1, y1) (x2, y2)
forall b c b' c'. arr b c -> arr b' c' -> arr (b, b') (c, c')
forall (a :: CAT Type) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** arr y1 y2
r)
instance (ArrowChoice arr) => MonoidalProfunctor (Coprod (Arr arr)) where
one :: Coprod (Arr arr) Unit Unit
one = Arr arr Void Void -> Coprod (Arr arr) (COPR Void) (COPR Void)
forall {j} {k} (p :: j +-> k) (a1 :: k) (b1 :: j).
p a1 b1 -> Coprod p (COPR a1) (COPR b1)
Coprod (arr Void Void -> Arr arr Void Void
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr ((Void -> Void) -> arr Void Void
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr Void -> Void
forall a. Ob a => a -> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id))
Coprod (Arr arr a1 b1
l) ** :: forall (x1 :: COPROD Type) (x2 :: COPROD Type) (y1 :: COPROD Type)
(y2 :: COPROD Type).
Coprod (Arr arr) x1 x2
-> Coprod (Arr arr) y1 y2 -> Coprod (Arr arr) (x1 ** y1) (x2 ** y2)
** Coprod (Arr arr a1 b1
r) = Arr arr (Either a1 a1) (Either b1 b1)
-> Coprod (Arr arr) (COPR (Either a1 a1)) (COPR (Either b1 b1))
forall {j} {k} (p :: j +-> k) (a1 :: k) (b1 :: j).
p a1 b1 -> Coprod p (COPR a1) (COPR b1)
Coprod (arr (Either a1 a1) (Either b1 b1)
-> Arr arr (Either a1 a1) (Either b1 b1)
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr (arr a1 b1
l arr a1 b1 -> arr a1 b1 -> arr (Either a1 a1) (Either b1 b1)
forall b c b' c'.
arr b c -> arr b' c' -> arr (Either b b') (Either c c')
forall (a :: CAT Type) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ arr a1 b1
r))
instance (ArrowApply arr) => Representable (Arr arr) where
type Arr arr % a = arr () a
index :: forall a b. Arr arr a b -> a ~> (Arr arr % b)
index (Arr arr a b
a) a
b = (() -> a) -> arr () a
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (\() -> a
b) arr () a -> arr a b -> arr () b
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> arr a b
a
tabulate :: forall b a. Ob b => (a ~> (Arr arr % b)) -> Arr arr a b
tabulate a ~> (Arr arr % b)
f = arr a b -> Arr arr a b
forall (arr :: CAT Type) a b. arr a b -> Arr arr a b
Arr ((a -> (arr () b, ())) -> arr a (arr () b, ())
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (\a
a -> (a ~> (Arr arr % b)
a -> arr () b
f a
a, ())) arr a (arr () b, ()) -> arr (arr () b, ()) b -> arr a b
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> arr (arr () b, ()) b
forall b c. arr (arr b c, b) c
forall (a :: CAT Type) b c. ArrowApply a => a (a b c, b) c
app)
repMap :: forall a b. (a ~> b) -> (Arr arr % a) ~> (Arr arr % b)
repMap a ~> b
f arr () a
a = arr () a
a arr () a -> arr a b -> arr () b
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (a -> b) -> arr a b
forall b c. (b -> c) -> arr b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr a ~> b
a -> b
f
instance (Functor m) => Profunctor (Kleisli m) where
dimap :: forall c a b d.
(c ~> a) -> (b ~> d) -> Kleisli m a b -> Kleisli m c d
dimap c ~> a
l b ~> d
r (Kleisli a -> m b
a) = (c -> m d) -> Kleisli m c d
forall (m :: Type -> Type) a b. (a -> m b) -> Kleisli m a b
Kleisli ((b -> d) -> m b -> m d
forall a b. (a -> b) -> m a -> m b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap b ~> d
b -> d
r (m b -> m d) -> (c -> m b) -> c -> m d
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. a -> m b
a (a -> m b) -> (c -> a) -> c -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. c ~> a
c -> a
l)
instance (Monad m) => Promonad (Kleisli m) where
id :: forall a. Ob a => Kleisli m a a
id = (a -> a) -> Kleisli m a a
forall b c. (b -> c) -> Kleisli m b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr a -> a
forall a. Ob a => a -> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id
Kleisli m b c
f . :: forall b c a. Kleisli m b c -> Kleisli m a b -> Kleisli m a c
. Kleisli m a b
g = Kleisli m a b
g Kleisli m a b -> Kleisli m b c -> Kleisli m a c
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Kleisli m b c
f
instance (Monad m) => Strong Tensor (Kleisli m) where
act :: forall a x y.
Ob a =>
Kleisli m x y -> Kleisli m (Act Tensor a x) (Act Tensor a y)
act = Kleisli m x y -> Kleisli m (a, x) (a, y)
Kleisli m x y -> Kleisli m (Tensor % '(a, x)) (Tensor % '(a, y))
forall b c d. Kleisli m b c -> Kleisli m (d, b) (d, c)
forall (a :: CAT Type) b c d. Arrow a => a b c -> a (d, b) (d, c)
second
instance (MonadPlus m) => Strong CoprodAction (Kleisli m) where
act :: forall (a :: COPROD Type) x y.
Ob a =>
Kleisli m x y
-> Kleisli m (Act CoprodAction a x) (Act CoprodAction a y)
act (Kleisli x -> m y
a) = (Either (UN COPR a) x -> m (Either (UN COPR a) y))
-> Kleisli m (Either (UN COPR a) x) (Either (UN COPR a) y)
forall (m :: Type -> Type) a b. (a -> m b) -> Kleisli m a b
Kleisli ((Either (UN COPR a) y -> m (Either (UN COPR a) y)
forall a. a -> m a
forall (m :: Type -> Type) a. Monad m => a -> m a
return (Either (UN COPR a) y -> m (Either (UN COPR a) y))
-> (UN COPR a -> Either (UN COPR a) y)
-> UN COPR a
-> m (Either (UN COPR a) y)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
. UN COPR a -> Either (UN COPR a) y
forall a b. a -> Either a b
Left) (UN COPR a -> m (Either (UN COPR a) y))
-> (x -> m (Either (UN COPR a) y))
-> Either (UN COPR a) x
-> m (Either (UN COPR a) y)
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
forall (a :: CAT Type) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| (x -> m y
a (x -> m y)
-> (m y -> m (Either (UN COPR a) y))
-> x
-> m (Either (UN COPR a) y)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (y -> Either (UN COPR a) y) -> m y -> m (Either (UN COPR a) y)
forall a b. (a -> b) -> m a -> m b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap y -> Either (UN COPR a) y
forall a b. b -> Either a b
Right))
instance (MonadFix m) => Costrong Tensor (Kleisli m) where
coact :: forall a x y.
(Ob a, Ob x, Ob y) =>
Kleisli m (Act Tensor a x) (Act Tensor a y) -> Kleisli m x y
coact Kleisli m (Act Tensor a x) (Act Tensor a y)
f = Kleisli m (x, a) (y, a) -> Kleisli m x y
forall b d c. Kleisli m (b, d) (c, d) -> Kleisli m b c
forall (a :: CAT Type) b d c.
ArrowLoop a =>
a (b, d) (c, d) -> a b c
loop (((x, a) -> (a, x)) -> Kleisli m (x, a) (a, x)
forall b c. (b -> c) -> Kleisli m b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (x, a) -> (a, x)
forall b a. (b, a) -> (a, b)
swap Kleisli m (x, a) (a, x)
-> Kleisli m (a, x) (y, a) -> Kleisli m (x, a) (y, a)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Kleisli m (a, x) (a, y)
Kleisli m (Act Tensor a x) (Act Tensor a y)
f Kleisli m (a, x) (a, y)
-> Kleisli m (a, y) (y, a) -> Kleisli m (a, x) (y, a)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ((a, y) -> (y, a)) -> Kleisli m (a, y) (y, a)
forall b c. (b -> c) -> Kleisli m b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr (a, y) -> (y, a)
forall b a. (b, a) -> (a, b)
swap)
instance (Monad m) => MonoidalProfunctor (Kleisli m) where
one :: Kleisli m Unit Unit
one = (() -> ()) -> Kleisli m () ()
forall b c. (b -> c) -> Kleisli m b c
forall (a :: CAT Type) b c. Arrow a => (b -> c) -> a b c
arr () -> ()
forall a. Ob a => a -> a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id
Kleisli m x1 x2
l ** :: forall x1 x2 y1 y2.
Kleisli m x1 x2
-> Kleisli m y1 y2 -> Kleisli m (x1 ** y1) (x2 ** y2)
** Kleisli m y1 y2
r = Kleisli m x1 x2
l Kleisli m x1 x2 -> Kleisli m y1 y2 -> Kleisli m (x1, y1) (x2, y2)
forall b c b' c'.
Kleisli m b c -> Kleisli m b' c' -> Kleisli m (b, b') (c, c')
forall (a :: CAT Type) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** Kleisli m y1 y2
r
instance (MonadPlus m) => MonoidalProfunctor (Coprod (Kleisli m)) where
one :: Coprod (Kleisli m) Unit Unit
one = Kleisli m Void Void -> Coprod (Kleisli m) (COPR Void) (COPR Void)
forall {j} {k} (p :: j +-> k) (a1 :: k) (b1 :: j).
p a1 b1 -> Coprod p (COPR a1) (COPR b1)
Coprod ((Void -> m Void) -> Kleisli m Void Void
forall (m :: Type -> Type) a b. (a -> m b) -> Kleisli m a b
Kleisli Void -> m Void
forall a. a -> m a
forall (m :: Type -> Type) a. Monad m => a -> m a
return)
Coprod (Kleisli a1 -> m b1
l) ** :: forall (x1 :: COPROD Type) (x2 :: COPROD Type) (y1 :: COPROD Type)
(y2 :: COPROD Type).
Coprod (Kleisli m) x1 x2
-> Coprod (Kleisli m) y1 y2
-> Coprod (Kleisli m) (x1 ** y1) (x2 ** y2)
** Coprod (Kleisli a1 -> m b1
r) = Kleisli m (Either a1 a1) (Either b1 b1)
-> Coprod (Kleisli m) (COPR (Either a1 a1)) (COPR (Either b1 b1))
forall {j} {k} (p :: j +-> k) (a1 :: k) (b1 :: j).
p a1 b1 -> Coprod p (COPR a1) (COPR b1)
Coprod ((Either a1 a1 -> m (Either b1 b1))
-> Kleisli m (Either a1 a1) (Either b1 b1)
forall (m :: Type -> Type) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a1 -> m b1
l (a1 -> m b1)
-> (m b1 -> m (Either b1 b1)) -> a1 -> m (Either b1 b1)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (b1 -> Either b1 b1) -> m b1 -> m (Either b1 b1)
forall a b. (a -> b) -> m a -> m b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap b1 -> Either b1 b1
forall a b. a -> Either a b
Left) (a1 -> m (Either b1 b1))
-> (a1 -> m (Either b1 b1)) -> Either a1 a1 -> m (Either b1 b1)
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
forall (a :: CAT Type) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| (a1 -> m b1
r (a1 -> m b1)
-> (m b1 -> m (Either b1 b1)) -> a1 -> m (Either b1 b1)
forall {k} (cat :: k -> k -> Type) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (b1 -> Either b1 b1) -> m b1 -> m (Either b1 b1)
forall a b. (a -> b) -> m a -> m b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap b1 -> Either b1 b1
forall a b. b -> Either a b
Right)))
instance (Functor m) => Representable (Kleisli m) where
type Kleisli m % a = m a
index :: forall a b. Kleisli m a b -> a ~> (Kleisli m % b)
index = Kleisli m a b -> a ~> (Kleisli m % b)
Kleisli m a b -> a -> m b
forall (m :: Type -> Type) a b. Kleisli m a b -> a -> m b
runKleisli
tabulate :: forall b a. Ob b => (a ~> (Kleisli m % b)) -> Kleisli m a b
tabulate = (a ~> (Kleisli m % b)) -> Kleisli m a b
(a -> m b) -> Kleisli m a b
forall (m :: Type -> Type) a b. (a -> m b) -> Kleisli m a b
Kleisli
repMap :: forall a b. (a ~> b) -> (Kleisli m % a) ~> (Kleisli m % b)
repMap = (a ~> b) -> (Kleisli m % a) ~> (Kleisli m % b)
(a -> b) -> m a -> m b
forall a b. (a -> b) -> m a -> m b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap
instance (Promonad p) => P.Category (FromProfunctor p :: Type +-> Type) where
id :: forall a. FromProfunctor p a a
id = FromProfunctor p a a
forall a. Ob a => FromProfunctor p a a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id
. :: forall b c a.
FromProfunctor p b c
-> FromProfunctor p a b -> FromProfunctor p a c
(.) = FromProfunctor p b c
-> FromProfunctor p a b -> FromProfunctor p a c
forall b c a.
FromProfunctor p b c
-> FromProfunctor p a b -> FromProfunctor p a c
forall {k} (p :: CAT k) (b :: k) (c :: k) (a :: k).
Promonad p =>
p b c -> p a b -> p a c
(.)
instance (MonoidalProfunctor p, Promonad p) => Arrow (FromProfunctor p :: Type +-> Type) where
arr :: forall b c. (b -> c) -> FromProfunctor p b c
arr b -> c
f = (b ~> c) -> FromProfunctor p b b -> FromProfunctor p b c
forall b d a.
(b ~> d) -> FromProfunctor p a b -> FromProfunctor p a d
forall {j} {k} (p :: j +-> k) (b :: j) (d :: j) (a :: k).
Profunctor p =>
(b ~> d) -> p a b -> p a d
rmap b ~> c
b -> c
f FromProfunctor p b b
forall a. Ob a => FromProfunctor p a a
forall {k} (p :: CAT k) (a :: k). (Promonad p, Ob a) => p a a
id
FromProfunctor p b c
f *** :: forall b c b' c'.
FromProfunctor p b c
-> FromProfunctor p b' c' -> FromProfunctor p (b, b') (c, c')
*** FromProfunctor p b' c'
g = p (b, b') (c, c') -> FromProfunctor p (b, b') (c, c')
forall {k} {k1} (p :: k -> k1 -> Type) (a :: k) (b :: k1).
p a b -> FromProfunctor p a b
FromProfunctor (p b c
f p b c -> p b' c' -> p (b ** b') (c ** c')
forall x1 x2 y1 y2. p x1 x2 -> p y1 y2 -> p (x1 ** y1) (x2 ** y2)
forall {j} {k} (p :: j +-> k) (x1 :: k) (x2 :: j) (y1 :: k)
(y2 :: j).
MonoidalProfunctor p =>
p x1 x2 -> p y1 y2 -> p (x1 ** y1) (x2 ** y2)
** p b' c'
g)
instance (DistributiveProfunctor p, Promonad p) => ArrowChoice (FromProfunctor p :: Type +-> Type) where
FromProfunctor p b c
f +++ :: forall b c b' c'.
FromProfunctor p b c
-> FromProfunctor p b' c'
-> FromProfunctor p (Either b b') (Either c c')
+++ FromProfunctor p b' c'
g = p (Either b b') (Either c c')
-> FromProfunctor p (Either b b') (Either c c')
forall {k} {k1} (p :: k -> k1 -> Type) (a :: k) (b :: k1).
p a b -> FromProfunctor p a b
FromProfunctor (p b c
f p b c -> p b' c' -> p (b || b') (c || c')
forall {k1} {k2} (p :: k1 +-> k2) (a :: k2) (b :: k1) (c :: k2)
(d :: k1).
MonoidalProfunctor (Coprod p) =>
p a b -> p c d -> p (a || c) (b || d)
++ p b' c'
g)
instance (Representable p, MonoidalProfunctor p, Promonad p) => ArrowApply (FromProfunctor p :: Type +-> Type) where
app :: forall b c. FromProfunctor p (FromProfunctor p b c, b) c
app = p (FromProfunctor p b c, b) c
-> FromProfunctor p (FromProfunctor p b c, b) c
forall {k} {k1} (p :: k -> k1 -> Type) (a :: k) (b :: k1).
p a b -> FromProfunctor p a b
FromProfunctor (((FromProfunctor p b c, b) ~> (p % c))
-> p (FromProfunctor p b c, b) c
forall b a. Ob b => (a ~> (p % b)) -> p a b
forall {j} {k} (p :: j +-> k) (b :: j) (a :: k).
(Representable p, Ob b) =>
(a ~> (p % b)) -> p a b
tabulate \(FromProfunctor p b c
p, b
b) -> p b c -> b ~> (p % c)
forall a b. p a b -> a ~> (p % b)
forall {j} {k} (p :: j +-> k) (a :: k) (b :: j).
Representable p =>
p a b -> a ~> (p % b)
index p b c
p b
b)
instance (Costrong Tensor p, MonoidalProfunctor p, Promonad p) => ArrowLoop (FromProfunctor p :: Type +-> Type) where
loop :: forall b d c.
FromProfunctor p (b, d) (c, d) -> FromProfunctor p b c
loop (FromProfunctor p (b, d) (c, d)
p) = p b c -> FromProfunctor p b c
forall {k} {k1} (p :: k -> k1 -> Type) (a :: k) (b :: k1).
p a b -> FromProfunctor p a b
FromProfunctor (forall {m} {k} (t :: (m, k) +-> k) (p :: k +-> k) (a :: m) (x :: k)
(y :: k).
(Costrong t p, Ob a, Ob x, Ob y) =>
p (Act t a x) (Act t a y) -> p x y
forall (t :: (Type, Type) +-> Type) (p :: CAT Type) a x y.
(Costrong t p, Ob a, Ob x, Ob y) =>
p (Act t a x) (Act t a y) -> p x y
coact @Tensor (((d, b) ~> (b, d))
-> ((c, d) ~> (d, c)) -> p (b, d) (c, d) -> p (d, b) (d, c)
forall c a b d. (c ~> a) -> (b ~> d) -> p a b -> p c d
forall {j} {k} (p :: j +-> k) (c :: k) (a :: k) (b :: j) (d :: j).
Profunctor p =>
(c ~> a) -> (b ~> d) -> p a b -> p c d
dimap (d, b) ~> (b, d)
(d, b) -> (b, d)
forall b a. (b, a) -> (a, b)
swap (c, d) ~> (d, c)
(c, d) -> (d, c)
forall b a. (b, a) -> (a, b)
swap p (b, d) (c, d)
p))