module Chapter5.Ornament.Examples.List where

open import Function

open import Data.Unit
open import Data.Nat
open import Data.Fin
open import Data.Product

open import Chapter1.Logic

open import Chapter2.IDesc
open import Chapter2.IDesc.Fixpoint

open import Chapter2.IDesc.Examples.Nat

open import Chapter5.Ornament


ListO : Set  orn NatD id id 
ListO A = orn.mk λ _  
             { zero  `1 
                 ; (suc zero)  insert A  _  `var (inv tt)  `1) 
                 ; (suc (suc ())) })

List : Set  Set
List A = μ  ListO A ⟧orn tt

nil : ∀{A}  List A
nil =  zero , tt 

cons : ∀{A}  A  List A  List A
cons a xs =  suc zero , a , xs , tt