module Chapter3.Desc.FreeMonad where

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

open import Chapter2.Desc
open import Chapter2.Desc.Tagged
open import Chapter2.Desc.Fixpoint

infix 40 _*_
infix 40 _*D_


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

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

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

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