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 Chapter6.IDesc
open import Chapter6.IDesc.Fixpoint
open import Chapter6.IDesc.InitialAlgebra
open import Chapter6.IDesc.Induction

open import Chapter10.Ornament.Examples.Lifting
open import Chapter10.Ornament


module Chapter10.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
-}