0 | module Control.Category.Records.Functor
2 | import Control.Category
3 | import Control.Category.Records.Category
6 | %prefix_record_projections off
13 | record FunctorR (cat,cat' : CategoryR) where
14 | constructor MkFunctorR
15 | fun : cat.obj -> cat'.obj
16 | {auto impl : CatFunctor cat.hom cat'.hom fun}
21 | EndofunctorR : (cat : CategoryR) -> Type
22 | EndofunctorR cat = FunctorR cat cat
27 | public export %inline
28 | (.functorR) : (rec : FunctorR cat cat') -> FunctorR cat cat'
32 | public export %inline
33 | (.map) : (rec : FunctorR cat cat') -> {a,b : _} ->
34 | cat.hom a b -> cat'.hom (rec.fun a) (rec.fun b)
35 | (.map) rec = map @{rec.impl}
43 | record BifunctorR (catA,catB,cat' : CategoryR) where
44 | constructor MkBifunctorR
45 | fun : catA.obj -> catB.obj -> cat'.obj
46 | {auto impl : CatBifunctor catA.hom catB.hom cat'.hom fun}
50 | BinoidalR : (catA,catB,cat' : CategoryR) -> Type
51 | BinoidalR = BifunctorR
56 | EndoBifunctorR : (cat : CategoryR) -> Type
57 | EndoBifunctorR cat = BifunctorR cat cat cat
61 | EndoBinoidalR : (cat : CategoryR) -> Type
62 | EndoBinoidalR = EndoBifunctorR
64 | namespace BifunctorR
67 | public export %inline
68 | (.bimap) : (rec : BifunctorR catA catB cat') -> {a,a',b,b' : _} ->
69 | catA.hom a b -> catB.hom a' b' -> cat'.hom (rec.fun a a') (rec.fun b b')
70 | (.bimap) rec = bimap @{rec.impl}
73 | public export %inline
74 | (.mapl) : {catB : _} -> (rec : BifunctorR catA catB cat') -> {a,b,c : _} ->
75 | catA.hom a b -> cat'.hom (rec.fun a c) (rec.fun b c)
76 | (.mapl) rec = mapl @{rec.impl} @{catB.impl}
79 | public export %inline
80 | (.mapr) : {catA : _} -> (rec : BifunctorR catA catB cat') -> {a,b,c : _} ->
81 | catB.hom a b -> cat'.hom (rec.fun c a) (rec.fun c b)
82 | (.mapr) rec = mapr @{rec.impl} @{catA.impl}
87 | public export %inline
88 | (.left) : {catB : _} -> (rec : BifunctorR catA catB cat') ->
89 | (l : catB.obj) -> FunctorR catA cat'
90 | (.left) {catB=MkCategoryR {}} (MkBifunctorR {} {fun,impl}) l =
91 | MkFunctorR (`fun` l) {impl = Left @{impl}}
94 | public export %inline
95 | (.right) : {catA : _} -> (rec : BifunctorR catA catB cat') ->
96 | (l : catA.obj) -> FunctorR catB cat'
97 | (.right) {catA=MkCategoryR {}} (MkBifunctorR {} {fun,impl}) l =
98 | MkFunctorR (l `fun`) {impl = Right @{impl}}