module linear.Usage.Equality where
open import Data.Nat
open import Data.Vec
open import Data.Product
open import Function
open import Relation.Nullary
open import Relation.Binary.PropositionalEquality
open import linear.Type hiding (eq)
open import linear.Context
open import linear.Usage
open import linear.RawIso
eq : {a : Type} (A B : Usage a) → Dec (A ≡ B)
eq [ a ] [ .a ] = yes refl
eq ] a [ ] .a [ = yes refl
eq [ a ] ] .a [ = no (λ ())
eq ] a [ [ .a ] = no (λ ())
RawIso-∷ : {n : ℕ} {γ : Context n} {Γ Δ : Usages γ} {a : Type} {A B : Usage a} →
RawIso (A ≡ B × Γ ≡ Δ) ((Usages (a ∷ γ) ∋ A ∷ Γ) ≡ B ∷ Δ)
push RawIso-∷ (refl , refl) = refl
pull RawIso-∷ refl = refl , refl
eqs : {n : ℕ} {γ : Context n} (Γ Δ : Usages γ) → Dec (Γ ≡ Δ)
eqs [] [] = yes refl
eqs (A ∷ Γ) (B ∷ Δ) = RawIso-∷ <$> eq A B <*> eqs Γ Δ