3 | module Control.Category.Instances.Type
5 | import Control.Category
6 | import Control.Category.Records
14 | data Typ : (a,b : Type0) -> Type where
15 | MkTyp : (a.runW0 -> b.runW0) -> Typ a b
17 | public export %inline %tcinline
18 | runTyp : Typ a b -> a.runW0 -> b.runW0
19 | runTyp (MkTyp f) = f
21 | public export %inline %tcinline
22 | (.runTyp) : Typ a b -> a.runW0 -> b.runW0
25 | public export %inline
26 | Typ_ : (0 a,b : Type) -> Type
27 | Typ_ a b = Typ (W0 a) (W0 b)
31 | Pair : Type0 -> Type0 -> Type0
35 | Either : Type0 -> Type0 -> Type0
36 | Either = liftW2 Either
39 | TypHom : Type0 -> Type0 -> Type0
40 | TypHom a b = W0 (Typ a b)
50 | MkTyp f . MkTyp g = MkTyp (f . g)
53 | SemigroupoidTyp : Semigroupoid Typ
54 | SemigroupoidTyp = FromCategory
60 | namespace CatFunctor
62 | [FromFunctor] Functor f => CatFunctor Typ Typ (liftW f) where
63 | map {a=W0 _,b=W0 _} (MkTyp f) = MkTyp (map f)
67 | FromMonad : Monad m => CatMonad Typ (liftW m)
68 | FromMonad = MkCatMonad @{FromFunctor} (MkTyp Prelude.join) (MkTyp pure)
70 | namespace CatBifunctor
72 | [FromBifunctor] Bifunctor f => CatBifunctor Typ Typ Typ (liftW2 f) where
73 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
76 | CatBifunctor Typ Typ Typ Pair where
77 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
80 | CatBifunctor Typ Typ Typ Either where
81 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
85 | FromTensor : {ten,i : _} -> Tensor ten i => Monoidal Typ (liftW2 ten) (W0 i)
86 | FromTensor = MkMonoidal @{%search} @{FromBifunctor}
89 | (MkTyp unitl.leftToRight)
90 | (MkTyp unitl.rightToLeft)
91 | (MkTyp unitr.leftToRight)
92 | (MkTyp unitr.rightToLeft)
95 | Monoidal Typ Pair (W0 ()) where
96 | assoc = MkTyp (\((x,y),z) => (x,(y,z)))
97 | assoc' = MkTyp (\(x,(y,z)) => ((x,y),z))
99 | unitl' = MkTyp ((),)
101 | unitr' = MkTyp (,())
104 | Monoidal Typ Either (W0 Void) where
105 | assoc = MkTyp $
either (either Left (Right . Left)) (Right . Right)
106 | assoc' = MkTyp $
either (Left . Left) (either (Left . Right) Right)
107 | unitl = MkTyp $
either absurd id
108 | unitl' = MkTyp Right
109 | unitr = MkTyp $
either id absurd
110 | unitr' = MkTyp Left
112 | namespace StrongFunctor
114 | FromFunctor : Functor f => StrongFunctor Typ Pair (liftW f)
115 | FromFunctor = MkStrongFunctor @{FromFunctor}
116 | (MkTyp $
\(x,y) => map (x,) y)
117 | (MkTyp $
\(x,y) => map (,y) x)
120 | FromApplicative : Applicative f => Bitraversable ten => StrongFunctor Typ (liftW2 ten) (liftW f)
121 | FromApplicative = MkStrongFunctor @{FromFunctor}
122 | (MkTyp $
bitraverse pure id)
123 | (MkTyp $
bitraverse id pure)
125 | namespace StrongMonad
127 | FromMonad : Monad m => Bitraversable ten => StrongMonad Typ (liftW2 ten) (liftW m)
128 | FromMonad = (FromMonad, FromApplicative)
132 | FromTensor : {ten,i : _} -> (Tensor ten i, Symmetric ten) => Braided Typ (liftW2 ten) (W0 i)
133 | FromTensor = MkBraided @{FromTensor} (MkTyp swap') (MkTyp swap')
136 | Braided Typ Pair (W0 ()) where
140 | Braided Typ Either (W0 Void) where
141 | braid = MkTyp mirror
144 | Cartesian Typ Pair (W0 ()) where
147 | prod (MkTyp f) (MkTyp g) = MkTyp $
\x => (f x, g x)
149 | elim = MkTyp $
const ()
152 | Cocartesian Typ Either (W0 Void) where
155 | coprod (MkTyp f) (MkTyp g) = MkTyp $
either f g
156 | merge = MkTyp fromEither
157 | intro = MkTyp absurd
160 | Closed Typ Pair TypHom (W0 ()) where
161 | curry (MkTyp f) = MkTyp $
\x => MkTyp (curry f x)
162 | uncurry (MkTyp f) = MkTyp $
uncurry $
\x => (f x).runTyp
165 | Bimonoidal Typ Either Pair (W0 Void) (W0 ()) where
166 | distribl = MkTyp $
\(x,y) => bimap (x,) (x,) y
167 | distribl' = MkTyp $
either (mapSnd Left) (mapSnd Right)
168 | distribr = MkTyp $
\(x,y) => bimap (,y) (,y) x
169 | distribr' = MkTyp $
either (mapFst Left) (mapFst Right)
170 | absorbl = MkTyp snd
171 | absorbl' = MkTyp absurd
172 | absorbr = MkTyp fst
173 | absorbr' = MkTyp absurd
180 | namespace SemigroupoidR
182 | Typ : SemigroupoidR
183 | Typ = MkSemigroupoidR Typ
185 | namespace CategoryR
188 | Typ = MkCategoryR Typ
190 | namespace CatBifunctor
192 | Pair : BifunctorR Typ Typ Typ
193 | Pair = MkBifunctorR Pair
196 | Either : BifunctorR Typ Typ Typ
197 | Either = MkBifunctorR Either
199 | namespace MonoidalR
201 | TypPair : MonoidalR
202 | TypPair = MkMonoidalR Typ Pair (W0 ())
205 | TypEither : MonoidalR
206 | TypEither = MkMonoidalR Typ Either (W0 Void)
211 | TypPair = MkBraidedR Typ Pair (W0 ())
214 | TypEither : BraidedR
215 | TypEither = MkBraidedR Typ Either (W0 Void)
217 | namespace CartesianR
220 | Typ = MkCartesianR Typ Pair (W0 ())
222 | namespace CocartesianR
225 | Typ = MkCocartesianR Typ Either (W0 Void)
230 | Typ = MkClosedR Typ Pair TypHom (W0 ())
232 | namespace BimonoidalR
235 | Typ = MkBimonoidalR Typ Either Pair (W0 Void) (W0 ())
237 | namespace RigCategoryR
240 | Typ = MkRigCategoryR Typ Either Pair (W0 Void) (W0 ())
242 | namespace SymRigCategoryR
244 | Typ : SymRigCategoryR
245 | Typ = MkSymRigCategoryR Typ Either Pair (W0 Void) (W0 ())
247 | namespace DistributiveR
249 | Typ : DistributiveR
250 | Typ = MkDistributiveR Typ Either Pair (W0 Void) (W0 ())