module Chapter5.Brady.Fin where

open import Function

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

open import Relation.Binary.PropositionalEquality

open import Chapter1.Logic

open import Chapter2.IDesc.Tagged
open import Chapter2.IDesc.Fixpoint
open import Chapter2.IDesc.Examples.Fin

open import Chapter5.Ornament

FinO : orn (toDesc Constraint.FinD) id id
FinO = orn.mk λ { zero  insert  ⊥-elim
                ; (suc n)   {S = Fin 2} 
                            λ { zero  deleteΣ n
                                               (deleteΣ refl `1) 
                              ; (suc zero)  deleteΣ n 
                                                     (deleteΣ refl 
                                                              (`var (inv n)  `1)) 
                              ; (suc (suc ())) } }

Fin' :   Set
Fin' = μ  FinO ⟧orn 

fz : ∀{n}  Fin' (suc n)
fz =  zero , tt 

fs : ∀{n}  Fin' n  Fin' (suc n)
fs k =  suc zero , k , tt