module TypeSound.Main where
open import TypeSound.Common
import TypeSound.Target as T
import TypeSound.Source as S
∥_∥ : S.Term → T.Term
∥_∥r : S.Record → T.Record
∥ S.rnil ∥r = T.rnil
∥ S.r⟦ l ↦ e ⟧ rs ∥r = T.r⟦ l ↦ ∥ e ∥ ⟧ (∥ rs ∥r)
∥ S.𝕔 S.lit x ∥ = T.lit x
∥ S.𝕔 S.flt x ∥ = T.flt x
∥ S.𝕔 S.+s ∥ = T.+
∥ S.𝕔 S.+i x ∥ = T.+i x
∥ S.𝕔 S.+f x ∥ = T.+f x
∥ S.` x ∥ = T.` x
∥ S.ƛ x ⇒ e ∥ = T.ƛ x ⇒ ∥ e ∥
∥ e S.· e₁ ∥ = ∥ e ∥ T.· ∥ e₁ ∥
∥ e S.⦂ x ∥ = ∥ e ∥
∥ S.𝕣 x ∥ = T.𝕣 ∥ x ∥r
∥ e S.𝕡 x ∥ = ∥ e ∥ T.𝕡 x
preserve-sub : ∀ {B j A}
→ B S.≤d j # A
→ B T.≤ A
preserve-sub S.≤d-Z = T.s-refl
preserve-sub S.≤d-int∞ = T.s-refl
preserve-sub S.≤d-float∞ = T.s-refl
preserve-sub S.≤d-top = T.s-top
preserve-sub (S.≤d-arr-∞ B≤A B≤A₁) = T.s-arr (preserve-sub B≤A) (preserve-sub B≤A₁)
preserve-sub (S.≤d-arr-S⇐ B≤A B≤A₁) = T.s-arr T.s-refl (preserve-sub B≤A₁)
preserve-sub (S.≤d-and₁ B≤A x) = T.s-and-l (preserve-sub B≤A)
preserve-sub (S.≤d-and₂ B≤A x) = T.s-and-r (preserve-sub B≤A)
preserve-sub (S.≤d-and B≤A B≤A₁) = T.s-and (preserve-sub B≤A) (preserve-sub B≤A₁)
preserve-sub (S.≤d-rcd∞ x) = T.s-rcd (preserve-sub x)
preserve-sub (S.≤d-arr-S⇒ x x₁) = T.s-arr (preserve-sub x) (preserve-sub x₁)
preserve-sub (S.≤d-rcd-Sl x) = T.s-rcd (preserve-sub x)
preserve : ∀ {Γ e j A}
→ Γ S.⊢d j # e ⦂ A
→ Γ T.⊢ ∥ e ∥ ⦂ A
preserve-r : ∀ {Γ j rs As}
→ Γ S.⊢r j # rs ⦂ As
→ Γ T.⊢r ∥ rs ∥r ⦂ As
preserve-r S.⊢r-nil = T.⊢r-nil
preserve-r (S.⊢r-one x) = T.⊢r-one (preserve x)
preserve-r (S.⊢r-cons x ⊢rs x₁) = T.⊢r-cons (preserve x) (preserve-r ⊢rs)
preserve (S.⊢d-c {c = S.lit x}) = T.⊢n
preserve (S.⊢d-c {c = S.flt x}) = T.⊢m
preserve (S.⊢d-c {c = S.+s}) = T.⊢+
preserve (S.⊢d-c {c = S.+i x}) = T.⊢+i
preserve (S.⊢d-c {c = S.+f x}) = T.⊢+f
preserve (S.⊢d-var x) = T.⊢` x
preserve (S.⊢d-ann ⊢e) = preserve ⊢e
preserve (S.⊢d-lam₁ ⊢e) = T.⊢ƛ (preserve ⊢e)
preserve (S.⊢d-lam₂ ⊢e) = T.⊢ƛ (preserve ⊢e)
preserve (S.⊢d-app⇐ ⊢e ⊢e₁) = T.⊢· (preserve ⊢e) (preserve ⊢e₁)
preserve (S.⊢d-app⇒ ⊢e ⊢e₁) = T.⊢· (preserve ⊢e) (preserve ⊢e₁)
preserve (S.⊢d-sub ⊢e x x₁) = T.⊢sub (preserve ⊢e) (preserve-sub x)
preserve (S.⊢d-rcd x) = T.⊢rcd (preserve-r x)
preserve (S.⊢d-prj ⊢e) = T.⊢prj (preserve ⊢e)