module StateSizedIO.GUI.BaseStateDependent where
open import Size renaming (Size to AgdaSize)
open import NativeIO
open import Function
open import Agda.Primitive
open import Level using (_⊔_) renaming (suc to lsuc)
record IOInterfaceˢ {γ ρ μ} : Set (lsuc (γ ⊔ ρ ⊔ μ )) where
field
Stateˢ : Set γ
Commandˢ : Stateˢ → Set ρ
Responseˢ : (s : Stateˢ) → Commandˢ s → Set μ
nextˢ : (s : Stateˢ) → (c : Commandˢ s) → Responseˢ s c → Stateˢ
open IOInterfaceˢ public
module _ {α γ ρ μ}(i : IOInterfaceˢ {γ} {ρ} {μ} )
(let S = Stateˢ i) (let C = Commandˢ i)
(let R = Responseˢ i) (let next = nextˢ i)
where
mutual
record IOˢ (i : AgdaSize) (A : S → Set α) (s : S) : Set (lsuc (α ⊔ γ ⊔ ρ ⊔ μ )) where
coinductive
constructor delay
field
forceˢ : {j : Size< i} → IOˢ' j A s
data IOˢ' (i : AgdaSize) (A : S → Set α) : S → Set (lsuc (α ⊔ γ ⊔ ρ ⊔ μ )) where
doˢ' : {s : S} → (c : C s) → (f : (r : R s c) → IOˢ i A (next s c r) )
→ IOˢ' i A s
returnˢ' : {s : S} → (a : A s) → IOˢ' i A s
data IOˢ+ (i : AgdaSize) (A : S → Set α ) : S → Set (lsuc (α ⊔ γ ⊔ ρ ⊔ μ )) where
doˢ' : {s : S} → (c : C s) (f : (r : R s c) → IOˢ i A (next s c r))
→ IOˢ+ i A s
open IOˢ public
module _ {α γ ρ μ}{I : IOInterfaceˢ {γ} {ρ} {μ}}
(let S = Stateˢ I) (let C = Commandˢ I)
(let R = Responseˢ I) (let next = nextˢ I) where
returnˢ : ∀{i}{A : S → Set α} {s : S} (a : A s) → IOˢ I i A s
forceˢ (returnˢ a) = returnˢ' a
doˢ : ∀{i}{A : S → Set α} {s : S} (c : C s)
(f : (r : R s c) → IOˢ I i A (next s c r))
→ IOˢ I i A s
forceˢ (doˢ c f) = doˢ' c f
module _ {γ ρ}{I : IOInterfaceˢ {γ} {ρ} {lzero}}
(let S = Stateˢ I) (let C = Commandˢ I)
(let R = Responseˢ I) (let next = nextˢ I) where
{-# NON_TERMINATING #-}
translateIOˢ : ∀{A : Set }{s : S}
→ (translateLocal : (s : S) → (c : C s) → NativeIO (R s c))
→ IOˢ I ∞ (λ s → A) s
→ NativeIO A
translateIOˢ {A} {s} translateLocal p = case (forceˢ p {_}) of
λ{ (doˢ' {.s} c f) → (translateLocal s c) native>>= λ r →
translateIOˢ translateLocal (f r)
; (returnˢ' a) → nativeReturn a
}