module Chapter3.Desc.FreeMonad.Examples.List 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 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 ΣList : Set → tagDesc ΣList A = 1 , (`Σ A λ _ → `var `× `1) ∷ [] List : Set → Set List A = (ΣList A) * ⊤ nil : ∀{A} → List A nil = ⟨ zero , tt , tt ⟩ cons : ∀{A} → A → List A → List A cons a xs = ⟨ suc zero , a , xs , tt ⟩ append : ∀{A} → List A → List A → List A append {A} xs ys = xs >>= λ { tt → ys } where open RawMonad (monad (ΣList A)) module Test where test-nil : ∀{A xs} → append {A} nil xs ≡ xs test-nil = refl test-cons : ∀{A a xs ys} → append {A} (cons a xs) ys ≡ cons a (append xs ys) test-cons = refl