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

module Canon.Ref where

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

open import Core
open import Signature
open import Canon

open import Level as L

module RefCanon where

  data TRefShape : Set where ref : TRefShape
  TRefΣ = TRefShape  λ where ref  1

  ref′ :  TRefΣ  σ   (t : μ σ)  μ σ
  ref′ t = inject (ref , L.lift (t  []))

  open Algebra

  ReferenceVal : Values Sto TRefΣ 
  alg (out ReferenceVal) (ref , lift ((t , _)  [])) Σ = value t  Σ
  
  refCanon : ICanon Sto
  ICanon.ity  refCanon = TRefΣ 
  ICanon.ival refCanon = ReferenceVal 

open RefCanon public