module Chapter10.Ornament.Examples.List where

open import Level
  renaming ( zero to zeroL
           ; suc to sucL )
open import Function

open import Data.Unit
open import Data.Nat
open import Data.Fin hiding (lift)
open import Data.Product

open import Chapter2.Logic

open import Chapter6.IDesc
open import Chapter6.IDesc.Fixpoint

open import Chapter6.IDesc.Examples.Nat

open import Chapter10.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 , lift tt 

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