|
9 | 9 | module Codata.Thunk where
|
10 | 10 |
|
11 | 11 | open import Level
|
12 |
| -open import Size |
13 |
| - |
14 |
| -private |
15 |
| - variable |
16 |
| - ℓ ℓ₁ ℓ₂ : Level |
| 12 | +open import Size; open SizedType |
17 | 13 |
|
18 | 14 | ------------------------------------------------------------------------
|
19 | 15 | -- Basic types.
|
20 | 16 |
|
21 |
| -SizedType : (ℓ : Level) → Set (suc ℓ) |
22 |
| -SizedType ℓ = Size → Set ℓ |
23 |
| - |
24 |
| -∀ˢ[_] : SizedType ℓ → Set ℓ |
25 |
| -∀ˢ[ F ] = ∀{i} → F i |
26 |
| - |
27 |
| -infixr 8 _⇒ˢ_ |
28 |
| - |
29 |
| -_⇒ˢ_ : SizedType ℓ₁ → SizedType ℓ₂ → SizedType (ℓ₁ ⊔ ℓ₂) |
30 |
| -F ⇒ˢ G = λ i → F i → G i |
31 |
| - |
32 | 17 | record Thunk {ℓ} (F : Size → Set ℓ) (i : Size) : Set ℓ where
|
33 | 18 | coinductive
|
34 | 19 | field force : {j : Size< i} → F j
|
@@ -57,26 +42,26 @@ syntax Thunk-syntax (λ j → e) i = Thunk[ j < i ] e
|
57 | 42 | -- Thunk is a functor
|
58 | 43 | module _ {p q} {P : Size → Set p} {Q : Size → Set q} where
|
59 | 44 |
|
60 |
| - map : ∀ˢ[ P ⇒ˢ Q ] → ∀ˢ[ Thunk P ⇒ˢ Thunk Q ] |
| 45 | + map : ∀[ P ⇒ Q ] → ∀[ Thunk P ⇒ Thunk Q ] |
61 | 46 | map f p .force = f (p .force)
|
62 | 47 |
|
63 | 48 | -- Thunk is a comonad
|
64 | 49 | module _ {p} {P : Size → Set p} where
|
65 | 50 |
|
66 |
| - extract : ∀ˢ[ Thunk P ] → P ∞ |
| 51 | + extract : ∀[ Thunk P ] → P ∞ |
67 | 52 | extract p = p .force
|
68 | 53 |
|
69 |
| - duplicate : ∀ˢ[ Thunk P ⇒ˢ Thunk (Thunk P) ] |
| 54 | + duplicate : ∀[ Thunk P ⇒ Thunk (Thunk P) ] |
70 | 55 | duplicate p .force .force = p .force
|
71 | 56 |
|
72 | 57 | module _ {p q} {P : Size → Set p} {Q : Size → Set q} where
|
73 | 58 |
|
74 | 59 | infixl 1 _<*>_
|
75 |
| - _<*>_ : ∀ˢ[ Thunk (P ⇒ˢ Q) ⇒ˢ Thunk P ⇒ˢ Thunk Q ] |
| 60 | + _<*>_ : ∀[ Thunk (P ⇒ Q) ⇒ Thunk P ⇒ Thunk Q ] |
76 | 61 | (f <*> p) .force = f .force (p .force)
|
77 | 62 |
|
78 | 63 | -- We can take cofixpoints of functions only making Thunk'd recursive calls
|
79 | 64 | module _ {p} (P : Size → Set p) where
|
80 | 65 |
|
81 |
| - cofix : ∀ˢ[ Thunk P ⇒ˢ P ] → ∀ˢ[ P ] |
| 66 | + cofix : ∀[ Thunk P ⇒ P ] → ∀[ P ] |
82 | 67 | cofix f = f λ where .force → cofix f
|
0 commit comments