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

open import Chapter8.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