{-# LANGUAGE AllowAmbiguousTypes #-}
module Proarrow.Category.Bicategory.LaxFunctor where
import Data.Kind (Constraint, Type)
import Data.Proxy (Proxy)
import Prelude (type (~))
import Proarrow.Category.Bicategory (Bicategory (..))
import Proarrow.Core (CAT, CategoryOf (..))
type family Sort (kk :: CAT s) :: Type where
Sort (kk :: CAT s) = s
type (:->) :: forall s t. CAT s -> CAT t -> Type
type kk :-> ll = Proxy kk -> Proxy ll -> Type
type Map0 :: forall {s} {t} {kk :: CAT s} {ll :: CAT t}. (kk :-> ll) -> s -> t
type family Map0 f i
type Map1
:: forall {s} {t} {kk :: CAT s} {ll :: CAT t} {i :: s} {j :: s}
. forall (f :: kk :-> ll) -> kk i j -> ll (Map0 f i) (Map0 f j)
type family Map1 f a
type LaxFunctor :: forall {sk} {sl} {kk :: CAT sk} {ll :: CAT sl}. (kk :-> ll) -> Constraint
class (Bicategory kk, Bicategory ll) => LaxFunctor (f :: kk :-> ll) where
map2
:: forall {i} {j} (a :: kk i j) b
. (Ob0 kk i, Ob0 kk j, Ob a, Ob b)
=> (a ~> b) -> (Map1 f a ~> Map1 f b)
laxId
:: forall (i :: Sort kk)
. (Ob0 kk i)
=> I ~> Map1 f (I :: kk i i)
laxComp
:: forall {i} {j} {k} (a :: kk j k) (b :: kk i j)
. (Ob0 kk i, Ob0 kk j, Ob0 kk k, Ob a, Ob b)
=> (Map1 f a `O` Map1 f b) ~> Map1 f (a `O` b)
withMap0Ob0
:: forall (i :: Sort kk) r
. (Ob0 kk i)
=> ((Ob0 ll (Map0 f i)) => r)
-> r
withMap1Ob
:: forall {i} {j} (a :: kk i j) r
. (Ob0 kk i, Ob0 kk j, Ob a)
=> ((Ob (Map1 f a), Ob0 ll (Map0 f i), Ob0 ll (Map0 f j)) => r)
-> r
class (I ~ Map1 f (I :: kk i i)) => IsNormal (f :: kk :-> ll) (i :: Sort kk)
instance (I ~ Map1 f (I :: kk i i)) => IsNormal (f :: kk :-> ll) (i :: Sort kk)
class (LaxFunctor f, forall i. (Ob0 kk i) => IsNormal f i) => NormalLaxFunctor (f :: kk :-> ll)
instance (LaxFunctor f, forall i. (Ob0 kk i) => IsNormal f i) => NormalLaxFunctor (f :: kk :-> ll)