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 `⊤
⟦_⟧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 : ∀{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 = ⊤