module linear.Context.Mix where
open import Data.Vec as V hiding (_∷ʳ_ ; fromList)
open import linear.Context
import linear.Usage.Erasure as UE
data _++_≅_ : ∀ {m n p} → Context m → Context n → Context p → Set where
[] : [] ++ [] ≅ []
_∷ˡ_ : ∀ {m n p} {γ : Context m} {δ : Context n} {θ : Context p}
σ → γ ++ δ ≅ θ → (σ ∷ γ) ++ δ ≅ (σ ∷ θ)
_∷ʳ_ : ∀ {m n p} {γ : Context m} {δ : Context n} {θ : Context p}
σ → γ ++ δ ≅ θ → γ ++ (σ ∷ δ) ≅ (σ ∷ θ)
infix 2 _++_≅_
_++ˡ_ : ∀ {m n p} {γ : Context m} {δ : Context n} {θ : Context p}
{o} (φ : Context o) → γ ++ δ ≅ θ → φ V.++ γ ++ δ ≅ φ V.++ θ
[] ++ˡ p = p
(σ ∷ φ) ++ˡ p = σ ∷ˡ (φ ++ˡ p)
fromList : ∀ {γ δ θ} → γ UE.++ δ ≅ θ → V.fromList γ ++ V.fromList δ ≅ V.fromList θ
fromList UE.[] = []
fromList (σ UE.∷ˡ p) = σ ∷ˡ fromList p
fromList (σ UE.∷ʳ p) = σ ∷ʳ fromList p