open import Data.Unit
open import Data.Sum
open import Data.Product

open import Chapter1.Logic

open import Chapter2.Desc
open import Chapter2.Desc.Fixpoint

module Chapter2.Desc.InitialAlgebra
          {X : Set}
          (D : Desc)
          (α :  D  X  X) where

mutual
  fold : μ D  X 
  fold  xs  = α (hyps D xs)

  hyps : (D' : Desc)  
         (xs :  D'  (μ D)) 
          D'  X
  hyps `1 tt = tt
  hyps `var xs = fold xs
  hyps (T  T') (t , t') = hyps T t , hyps T' t'
  hyps (T `+ T') (inj₁ t) = inj₁ (hyps T t)
  hyps (T `+ T') (inj₂ t') = inj₂ (hyps T' t')
  hyps ( S T) (s , xs) = s , hyps (T s) xs
  hyps ( S T) f = λ s  hyps (T s) (f s)