module Basics where
open import Data.Nat public
open import Data.Vec public using (Vec; []; _∷_)
open import Data.Fin public using (Fin; zero; suc)
_!_ : ∀ {n A} → Vec A n → Fin n → A
[] ! ()
(x ∷ xs) ! zero = x
(x ∷ xs) ! suc i = xs ! i
open import Data.Function using (_∘_)
tabulate : ∀ {n A} → (Fin n → A) → Vec A n
tabulate {zero} f = []
tabulate {suc n} f = f zero ∷ tabulate (f ∘ suc)
open import Relation.Binary.PropositionalEquality
lem-tabulate-! : ∀ {n A} (f : Fin n → A) (i : Fin n) →
f i ≡ tabulate f ! i
lem-tabulate-! f zero = refl
lem-tabulate-! f (suc i) = lem-tabulate-! (f ∘ suc) i
zipWith : ∀ {A B C n} → (A → B → C) →
Vec A n → Vec B n → Vec C n
zipWith f [] [] = []
zipWith f (x ∷ xs) (y ∷ ys) = f x y ∷ zipWith f xs ys