module Chapter6.Patch.Apply where open import Data.Unit open import Data.Product open import Chapter1.Logic open import Chapter2.IDesc.Fixpoint open import Chapter5.Ornament open import Chapter5.Ornament.Algebra open import Chapter5.Reornament open import Chapter5.Reornament.Make open import Chapter5.Reornament.Algebra open import Chapter6.Functions open import Chapter6.FunOrnament open import Chapter6.Patch patch : ∀{T} → (fo : FunctionOrn T)(f : ⟦ T ⟧Type) → Patch f fo → ⟦ fo ⟧FunctionOrn patch (μ⁺ o [ inv i⁺ ]→ T⁺) f p = λ x → patch T⁺ (f (forgetOrnament o x)) (p (forgetOrnament o x) (makeAlg o x)) patch (μ⁺ o [ inv i⁺ ]× T⁺) (x , xs) (x⁺⁺ , p) = forgetReornament o x⁺⁺ , patch T⁺ xs p patch `⊤ tt tt = tt