module Chapter10.Brady.Fin where

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

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

open import Relation.Binary.PropositionalEquality

open import Chapter2.Logic

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

open import Chapter10.Ornament

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

Fin' :   Set
Fin' = μ  FinO ⟧orn 

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

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