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 _*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 ⟩