open import Level

open import Data.Nat
open import Data.Fin
open import Data.Product
open import Data.Sum
open import Data.Unit

open import Relation.Binary.PropositionalEquality

open import Chapter2.Logic

open import Chapter5.IDesc
open import Chapter5.IDesc.Fixpoint
open import Chapter5.IDesc.InitialAlgebra
open import Chapter5.IDesc.Induction

open import Chapter8.Ornament.Examples.Lifting
open import Chapter8.Ornament


module Chapter8.AlgebraicOrnament
           { : Level}
           {K : Set }
           {X : K  Set } where

I : Set 
I = Σ K X

u : I  K
u = proj₁

module Desc
         (k : K)
         (x : X k)
         (D : IDesc  K)
         (α :  D  X  X k) where

  algOrn :  Orn u D
  algOrn = insert ( D  X) λ xs 
           insert (α xs  x) λ _  
           [_]^h {L = K} D xs

  algOrnD : IDesc  I
  algOrnD =  algOrn ⟧Orn

module Func 
         (D : func  K K)
         (α : Alg D X) where

  algOrn : orn D u u
  algOrn = orn.mk λ { (k , xs)  Desc.algOrn k xs (func.out D k) (α {k}) }

  algOrnD : func  I I
  algOrnD =  algOrn ⟧orn

open Func public

{-
algOrn : orn D u u
algOrn = orn.mk λ { (k , x) → insert (⟦ D ⟧func X k) λ xs →
                              insert (α xs ≡ x) λ _ → 
                              orn.out [ D ]^ (k , xs) }

algOrnD : func I I
algOrnD = ⟦ algOrn ⟧orn
-}