|
1 | 1 | module Class.Convertible where |
2 | 2 |
|
3 | | -open import Function |
4 | | -open import Class.HasHsType |
5 | | -open import Class.Core |
6 | | -open import Class.Functor |
7 | | -open import Class.Bifunctor |
8 | | -open import Data.Maybe |
9 | | -open import Data.Product |
10 | | -open import Data.Sum |
11 | | -open import Data.List |
12 | | - |
13 | | -record Convertible (A B : Set) : Set where |
14 | | - field to : A → B |
15 | | - from : B → A |
16 | | -open Convertible ⦃...⦄ public |
17 | | - |
18 | | -HsConvertible : (A : Set) → ⦃ HasHsType A ⦄ → Set |
19 | | -HsConvertible A = Convertible A (HsType A) |
20 | | - |
21 | | -Convertible-Refl : ∀ {A} → Convertible A A |
22 | | -Convertible-Refl = λ where .to → id; .from → id |
23 | | - |
24 | | -Convertible₁ : (Set → Set) → (Set → Set) → Set₁ |
25 | | -Convertible₁ T U = ∀ {A B} → ⦃ Convertible A B ⦄ → Convertible (T A) (U B) |
26 | | - |
27 | | -Convertible₂ : (Set → Set → Set) → (Set → Set → Set) → Set₁ |
28 | | -Convertible₂ T U = ∀ {A B} → ⦃ Convertible A B ⦄ → Convertible₁ (T A) (U B) |
29 | | - |
30 | | -Functor⇒Convertible : ∀ {F : Type↑} → ⦃ Functor F ⦄ → Convertible₁ F F |
31 | | -Functor⇒Convertible = λ where |
32 | | - .to → fmap to |
33 | | - .from → fmap from |
34 | | - |
35 | | -Bifunctor⇒Convertible : ∀ {F} → ⦃ Bifunctor F ⦄ → Convertible₂ F F |
36 | | -Bifunctor⇒Convertible = λ where |
37 | | - .to → bimap to to |
38 | | - .from → bimap from from |
39 | | - |
40 | | -_⨾_ : ∀ {A B C} → Convertible A B → Convertible B C → Convertible A C |
41 | | -(c ⨾ c') .to = c' .to ∘ c .to |
42 | | -(c ⨾ c') .from = c .from ∘ c' .from |
43 | | - |
44 | | --- ** instances |
45 | | - |
46 | | -open import Foreign.Haskell |
47 | | -open import Foreign.Haskell.Coerce using (coerce) |
48 | | - |
49 | | -open import Data.Nat |
50 | | - |
51 | | -instance |
52 | | - Convertible-ℕ : Convertible ℕ ℕ |
53 | | - Convertible-ℕ = λ where |
54 | | - .to → id |
55 | | - .from → id |
56 | | - |
57 | | - Convertible-Maybe : Convertible₁ Maybe Maybe |
58 | | - Convertible-Maybe = Functor⇒Convertible |
59 | | - |
60 | | - Convertible-× : Convertible₂ _×_ _×_ |
61 | | - Convertible-× = Bifunctor⇒Convertible |
62 | | - |
63 | | - Convertible-Pair : Convertible₂ _×_ Pair |
64 | | - Convertible-Pair = λ where |
65 | | - .to → coerce ∘ bimap to to |
66 | | - .from → bimap from from ∘ coerce |
67 | | - |
68 | | - Convertible-⊎ : Convertible₂ _⊎_ _⊎_ |
69 | | - Convertible-⊎ = Bifunctor⇒Convertible |
70 | | - |
71 | | - Convertible-Either : Convertible₂ _⊎_ Either |
72 | | - Convertible-Either = λ where |
73 | | - .to → coerce ∘ bimap to to |
74 | | - .from → bimap from from ∘ coerce |
75 | | - |
76 | | - Convertible-List : Convertible₁ List List |
77 | | - Convertible-List = λ where |
78 | | - .to → fmap to |
79 | | - .from → fmap from |
80 | | - |
81 | | - Convertible-Fun : ∀ {A A' B B'} → ⦃ Convertible A A' ⦄ → ⦃ Convertible B B' ⦄ → Convertible (A → B) (A' → B') |
82 | | - Convertible-Fun = λ where |
83 | | - .to → λ f → to ∘ f ∘ from |
84 | | - .from → λ f → from ∘ f ∘ to |
| 3 | +open import Class.Convertible.Core public |
| 4 | +open import Class.Convertible.Instances public |
0 commit comments