module Chapter6.FunOrnament where

open import Data.Unit
open import Data.Product

open import Relation.Binary.PropositionalEquality

open import Chapter1.Logic

open import Chapter2.IDesc.Fixpoint

open import Chapter5.Ornament
open import Chapter5.Ornament.Algebra 

open import Chapter6.Functions

data FunctionOrn : Type  Set₂ where
  μ⁺_[_]→_ : ∀{I I⁺ D i T}{u : I⁺  I}  
                 (o : orn D u u)(i⁻¹ : u ⁻¹ i)
                 (T⁺ : FunctionOrn T)  FunctionOrn (μ D [ i ]→ T)
  μ⁺_[_]×_ : ∀{I I⁺ D i T}{u : I⁺  I} 
                 (o : orn D u u)(i⁻¹ : u ⁻¹ i)
                 (T⁺ : FunctionOrn T)  FunctionOrn (μ D [ i  T)
  `⊤ : FunctionOrn `⊤

-- * Projections

-- ** Lifted function

⟦_⟧FunctionOrn : ∀{T}  FunctionOrn T  Set
 μ⁺ o [ inv i⁺ ]→ T⁺ ⟧FunctionOrn = μ  o ⟧orn i⁺   T⁺ ⟧FunctionOrn
 μ⁺ o [ inv i⁺  T⁺ ⟧FunctionOrn = μ  o ⟧orn i⁺ ×  T⁺ ⟧FunctionOrn
 `⊤ ⟧FunctionOrn = 

-- ** Coherence proof

⟦_⟧Coherence : ∀{T}  (fo : FunctionOrn T)   T ⟧Type   fo ⟧FunctionOrn  Set
 μ⁺ o [ inv i⁺ ]→ T⁺ ⟧Coherence f f⁺ = 
  (x⁺ : μ  o ⟧orn i⁺)   T⁺ ⟧Coherence (f (forgetOrnament o x⁺)) (f⁺ x⁺)
 μ⁺ o [ inv i⁺  T⁺ ⟧Coherence (x , xs) (x⁺ , xs⁺) = 
  x  forgetOrnament o x⁺ ×  T⁺ ⟧Coherence xs xs⁺ 
 `⊤ ⟧Coherence tt tt =