module Chapter3.IDesc.FreeMonad 
         {I : Set}
       where

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

open import Chapter1.Logic

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

--infix 40 _*_
infix 40 _*D_


_*D_ : tagDesc I  (I  Set)  tagDesc I
((cs , ds) , itags) *D X = (suc cs ,  i  ( (X i) λ _  `1)  
                                            ds i)) ,
                           itags

_*_ : tagDesc I  (I  Set)  I  Set
D * X = μ (toDesc (D *D X))

`v : ∀{D X}  X  D * X
`v x =  zero , x , tt  

`comp : ∀{D X}   toDesc D ⟧func (D * X)  D * X
`comp (k , xs) =  suc k , xs