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

module Chapter3.IDesc.FreeMonad.Examples.IDesc where

open import Data.Unit
open import Data.Nat hiding (_*_)
open import Data.Fin
open import Data.Vec hiding (_>>=_)
open import Data.Product
open import Data.String

open import Chapter1.Logic

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

open import Chapter3.IDesc.FreeMonad
open import Chapter3.IDesc.FreeMonad.IMonad
open import Chapter3.IDesc.FreeMonad.Monad

IDescD : tagDesc 
IDescD = (5 ,  _  
            `1  
            `var tt  `var tt  `1  
            (  λ n  ( (Fin n) λ _  `var tt)  `1) 
            ( Set λ S  ( S λ _  `var tt)  `1)  
            ( Set λ S  ( S λ _  `var tt)  `1)  [])) ,
            _  0) , λ _  []

IDesc' : Set  Set₁
IDesc' I = (IDescD *  _  I)) tt

record func' (I J : Set) : Set₁ where
  constructor mk
  field
    out : J  IDesc' I


`var' : ∀{I}  I  IDesc' I
`var' i = `v {D = IDescD} i

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

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

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

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

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


_∘_ : ∀{I J K}  func' J K  func' I J  func' I K
D  E = func'.mk  k  func'.out D k >>= func'.out E)
  where open RawIMonad (monad IDescD)