2 | module Control.Category.Instances.Op
4 | import Control.Category
5 | import Control.Category.Records
11 | record Op (cat : a -> b -> Type)
12 | (x : b) (y : a) where
22 | Semigroupoid cat => Semigroupoid (Op cat) where
23 | MkOp f . MkOp g = MkOp (g . f)
26 | Category cat => Category (Op cat) where
28 | MkOp f . MkOp g = MkOp (g . f)
31 | CatFunctor cat cat' f => CatFunctor (Op cat) (Op cat') f where
32 | map = MkOp . map . runOp
35 | CatBifunctor catA catB cat' f => CatBifunctor (Op catA) (Op catB) (Op cat') f where
36 | bimap (MkOp f) (MkOp g) = MkOp $
bimap f g
39 | {ten,i : _} -> Monoidal cat ten i => Monoidal (Op cat) ten i where
48 | {ten,i : _} -> Braided cat ten i => Braided (Op cat) ten i where
53 | {ten,i : _} -> MonSymmetric cat ten i => MonSymmetric (Op cat) ten i where
54 | permute p = MkOp $
replace {p = cat _ . TenSeq ten i}
55 | (trans (sym $
permuteListComp xs (inverse p) p) $
56 | trans (cong (permuteList xs) (compInvLeft p)) $
58 | permute {cat,ten,xs = permuteList xs p} $
inverse $
rewrite permuteListLength xs p in p
61 | {ten,i : _} -> Cocartesian cat ten i => Cartesian (Op cat) ten i where
64 | prod (MkOp f) (MkOp g) = MkOp $
coprod f g
66 | elim = MkOp $
intro {ten}
69 | {ten,i : _} -> Cartesian cat ten i => Cocartesian (Op cat) ten i where
72 | coprod (MkOp f) (MkOp g) = MkOp $
prod f g
74 | intro = MkOp $
elim {ten}
77 | {ten,i : _} -> Traced cat ten i => Traced (Op cat) ten i where
78 | tracel = MkOp . tracel . runOp
79 | tracer = MkOp . tracer . runOp
86 | namespace SemigroupoidR
88 | Op : (cat : SemigroupoidR) -> SemigroupoidR
89 | Op (MkSemigroupoidR cat) = MkSemigroupoidR (Op cat)
93 | Op : (cat : CategoryR) -> CategoryR
94 | Op (MkCategoryR cat) = MkCategoryR (Op cat)
98 | Op : (cat : MonoidalR) -> MonoidalR
99 | Op (MkMonoidalR cat ten i) = MkMonoidalR (Op cat) ten i
103 | Op : (cat : BraidedR) -> BraidedR
104 | Op (MkBraidedR cat ten i) = MkBraidedR (Op cat) ten i
106 | namespace CartesianR
108 | Op : (cat : CocartesianR) -> CartesianR
109 | Op (MkCocartesianR cat ten i) = MkCartesianR (Op cat) ten i
111 | namespace CocartesianR
113 | Op : (cat : CartesianR) -> CocartesianR
114 | Op (MkCartesianR cat ten i) = MkCocartesianR (Op cat) ten i
118 | Op : (cat : TracedR) -> TracedR
119 | Op (MkTracedR cat ten i) = MkTracedR (Op cat) ten i
124 | Op : (f : FunctorR cat cat') -> FunctorR (Op cat) (Op cat')
125 | Op {cat=MkCategoryR{},cat'=MkCategoryR{}} (MkFunctorR f) = MkFunctorR f