open import Level using (Level; levelOfType)
open import Algebra
open import Function
open import Data.Bool using (Bool; if_then_else_; T)
open import Data.Nat as ℕ using (ℕ)
open import Data.Product using (Σ-syntax; -,_; _,_)
open import Data.Maybe as Maybe
open import Data.Product
open import Data.Fin
open import Data.Fin.Patterns
open import Data.Vec.Functional
open import Relation.Binary
open import Relation.Nullary
import Data.Vec.Functional.Relation.Binary.Equality.Setoid as ≋-props
module Vector.Base where
private variable
c ℓ : Level
A B : Set ℓ
m n : ℕ
xs ys zs : Vector A n
infixl 6 _[_]≔_
_[_]≔_ : Vector A n → Fin n → A → Vector A n
xs [ i ]≔ x = updateAt xs i (const x)
swapV : Vector A n → (i j : Fin n) → Vector A n
swapV xs i j = xs [ i ]≔ xs j [ j ]≔ xs i
[_] : A → Vector A 1
[ x ] _ = x
ListVec : Set ℓ → Set _
ListVec A = Σ[ n ∈ ℕ ] Vector A n
filter : (A → Bool) → Vector A n → ListVec A
filter {n = ℕ.zero} f xs = -, []
filter {n = ℕ.suc n} f xs = let x = xs 0F ; _ , fxs = filter f (tail xs) in
if f x then -, x ∷ fxs else -, fxs
module SetoidProps (S : Setoid c ℓ) where
open module ≈ = Setoid S
open ≋-props S
private variable
x y : Carrier
xs‵ ys‵ : Vector Carrier n
≋-cons : x ≈ y → xs‵ ≋ ys‵ → (x ∷ xs‵) ≋ (y ∷ ys‵)
≋-cons x≈y xs≋ys zero = x≈y
≋-cons x≈y xs≋ys (suc i) = xs≋ys i
≋-consˡ : xs‵ ≋ ys‵ → (x ∷ xs‵) ≋ (x ∷ ys‵)
≋-consˡ = ≋-cons ≈.refl
Monotone : Vector (Fin m) n → Set _
Monotone xs = xs Preserves _<_ ⟶ _<_
findFirst : Vector A n → (A → Bool) → Maybe (Fin n × A)
findFirst {n = ℕ.zero} xs f = nothing
findFirst {n = ℕ.suc n} xs f = if f (xs zero) then just (zero , (xs zero))
else Maybe.map (λ (i , a) → suc i , a) (findFirst (tail xs) f)
findFirstElement : Vector A n → (A → Bool) → Maybe A
findFirstElement = Maybe.map proj₂ ∘₂ findFirst
findFirstWithProp : Vector A n → (A → Maybe B) → Maybe (Fin n × B)
findFirstWithProp {n = ℕ.zero} xs f = nothing
findFirstWithProp {n = ℕ.suc n} xs f = maybe′ (λ x → just (zero , x)) (Maybe.map (λ (i , a) → suc i , a)
(findFirstWithProp (tail xs) f)) $ f $ xs zero
appendLast : Vector A n → A → Vector A (ℕ.suc n)
appendLast {n = ℕ.zero} xs a i = a
appendLast {n = ℕ.suc n} xs a 0F = xs 0F
appendLast {n = ℕ.suc n} xs a (suc i) = appendLast (tail xs) a i