{-# OPTIONS --safe --sized-types #-} module Generic.Semantics.Contract where open import Size open import Data.List hiding ([_] ; lookup) open import Data.Maybe as Maybe open import Data.Maybe.Categorical open import Function open import Relation.Binary.PropositionalEquality hiding ([_]) open ≡-Reasoning open import Relation.Unary open import Data.Var open import Data.Var.Varlike open import Data.Environment open import Data.Relation open import Generic.Syntax open import Generic.Semantics open Semantics private variable I : Set σ τ : I Γ Δ : List I d : Desc I MVar : I ─Scoped MVar i Γ = Maybe (Var i Γ) th^MVar : Thinnable (MVar σ) th^MVar mv ρ = Maybe.map (λ v → th^Var v ρ) mv vl^MVar : VarLike {I} MVar th^𝓥 vl^MVar = th^MVar new vl^MVar = just z MTm : ∀ d → I ─Scoped MTm d i Γ = Maybe (Tm d _ i Γ) Contract : Semantics d MVar (MTm d) th^𝓥 Contract = th^MVar var Contract = Maybe.map `var alg Contract = Maybe.map `con ∘ mapA _ (reify vl^MVar) where instance _ = applicative contract : Tm d _ σ (τ ∷ Γ) → Maybe (Tm d _ σ Γ) contract = semantics Contract (pack just ∙ nothing)