{-# OPTIONS --type-in-type #-}

module Chapter3.IDesc where

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

open import Chapter2.IDesc
open import Chapter2.IDesc.Tagged
open import Chapter2.IDesc.Fixpoint

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

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

IDesc' : Set  Set₁
IDesc' I = μ (IDescD I) tt

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

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

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

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

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

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