open import Level
open import Function

open import Data.Unit
open import Data.Product
open import Data.Nat
open import Data.Fin hiding (lift)

open import Chapter2.Logic

open import Chapter6.IDesc

open import Chapter10.Ornament

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


forgetOrnNat : ∀{X : K  Set }{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 (lift tt) = lift 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 }  
            {j : J} 
              o ⟧orn ⟧func (X  u) j   D ⟧func X (v j)
forgetNat {X} {j} = forgetOrnNat (orn.out o j)