module Chapter11.Lift.Examples.Append
         {A : Set}
       where

open import Level hiding (zero ; suc)

open import Data.Unit
open import Data.Product
open import Data.Fin hiding (_+_ ; fold ; lift)

open import Chapter2.Logic

open import Chapter6.IDesc.Fixpoint
open import Chapter6.IDesc.Induction
open import Chapter6.IDesc.Examples.Nat
open import Chapter6.IDesc.Examples.Bool

open import Chapter10.Reornament
open import Chapter10.Ornament.Examples.List

open import Chapter10.Reornament.Examples.List

open import Chapter11.Functions.Examples.Plus
open import Chapter11.FunOrnament.Examples.Append
open import Chapter11.Patch.Examples.Append

open import Chapter11.Functions
open import Chapter11.FunOrnament
open import Chapter11.Patch
open import Chapter11.Lift.Induction
open import Chapter11.Lift.Constructor

αL : (m : Nat) 
     μ (reornD (ListO A)) (tt , m) 
     DAlgLift (ListO A)
               {i}{xs}  α m {i}{xs}) 
              (μ⁺ ListO A [ inv tt  `⊤)
αL m xs {tt ,  zero , lift tt } {lift tt , lift tt} (lift tt) = xs , lift tt
αL m xs {tt ,  suc zero , n , lift tt } {(a , lift tt , lift tt) , ys , lift tt} ((ih , lift tt) , lift tt) =
     liftConstructor (ListO A) {i⁺ = inv tt} {T = `⊤} {T⁺ = `⊤} 
                     (a , (lift tt , lift tt)) 
                     (ih , lift tt) (lift tt)
αL m xs {tt ,  suc (suc ()) , _ } _

vappend :  Patch _+_ (typeAppend A)
vappend m xs n ys = liftInd (ListO A) {tt} {inv tt}
                            {T = μ NatD [ tt  `⊤} 
                            {T⁺ = μ⁺ ListO A [ inv tt  `⊤ }
                             {i}{hs}  α m {i}{hs}) 
                             {i}{hs}  αL m xs {i}{hs}) n ys

open import Chapter11.Patch.Apply

append :  typeAppend A ⟧FunctionOrn
append = patch (typeAppend A) _+_ vappend