module Chapter11.Patch.Coherence where

open import Level

open import Data.Unit
open import Data.Product

open import Chapter2.Logic

open import Chapter6.IDesc.Fixpoint

open import Chapter10.Ornament
open import Chapter10.Ornament.Algebra 
open import Chapter10.Reornament
open import Chapter10.Reornament.Make
open import Chapter10.Reornament.Algebra
open import Chapter10.Reornament.Coherence

open import Chapter11.Functions
open import Chapter11.FunOrnament
open import Chapter11.Patch
open import Chapter11.Patch.Apply


⊢Coherence : ∀{}{T : Type }  (T⁺ : FunctionOrn T)(f :  T ⟧Type)
             (p : Patch f T⁺)   T⁺ ⟧Coherence f (patch T⁺ f p)
⊢Coherence (μ⁺ o [ inv i⁺ ]→ T⁺) f f⁺ = 
  λ x  ⊢Coherence T⁺ 
                   (f (forgetOrnament o x)) 
                   (f⁺ (forgetOrnament o x)
                       (makeAlg o x))
⊢Coherence (μ⁺ o [ inv i⁺  T⁺) (x , xs) (x⁺ , xs⁺) = 
  coherentOrn o x⁺ , ⊢Coherence T⁺ xs xs⁺
⊢Coherence `⊤ (lift tt) (lift tt) = lift tt