open import Function

open import Data.Unit
open import Data.Product
open import Data.Nat
open import Data.Fin

open import Chapter1.Logic

open import Chapter2.IDesc

open import Chapter5.Ornament

module Chapter5.CartesianMorphism
           {I J K L : Set}
           {D : func K L}
           {u : I  K}{v : J  L}
           (o : orn D u v) where


forgetOrnNat : ∀{X D}  (O : Orn u D)  
              O ⟧Orn  (X  u)   D  X 
forgetOrnNat (insert S D⁺) (s , xs) = forgetOrnNat (D⁺ s) xs
forgetOrnNat (`var (inv i)) xs = xs
forgetOrnNat `1 tt = tt
forgetOrnNat (O₁  O₂) (t₁ , t₂) = forgetOrnNat O₁ t₁ , forgetOrnNat O₂ t₂
forgetOrnNat ( T⁺) (k , xs) = k , forgetOrnNat (T⁺ k) xs
forgetOrnNat ( T⁺) (s , xs) = s , forgetOrnNat (T⁺ s) xs
forgetOrnNat ( T⁺) f = λ s  forgetOrnNat (T⁺ s) (f s)
forgetOrnNat (deleteΣ s T⁺) xs = s , forgetOrnNat T⁺ xs
forgetOrnNat (deleteσ k T⁺) xs = k , forgetOrnNat T⁺ xs

forgetNat : {X : K  Set}  
              o ⟧orn ⟧func (X  u)   func.mk (func.out D  v) ⟧func X
forgetNat {X} {j} = forgetOrnNat (orn.out o j)