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

module Canon.Function 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 FunCanon where

  data TFunctionShape : Set where fun : TFunctionShape
  TFunctionΣ = TFunctionShape  λ where fun  2

  fun′ :  TFunctionΣ  σ   (s t : μ σ)  μ σ
  fun′ s t = inject (fun , L.lift (s  t  []))

  open Algebra

  FunctionVal : Values Sto TFunctionΣ 
  alg (out FunctionVal) (fun , lift ((s , _)  (t , _)  [])) Σ = closure s t  Σ

  funCanon : ICanon Sto
  ICanon.ity  funCanon = TFunctionΣ
  ICanon.ival funCanon = FunctionVal

open FunCanon public