module Algebra.Matrix.Base where
open import Level using (Level)
open import Function using (_$_)
open import Algebra
open import Data.Nat as ℕ using (ℕ)
open import Data.Fin
open import Data.Sum.Base using (_⊎_; inj₁; inj₂; [_,_])
open import Data.Vec.Functional
open import Relation.Nullary
open import Vector.Base
infixr 5 _++ⱽ_ _++v_
private variable
a : Level
A : Set a
m n p : ℕ
Matrix : Set a → (n m : ℕ) → Set a
Matrix A n m = Vector (Vector A m) n
_++ⱽ_ : Matrix A m n → Matrix A m p → Matrix A m (n ℕ.+ p)
_++ⱽ_ {n = n} xs ys i j = [ xs i , ys i ] (splitAt n j)
_++v_ : Matrix A m n → Vector A m → Matrix A m (ℕ.suc n)
(xs ++v v) i = appendLast (xs i) (v i)
takeⱽ : ∀ n → Matrix A m (n ℕ.+ p) → Matrix A m n
takeⱽ _ = map $ take _
dropⱽ : ∀ n → Matrix A m (n ℕ.+ p) → Matrix A m p
dropⱽ _ = map $ drop _
swap : (p q : Fin n) → Op₁ (Matrix A n m)
swap p q M i with p ≟ i | q ≟ i
... | yes _ | _ = M q
... | no _ | yes _ = M p
... | no _ | no _ = M i
flip : Matrix A n m → Matrix A n m
flip xs i j = xs (opposite i) (opposite j)