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)