module Chapter8.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 Chapter5.IDesc
open import Chapter5.IDesc.Fixpoint
open import Chapter5.IDesc.Examples.Nat
open import Chapter8.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 ⟩