open import Relation.Binary
module Vec.View {a ℓ}
(S : Setoid a ℓ)
where
open import Level hiding (suc)
open import Data.Nat using (ℕ; zero; suc; _+_; _∸_; s≤s)
open import Data.Fin renaming (zero to fzero; suc to fsuc) hiding (_+_)
open import Data.Vec
open import Data.Vec.Relation.Binary.Equality.Setoid S
open import Data.Vec.Relation.Binary.Pointwise.Inductive as PI hiding (refl; lookup)
renaming (_∷_ to _::_)
open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; refl)
open Setoid S renaming (Carrier to A; refl to ≈-refl; sym to ≈-sym)
private variable
m n p q : ℕ
x y : A
xs ys : Vec A n
data VecView (xs : Vec A (suc n)) (i : Fin (suc n)) : Set (a ⊔ ℓ) where
view : {ys : Vec A (toℕ i)} {x : A} {zs : Vec A p} → ys ++ [ x ] ++ zs ≋ xs → VecView xs i
vec→VecView : (xs : Vec A (suc n)) (i : Fin (suc n)) → VecView xs i
vec→VecView (x ∷ xs) fzero = view {ys = []} ≋-refl
vec→VecView {suc n} (x ∷ xs) (fsuc i) with vec→VecView xs i
... | view {ys = ys} {y} {zs} eqn = view {ys = x ∷ ys} (_∷_ {A = A} ≈-refl eqn)
lookupVecView : ∀ {xs : Vec A n} i {ys : Vec A (toℕ i)} {x} {zs : Vec A p}
→ ys ++ [ x ] ++ zs ≋ xs
→ lookup xs i ≈ x
lookupVecView fzero {[]} (eqn :: _) = ≈-sym eqn
lookupVecView (fsuc i) {_ ∷ _} (_ :: eqn) = lookupVecView i eqn
changeVecView : ∀ {xs : Vec A n} i {ys : Vec A (toℕ i)} {x} {zs : Vec A p} y
→ ys ++ [ x ] ++ zs ≋ xs
→ ys ++ [ y ] ++ zs ≋ xs [ i ]≔ y
changeVecView fzero {[]} _ (_ :: eqn) = ≈-refl :: eqn
changeVecView (fsuc i) {a ∷ ys} y (x∼y :: eqn) = x∼y :: changeVecView i y eqn
data VecView2 (xs : Vec A (2 + n)) (i j : Fin (2 + n)) (i<j : i < j) : Set (a ⊔ ℓ) where
view2 : {ys : Vec A (toℕ i)} {x : A} {zs : Vec A (toℕ j ∸ toℕ i ∸ 1)} {w : A} {ws : Vec A q}
→ ys ++ [ x ] ++ zs ++ [ w ] ++ ws ≋ xs → VecView2 xs i j i<j
vec→VecView2 : (xs : Vec A (2 + n)) {i j : Fin (2 + n)} (i<j : i < j) → VecView2 xs i j i<j
vec→VecView2 (x ∷ xs) {fzero} {fsuc j} i<j with vec→VecView xs j
... | view eqn = view2 {ys = []} (≈-refl :: eqn)
vec→VecView2 {n = ℕ.zero} (x ∷ y ∷ []) {fsuc fzero} {fsuc fzero} (s≤s ())
vec→VecView2 {n = suc n} (x ∷ xs) {fsuc i} {fsuc j} (s≤s i<j) with vec→VecView2 xs i<j
... | view2 eqn = view2 {ys = x ∷ _} (≈-refl :: eqn)
lookupVecView2ˡ : ∀ {xs : Vec A n} {i j : Fin n} (i<j : i < j)
{ys : Vec A (toℕ i)} {x} {zs : Vec A (toℕ j ∸ toℕ i ∸ 1)} {w} {ws : Vec A q}
→ ys ++ [ x ] ++ zs ++ [ w ] ++ ws ≋ xs
→ lookup xs i ≈ x
lookupVecView2ˡ {i = fzero} _ {[]} (eqn :: _) = ≈-sym eqn
lookupVecView2ˡ {i = fsuc _} {fsuc _} (s≤s i<j) {_ ∷ _} (_ :: eqn) = lookupVecView2ˡ i<j eqn
lookupVecView2ʳ : ∀ {xs : Vec A n} {i j : Fin n} (i<j : i < j)
{ys : Vec A (toℕ i)} {x} {zs : Vec A (toℕ j ∸ toℕ i ∸ 1)} {w} {ws : Vec A q}
→ ys ++ [ x ] ++ zs ++ [ w ] ++ ws ≋ xs
→ lookup xs j ≈ w
lookupVecView2ʳ {i = fzero} {fsuc j} _ {[]} (_ :: eqn) = lookupVecView j eqn
lookupVecView2ʳ {i = fsuc i} {fsuc j} (s≤s i<j) {x ∷ ys} (x∼y :: eqn) = lookupVecView2ʳ i<j eqn
changeVecView2ˡ : ∀ {xs : Vec A n} {i j : Fin n} (i<j : i < j)
{ys : Vec A (toℕ i)} {x} {zs : Vec A (toℕ j ∸ toℕ i ∸ 1)} {w} {ws : Vec A q} y
→ ys ++ [ x ] ++ zs ++ [ w ] ++ ws ≋ xs
→ ys ++ [ y ] ++ zs ++ [ w ] ++ ws ≋ xs [ i ]≔ y
changeVecView2ˡ {i = fzero} i<j {[]} y (x∼y :: eqn) = ≈-refl :: eqn
changeVecView2ˡ {i = fsuc i} {fsuc j} (s≤s i<j) {x ∷ ys} y (x∼y :: eqn) = x∼y :: changeVecView2ˡ i<j y eqn
changeVecView2ʳ : ∀ {xs : Vec A n} {i j : Fin n} (i<j : i < j)
{ys : Vec A (toℕ i)} {x} {zs : Vec A (toℕ j ∸ toℕ i ∸ 1)} {w} {ws : Vec A q} y
→ ys ++ [ x ] ++ zs ++ [ w ] ++ ws ≋ xs
→ ys ++ [ x ] ++ zs ++ [ y ] ++ ws ≋ xs [ j ]≔ y
changeVecView2ʳ {i = fzero} {fsuc j} _ {[]} y (x∼y :: eqn) = x∼y :: changeVecView j y eqn
changeVecView2ʳ {i = fsuc _} {fsuc _} (s≤s i<j) {_ ∷ _} y (x∼y :: eqn) = x∼y :: (changeVecView2ʳ i<j y eqn)