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 ⟩