module Chapter6.Desc.FreeMonad where

open import Level hiding (zero ; suc)

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 Chapter4.Desc
open import Chapter4.Desc.Tagged
open import Chapter4.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 : Set }  X  D * X
`v x =  lift zero , x , lift tt  

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