open import Level

open import Chapter5.IDesc

open import Chapter8.Ornament

module Chapter9.Lift.Constructor
         { : Level}
         {I I⁺ : Set }
         {D : func  I I}
         {u : I⁺  I}
         (o : orn D u u)
       where

open import Data.Product

open import Chapter2.Logic 

open import Chapter5.IDesc.Fixpoint
open import Chapter5.IDesc.Induction

open import Chapter7.Case

open import Chapter8.Reornament o

open import Chapter9.Functions
open import Chapter9.FunOrnament
open import Chapter9.Patch

Extra : {i : I}{i⁺ : u ⁻¹ i}
         (x :  D ⟧func (μ D) i)  Set 
Extra {i⁺ = inv i⁺} x = Extension (orn.out o i⁺) x

Args : {i : I}{i⁺ : u ⁻¹ i}
       (x :  D ⟧func (μ D) i)
       (e : Extra {i⁺ = i⁺} x)  Set 
Args {i⁺ = inv i⁺} x e = 
    Structure (orn.out o i⁺) x e ⟧Orn  (μ reornD)

liftConstructor : {i : I}{i⁺ : u ⁻¹ i}
                  {T : Type }{T⁺ : FunctionOrn T}
                  {t :  T ⟧Type} 
                  {x :  D ⟧func (μ D) i}
                  (e : Extra {i⁺ = i⁺} x)  Args {i⁺ = i⁺} x e  Patch t T⁺ 
                  Patch ( x  , t) (μ⁺ o [ i⁺  T⁺)
liftConstructor {i⁺ = inv i⁺} e a p =  e , a  , p