module Chapter6.Desc.FreeMonad.Examples.TermIO where
open import Level
renaming ( zero to zeroL
; suc to sucL )
open import Data.Empty
open import Data.Unit
open import Data.Product
open import Data.Nat hiding (_*_)
open import Data.Fin hiding (lift)
open import Data.Vec hiding (_>>=_ ; _++_)
open import Data.String
open import Relation.Binary.PropositionalEquality
open import Category.Monad
open import Chapter4.Desc
open import Chapter4.Desc.Tagged
open import Chapter4.Desc.Fixpoint
open import Chapter4.Desc.InitialAlgebra
open import Chapter6.Desc.FreeMonad
open import Chapter6.Desc.FreeMonad.Monad
ΣIO : tagDesc zeroL
Σ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 = ⟨ lift (suc zero) , s , return , lift tt ⟩
getString : TermIO String
getString = ⟨ lift (suc (suc zero)) , return , lift tt ⟩
example : TermIO ⊤
example = getString >>= λ s₁ →
getString >>= λ s₂ →
putString (s₁ ++ s₂)
where open RawMonad (monad ΣIO)