module Chapter6.IDesc where

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

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

open import Chapter5.IDesc
open import Chapter5.IDesc.Tagged
open import Chapter5.IDesc.Fixpoint

data IDescC { : Level} : Set  where
  `var` `1` `×` `σ` `Σ` `Π` : IDescC

IDescD : ∀( : Level){k}  Set k  func ((sucL )  k)  
IDescD  {k} I = func.mk λ _ 
              IDescC
                λ { `var`   (Lift {k}{sucL } I) λ _  `1 
                  ; `1`  `1 
                  ; `×`  `var tt  `var tt  `1 
                  ; `σ`   (Lift ) λ { (lift n)  ( (Lift (Fin n)) λ _  `var tt)  `1 }
                  ; `Σ`   (Lift {sucL }{k} (Set )) λ { (lift S)  ( (Lift {sucL }{k}  (Lift {}{sucL } S)) λ _  `var tt)  `1 }
                  ; `Π`   (Lift {sucL }{k} (Set )) λ { (lift S)  ( (Lift {sucL }{k}  (Lift {}{sucL } S)) λ _  `var tt)  `1 } }

IDesc' : ∀( : Level){k}  Set k  Set (k  (sucL ))
IDesc'  I = μ (IDescD  I) tt

`var' : ∀{ k}{I : Set k}  I  IDesc'  I
`var' i =  `var` , lift i , lift tt 

`1' : ∀{ k}{I : Set k}  IDesc'  I
`1' =  `1` , lift tt 

_`×'_ : ∀{ k}{I : Set k} (A B : IDesc'  I)  IDesc'  I
A `×' B =  `×` , A , B , lift tt 

`σ' : ∀{ k}{I : Set k} (n : )(T : Fin n  IDesc'  I)  IDesc'  I
`σ' n T =  `σ` , lift n ,  { (lift k)  T k }) , lift tt 

`Σ' : ∀{ k}{I : Set k} (S : Set )(T : S  IDesc'  I)  IDesc'  I
`Σ' S T =  `Σ` , lift S ,  {(lift (lift s))  T s }) , lift tt 

`Π' : ∀{ k}{I : Set k} (S : Set )(T : S  IDesc'  I)  IDesc'  I
`Π' S T =  `Π` , lift S ,  {(lift (lift s))  T s}) , lift tt