module Chapter3.Desc.FreeMonad.Examples.TermIO where open import Data.Empty open import Data.Unit open import Data.Product open import Data.Nat hiding (_*_) open import Data.Fin open import Data.Vec hiding (_>>=_ ; _++_) open import Data.String open import Relation.Binary.PropositionalEquality open import Category.Monad open import Chapter2.Desc open import Chapter2.Desc.Tagged open import Chapter2.Desc.Fixpoint open import Chapter2.Desc.InitialAlgebra open import Chapter3.Desc.FreeMonad open import Chapter3.Desc.FreeMonad.Monad ΣIO : tagDesc ΣIO = 2 , (`Σ String λ _ → (`Π ⊤ λ _ → `var) `× `1) ∷ ((`Π String λ _ → `var) `× `1) ∷ [] TermIO : Set → Set TermIO X = ΣIO * X return : ∀{X} → X → TermIO X return = `v putString : String → TermIO ⊤ putString s = ⟨ suc zero , s , return , tt ⟩ getString : TermIO String getString = ⟨ suc (suc zero) , return , tt ⟩ example : TermIO ⊤ example = getString >>= λ s₁ → getString >>= λ s₂ → putString (s₁ ++ s₂) where open RawMonad (monad ΣIO)