{-# OPTIONS --safe --without-K #-}

module Interface.MonotoneState where

open import Relation.Unary                        using (IUniversal ; _⇒_ ; U)
open import Relation.Binary                       using (Rel)
open import Relation.Binary.PropositionalEquality
open import Relation.Binary.Structures

open import Core
open import Signature
open import Structure.Monad
open import MonadicFragment

open import Data.Product
open import Data.Vec
open import Data.List
open import Data.List.Relation.Unary.All
open import Data.List.Membership.Propositional

import Level as L

module _ (M : Eff Sto) where


  record MonotoneState : Set₁ where
    field
    
      get   :  {Γ V t}  ∀[  (value t ∈_)
                             M {σ} V Γ (V t)
                           ]
      
      put   :  {Γ V t}  ∀[  (value t ∈_)
                             V t
                             M {σ} V Γ U
                           ]

      
      alloc :  {Γ V t}  ∀[  V t
                             M {σ} V Γ (value t ∈_)
                           ]