module Scoped.State where
open import Function
open import Data.Unit
open import Data.Product
open import Data.Sum
open import Container
open import Scoped.Prog
module _ where
open Con
data StateCmd (H : Set) : Set where
`get : StateCmd H
`put : (h : H) → StateCmd H
StateSig : Set → Con
S (StateSig H) = StateCmd H
P (StateSig H) `get = H
P (StateSig H) (`put s) = ⊤
variable H : Set
hSt' : H → Prog (StateSig H ∪ σ) γ A → Prog σ γ (A × H)
hSt' h (var x) = var (x , h)
hSt' h (op (inj₁ `get) k) = hSt' h (k h)
hSt' _ (op (inj₁ (`put h)) k) = hSt' h (k tt)
hSt' h (op (inj₂ y) k) = op y (hSt' h ∘ k)
hSt' h (scope g sc k) =
scope g (hSt' h ∘ sc) (λ{ (x , h') → hSt' h' (k x) })