vector-sized-0.6.1.0: Size tagged vectors

Data.Vector.Sized

Description

This module re-exports the functionality in Sized specialized to Vector.

Functions returning a vector determine the size from the type context unless they have a ' suffix in which case they take an explicit Proxy argument.

Functions where the resultant vector size is not know until compile time are not exported.

Synopsis

# Documentation

Vector specialized to use Vector

# Accessors

## Length information

length :: forall n a. KnownNat n => Vector n a -> Int Source #

O(1) Yield the length of the vector as an Int.

length' :: forall n a. KnownNat n => Vector n a -> Proxy n Source #

O(1) Yield the length of the vector as a Proxy.

## Indexing

index :: forall n a. KnownNat n => Vector n a -> Finite n -> a Source #

O(1) Safe indexing using a Finite.

index' :: forall n m a p. (KnownNat n, KnownNat m) => Vector ((n + m) + 1) a -> p n -> a Source #

O(1) Safe indexing using a Proxy.

unsafeIndex :: forall n a. KnownNat n => Vector n a -> Int -> a Source #

O(1) Indexing using an Int without bounds checking.

head :: forall n a. Vector (1 + n) a -> a Source #

O(1) Yield the first element of a non-empty vector.

last :: forall n a. Vector (n + 1) a -> a Source #

O(1) Yield the last element of a non-empty vector.

indexM :: forall n a m. (KnownNat n, Monad m) => Vector n a -> Finite n -> m a Source #

O(1) Safe indexing in a monad. See the documentation for indexM for an explanation of why this is useful.

indexM' :: forall n k a m p. (KnownNat n, KnownNat k, Monad m) => Vector (n + k) a -> p n -> m a Source #

O(1) Safe indexing in a monad using a Proxy. See the documentation for indexM for an explanation of why this is useful.

unsafeIndexM :: forall n a m. (KnownNat n, Monad m) => Vector n a -> Int -> m a Source #

O(1) Indexing using an Int without bounds checking. See the documentation for indexM for an explanation of why this is useful.

headM :: forall n a m. (KnownNat n, Monad m) => Vector (1 + n) a -> m a Source #

O(1) Yield the first element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

lastM :: forall n a m. (KnownNat n, Monad m) => Vector (n + 1) a -> m a Source #

O(1) Yield the last element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

## Extracting subvectors (slicing)

Arguments

 :: (KnownNat i, KnownNat n, KnownNat m) => p i starting index -> Vector ((i + n) + m) a -> Vector n a

O(1) Yield a slice of the vector without copying it with an inferred length argument.

Arguments

 :: (KnownNat i, KnownNat n, KnownNat m) => p i starting index -> p n length -> Vector ((i + n) + m) a -> Vector n a

O(1) Yield a slice of the vector without copying it with an explicit length argument.

init :: forall n a. Vector (n + 1) a -> Vector n a Source #

O(1) Yield all but the last element of a non-empty vector without copying.

tail :: forall n a. Vector (1 + n) a -> Vector n a Source #

O(1) Yield all but the first element of a non-empty vector without copying.

take :: forall n m a. (KnownNat n, KnownNat m) => Vector (n + m) a -> Vector n a Source #

O(1) Yield the first n elements. The resultant vector always contains this many elements. The length of the resultant vector is inferred from the type.

take' :: forall n m a p. (KnownNat n, KnownNat m) => p n -> Vector (n + m) a -> Vector n a Source #

O(1) Yield the first n elements. The resultant vector always contains this many elements. The length of the resultant vector is given explicitly as a Proxy argument.

drop :: forall n m a. (KnownNat n, KnownNat m) => Vector (n + m) a -> Vector m a Source #

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements The length of the resultant vector is inferred from the type.

drop' :: forall n m a p. (KnownNat n, KnownNat m) => p n -> Vector (n + m) a -> Vector m a Source #

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements The length of the resultant vector is givel explicitly as a Proxy argument.

splitAt :: forall n m a. (KnownNat n, KnownNat m) => Vector (n + m) a -> (Vector n a, Vector m a) Source #

O(1) Yield the first n elements paired with the remainder without copying. The lengths of the resultant vector are inferred from the type.

splitAt' :: forall n m a p. (KnownNat n, KnownNat m) => p n -> Vector (n + m) a -> (Vector n a, Vector m a) Source #

O(1) Yield the first n elements paired with the remainder without copying. The length of the first resultant vector is passed explicitly as a Proxy argument.

# Construction

## Initialization

empty :: forall a. Vector 0 a Source #

O(1) Empty vector.

singleton :: forall a. a -> Vector 1 a Source #

O(1) Vector with exactly one element.

replicate :: forall n a. KnownNat n => a -> Vector n a Source #

O(n) Construct a vector with the same element in each position where the length is inferred from the type.

replicate' :: forall n a p. KnownNat n => p n -> a -> Vector n a Source #

O(n) Construct a vector with the same element in each position where the length is given explicitly as a Proxy argument.

generate :: forall n a. KnownNat n => (Int -> a) -> Vector n a Source #

O(n) construct a vector of the given length by applying the function to each index where the length is inferred from the type.

generate' :: forall n a p. KnownNat n => p n -> (Int -> a) -> Vector n a Source #

O(n) construct a vector of the given length by applying the function to each index where the length is given explicitly as a Proxy argument.

generate_ :: forall n a. KnownNat n => (Finite n -> a) -> Vector n a Source #

O(n) construct a vector of the given length by applying the function to each index where the length is inferred from the type.

The function can expect a Finite n, meaning that its input will always be between 0 and n - 1.

iterateN :: forall n a. KnownNat n => (a -> a) -> a -> Vector n a Source #

O(n) Apply function n times to value. Zeroth element is original value. The length is inferred from the type.

iterateN' :: forall n a p. KnownNat n => p n -> (a -> a) -> a -> Vector n a Source #

O(n) Apply function n times to value. Zeroth element is original value. The length is given explicitly as a Proxy argument.

replicateM :: forall n m a. (KnownNat n, Monad m) => m a -> m (Vector n a) Source #

O(n) Execute the monadic action n times and store the results in a vector where n is inferred from the type.

replicateM' :: forall n m a p. (KnownNat n, Monad m) => p n -> m a -> m (Vector n a) Source #

O(n) Execute the monadic action n times and store the results in a vector where n is given explicitly as a Proxy argument.

generateM :: forall n m a. (KnownNat n, Monad m) => (Int -> m a) -> m (Vector n a) Source #

O(n) Construct a vector of length n by applying the monadic action to each index where n is inferred from the type.

generateM' :: forall n m a p. (KnownNat n, Monad m) => p n -> (Int -> m a) -> m (Vector n a) Source #

O(n) Construct a vector of length n by applying the monadic action to each index where n is given explicitly as a Proxy argument.

generateM_ :: forall n m a. (KnownNat n, Monad m) => (Finite n -> m a) -> m (Vector n a) Source #

O(n) Construct a vector of length n by applying the monadic action to each index where n is inferred from the type.

The function can expect a Finite n, meaning that its input will always be between 0 and n - 1.

## Unfolding

unfoldrN :: forall n a b. KnownNat n => (b -> (a, b)) -> b -> Vector n a Source #

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length, n, is inferred from the type.

unfoldrN' :: forall n a b p. KnownNat n => p n -> (b -> (a, b)) -> b -> Vector n a Source #

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length, n, is given explicitly as a Proxy argument.

## Enumeration

enumFromN :: forall n a. (KnownNat n, Num a) => a -> Vector n a Source #

O(n) Yield a vector of length n containing the values x, x+1 etc. The length, n, is inferred from the type.

enumFromN' :: forall n a p. (KnownNat n, Num a) => a -> p n -> Vector n a Source #

O(n) Yield a vector of length n containing the values x, x+1 etc. The length, n, is given explicitly as a Proxy argument.

enumFromStepN :: forall n a. (KnownNat n, Num a) => a -> a -> Vector n a Source #

O(n) Yield a vector of the given length containing the values x, x+y, x+y+y etc. The length, n, is inferred from the type.

enumFromStepN' :: forall n a p. (KnownNat n, Num a) => a -> a -> p n -> Vector n a Source #

O(n) Yield a vector of the given length containing the values x, x+y, x+y+y etc. The length, n, is given explicitly as a Proxy argument.

## Concatenation

cons :: forall n a. a -> Vector n a -> Vector (1 + n) a Source #

O(n) Prepend an element.

snoc :: forall n a. Vector n a -> a -> Vector (n + 1) a Source #

O(n) Append an element.

(++) :: forall n m a. Vector n a -> Vector m a -> Vector (n + m) a Source #

O(m+n) Concatenate two vectors.

## Restricting memory usage

force :: Vector n a -> Vector n a Source #

O(n) Yield the argument but force it not to retain any extra memory, possibly by copying it.

This is especially useful when dealing with slices. For example:

force (slice 0 2 <huge vector>)

Here, the slice retains a reference to the huge vector. Forcing it creates a copy of just the elements that belong to the slice and allows the huge vector to be garbage collected.

# Modifying vectors

Arguments

 :: Vector m a initial vector (of length m) -> [(Int, a)] list of index/value pairs (of length n) -> Vector m a

O(m+n) For each pair (i,a) from the list, replace the vector element at position i by a.

<5,9,2,7> // [(2,1),(0,3),(2,8)] = <3,9,8,7>

Arguments

 :: Vector m a initial vector (of length m) -> Vector n (Int, a) vector of index/value pairs (of length n) -> Vector m a

O(m+n) For each pair (i,a) from the vector of index/value pairs, replace the vector element at position i by a.

update <5,9,2,7> <(2,1),(0,3),(2,8)> = <3,9,8,7>

Arguments

 :: Vector m a initial vector (of length m) -> Vector n Int index vector (of length n) -> Vector n a value vector (of length n) -> Vector m a

O(m+n) For each index i from the index vector and the corresponding value a from the value vector, replace the element of the initial vector at position i by a.

update_ <5,9,2,7>  <2,0,2> <1,3,8> = <3,9,8,7>

This function is useful for instances of Vector that cannot store pairs. Otherwise, update is probably more convenient.

update_ xs is ys = update xs (zip is ys)

Arguments

 :: Vector m a initial vector (of length m) -> [(Int, a)] list of index/value pairs (of length n) -> Vector m a

Same as (//) but without bounds checking.

Arguments

 :: Vector m a initial vector (of length m) -> Vector n (Int, a) vector of index/value pairs (of length n) -> Vector m a

Same as update but without bounds checking.

Arguments

 :: Vector m a initial vector (of length m) -> Vector n Int index vector (of length n) -> Vector n a value vector (of length n) -> Vector m a

Same as update_ but without bounds checking.

## Accumulations

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> [(Int, b)] list of index/value pairs (of length n) -> Vector m a

O(m+n) For each pair (i,b) from the list, replace the vector element a at position i by f a b.

accum (+) <5,9,2> [(2,4),(1,6),(0,3),(1,7)] = <5+3, 9+6+7, 2+4>

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> Vector n (Int, b) vector of index/value pairs (of length n) -> Vector m a

O(m+n) For each pair (i,b) from the vector of pairs, replace the vector element a at position i by f a b.

accumulate (+) <5,9,2> <(2,4),(1,6),(0,3),(1,7)> = <5+3, 9+6+7, 2+4>

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> Vector n Int index vector (of length n) -> Vector n b value vector (of length n) -> Vector m a

O(m+n) For each index i from the index vector and the corresponding value b from the the value vector, replace the element of the initial vector at position i by f a b.

accumulate_ (+) <5,9,2> <2,1,0,1> <4,6,3,7> = <5+3, 9+6+7, 2+4>

This function is useful for instances of Vector that cannot store pairs. Otherwise, accumulate is probably more convenient:

accumulate_ f as is bs = accumulate f as (zip is bs)

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> [(Int, b)] list of index/value pairs (of length n) -> Vector m a

Same as accum but without bounds checking.

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> Vector n (Int, b) vector of index/value pairs (of length n) -> Vector m a

Same as accumulate but without bounds checking.

Arguments

 :: (a -> b -> a) accumulating function f -> Vector m a initial vector (of length m) -> Vector n Int index vector (of length n) -> Vector n b value vector (of length n) -> Vector m a

Same as accumulate_ but without bounds checking.

## Permutations

reverse :: Vector n a -> Vector n a Source #

O(n) Reverse a vector

Arguments

 :: Vector m a xs value vector -> Vector n Int is index vector (of length n) -> Vector n a

O(n) Yield the vector obtained by replacing each element i of the index vector by xs!i. This is equivalent to map (xs!) is but is often much more efficient.

backpermute <a,b,c,d> <0,3,2,3,1,0> = <a,d,c,d,b,a>

Arguments

 :: Vector m a xs value vector -> Vector n Int is index vector (of length n) -> Vector n a

Same as backpermute but without bounds checking.

# Lenses

ix :: forall n a f. (KnownNat n, Functor f) => Finite n -> (a -> f a) -> Vector n a -> f (Vector n a) Source #

Lens to access (O(1)) and update (O(n)) an arbitrary element by its index.

_head :: forall n a f. (KnownNat n, Functor f) => (a -> f a) -> Vector (1 + n) a -> f (Vector (1 + n) a) Source #

Lens to access (O(1)) and update (O(n)) the first element of a non-empty vector.

_last :: forall n a f. (KnownNat n, Functor f) => (a -> f a) -> Vector (n + 1) a -> f (Vector (n + 1) a) Source #

Lens to access (O(1)) and update (O(n)) the last element of a non-empty vector.

# Elementwise operations

## Indexing

indexed :: Vector n a -> Vector n (Int, a) Source #

O(n) Pair each element in a vector with its index

## Mapping

map :: (a -> b) -> Vector n a -> Vector n b Source #

O(n) Map a function over a vector

imap :: (Int -> a -> b) -> Vector n a -> Vector n b Source #

O(n) Apply a function to every element of a vector and its index

concatMap :: (a -> Vector m b) -> Vector n a -> Vector (n * m) b Source #

O(n*m) Map a function over a vector and concatenate the results. The function is required to always return the same length vector.

mapM :: Monad m => (a -> m b) -> Vector n a -> m (Vector n b) Source #

O(n) Apply the monadic action to all elements of the vector, yielding a vector of results

imapM :: Monad m => (Int -> a -> m b) -> Vector n a -> m (Vector n b) Source #

O(n) Apply the monadic action to every element of a vector and its index, yielding a vector of results

mapM_ :: Monad m => (a -> m b) -> Vector n a -> m () Source #

O(n) Apply the monadic action to all elements of a vector and ignore the results

imapM_ :: Monad m => (Int -> a -> m b) -> Vector n a -> m () Source #

O(n) Apply the monadic action to every element of a vector and its index, ignoring the results

forM :: Monad m => Vector n a -> (a -> m b) -> m (Vector n b) Source #

O(n) Apply the monadic action to all elements of the vector, yielding a vector of results. Equvalent to flip mapM.

forM_ :: Monad m => Vector n a -> (a -> m b) -> m () Source #

O(n) Apply the monadic action to all elements of a vector and ignore the results. Equivalent to flip mapM_.

## Zipping

zipWith :: (a -> b -> c) -> Vector n a -> Vector n b -> Vector n c Source #

O(n) Zip two vectors of the same length with the given function.

zipWith3 :: (a -> b -> c -> d) -> Vector n a -> Vector n b -> Vector n c -> Vector n d Source #

Zip three vectors with the given function.

zipWith4 :: (a -> b -> c -> d -> e) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e Source #

zipWith5 :: (a -> b -> c -> d -> e -> f) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n f Source #

zipWith6 :: (a -> b -> c -> d -> e -> f -> g) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n f -> Vector n g Source #

izipWith :: (Int -> a -> b -> c) -> Vector n a -> Vector n b -> Vector n c Source #

O(n) Zip two vectors of the same length with a function that also takes the elements' indices).

izipWith3 :: (Int -> a -> b -> c -> d) -> Vector n a -> Vector n b -> Vector n c -> Vector n d Source #

izipWith4 :: (Int -> a -> b -> c -> d -> e) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e Source #

izipWith5 :: (Int -> a -> b -> c -> d -> e -> f) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n f Source #

izipWith6 :: (Int -> a -> b -> c -> d -> e -> f -> g) -> Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n f -> Vector n g Source #

zip :: Vector n a -> Vector n b -> Vector n (a, b) Source #

O(n) Zip two vectors of the same length

zip3 :: Vector n a -> Vector n b -> Vector n c -> Vector n (a, b, c) Source #

zip4 :: Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n (a, b, c, d) Source #

zip5 :: Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n (a, b, c, d, e) Source #

zip6 :: Vector n a -> Vector n b -> Vector n c -> Vector n d -> Vector n e -> Vector n f -> Vector n (a, b, c, d, e, f) Source #

zipWithM :: Monad m => (a -> b -> m c) -> Vector n a -> Vector n b -> m (Vector n c) Source #

O(n) Zip the two vectors of the same length with the monadic action and yield a vector of results

izipWithM :: Monad m => (Int -> a -> b -> m c) -> Vector n a -> Vector n b -> m (Vector n c) Source #

O(n) Zip the two vectors with a monadic action that also takes the element index and yield a vector of results

zipWithM_ :: Monad m => (a -> b -> m c) -> Vector n a -> Vector n b -> m () Source #

O(n) Zip the two vectors with the monadic action and ignore the results

izipWithM_ :: Monad m => (Int -> a -> b -> m c) -> Vector n a -> Vector n b -> m () Source #

O(n) Zip the two vectors with a monadic action that also takes the element index and ignore the results

## Unzipping

unzip :: Vector n (a, b) -> (Vector n a, Vector n b) Source #

O(min(m,n)) Unzip a vector of pairs.

unzip3 :: Vector n (a, b, c) -> (Vector n a, Vector n b, Vector n c) Source #

unzip4 :: Vector n (a, b, c, d) -> (Vector n a, Vector n b, Vector n c, Vector n d) Source #

unzip5 :: Vector n (a, b, c, d, e) -> (Vector n a, Vector n b, Vector n c, Vector n d, Vector n e) Source #

unzip6 :: Vector n (a, b, c, d, e, f) -> (Vector n a, Vector n b, Vector n c, Vector n d, Vector n e, Vector n f) Source #

# Working with predicates

## Searching

elem :: Eq a => a -> Vector n a -> Bool infix 4 Source #

O(n) Check if the vector contains an element

notElem :: Eq a => a -> Vector n a -> Bool infix 4 Source #

O(n) Check if the vector does not contain an element (inverse of elem)

find :: (a -> Bool) -> Vector n a -> Maybe a Source #

O(n) Yield Just the first element matching the predicate or Nothing if no such element exists.

findIndex :: (a -> Bool) -> Vector n a -> Maybe Int Source #

O(n) Yield Just the index of the first element matching the predicate or Nothing if no such element exists.

elemIndex :: Eq a => a -> Vector n a -> Maybe Int Source #

O(n) Yield Just the index of the first occurence of the given element or Nothing if the vector does not contain the element. This is a specialised version of findIndex.

# Folding

foldl :: (a -> b -> a) -> a -> Vector n b -> a Source #

O(n) Left fold

foldl1 :: KnownNat n => (a -> a -> a) -> Vector (1 + n) a -> a Source #

O(n) Left fold on non-empty vectors

foldl' :: (a -> b -> a) -> a -> Vector n b -> a Source #

O(n) Left fold with strict accumulator

foldl1' :: KnownNat n => (a -> a -> a) -> Vector (1 + n) a -> a Source #

O(n) Left fold on non-empty vectors with strict accumulator

foldr :: (a -> b -> b) -> b -> Vector n a -> b Source #

O(n) Right fold

foldr1 :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> a Source #

O(n) Right fold on non-empty vectors

foldr' :: (a -> b -> b) -> b -> Vector n a -> b Source #

O(n) Right fold with a strict accumulator

foldr1' :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> a Source #

O(n) Right fold on non-empty vectors with strict accumulator

ifoldl :: (a -> Int -> b -> a) -> a -> Vector n b -> a Source #

O(n) Left fold (function applied to each element and its index)

ifoldl' :: (a -> Int -> b -> a) -> a -> Vector n b -> a Source #

O(n) Left fold with strict accumulator (function applied to each element and its index)

ifoldr :: (Int -> a -> b -> b) -> b -> Vector n a -> b Source #

O(n) Right fold (function applied to each element and its index)

ifoldr' :: (Int -> a -> b -> b) -> b -> Vector n a -> b Source #

O(n) Right fold with strict accumulator (function applied to each element and its index)

## Specialised folds

all :: (a -> Bool) -> Vector n a -> Bool Source #

O(n) Check if all elements satisfy the predicate.

any :: (a -> Bool) -> Vector n a -> Bool Source #

O(n) Check if any element satisfies the predicate.

O(n) Check if all elements are True

O(n) Check if any element is True

sum :: Num a => Vector n a -> a Source #

O(n) Compute the sum of the elements

product :: Num a => Vector n a -> a Source #

O(n) Compute the produce of the elements

maximum :: (Ord a, KnownNat n) => Vector (n + 1) a -> a Source #

O(n) Yield the maximum element of the non-empty vector.

maximumBy :: KnownNat n => (a -> a -> Ordering) -> Vector (n + 1) a -> a Source #

O(n) Yield the maximum element of the non-empty vector according to the given comparison function.

minimum :: (Ord a, KnownNat n) => Vector (n + 1) a -> a Source #

O(n) Yield the minimum element of the non-empty vector.

minimumBy :: KnownNat n => (a -> a -> Ordering) -> Vector (n + 1) a -> a Source #

O(n) Yield the minimum element of the non-empty vector according to the given comparison function.

maxIndex :: (Ord a, KnownNat n) => Vector (n + 1) a -> Int Source #

O(n) Yield the index of the maximum element of the non-empty vector.

maxIndexBy :: KnownNat n => (a -> a -> Ordering) -> Vector (n + 1) a -> Int Source #

O(n) Yield the index of the maximum element of the non-empty vector according to the given comparison function.

minIndex :: (Ord a, KnownNat n) => Vector (n + 1) a -> Int Source #

O(n) Yield the index of the minimum element of the non-empty vector.

minIndexBy :: KnownNat n => (a -> a -> Ordering) -> Vector (n + 1) a -> Int Source #

O(n) Yield the index of the minimum element of the non-empty vector according to the given comparison function.

foldM :: Monad m => (a -> b -> m a) -> a -> Vector n b -> m a Source #

ifoldM :: Monad m => (a -> Int -> b -> m a) -> a -> Vector n b -> m a Source #

O(n) Monadic fold (action applied to each element and its index)

fold1M :: (Monad m, KnownNat n) => (a -> a -> m a) -> Vector (1 + n) a -> m a Source #

O(n) Monadic fold over non-empty vectors

foldM' :: Monad m => (a -> b -> m a) -> a -> Vector n b -> m a Source #

O(n) Monadic fold with strict accumulator

ifoldM' :: Monad m => (a -> Int -> b -> m a) -> a -> Vector n b -> m a Source #

O(n) Monadic fold with strict accumulator (action applied to each element and its index)

fold1M' :: (Monad m, KnownNat n) => (a -> a -> m a) -> Vector (n + 1) a -> m a Source #

O(n) Monadic fold over non-empty vectors with strict accumulator

foldM_ :: Monad m => (a -> b -> m a) -> a -> Vector n b -> m () Source #

ifoldM_ :: Monad m => (a -> Int -> b -> m a) -> a -> Vector n b -> m () Source #

O(n) Monadic fold that discards the result (action applied to each element and its index)

fold1M_ :: (Monad m, KnownNat n) => (a -> a -> m a) -> Vector (n + 1) a -> m () Source #

foldM'_ :: Monad m => (a -> b -> m a) -> a -> Vector n b -> m () Source #

ifoldM'_ :: Monad m => (a -> Int -> b -> m a) -> a -> Vector n b -> m () Source #

O(n) Monadic fold with strict accumulator that discards the result (action applied to each element and its index)

fold1M'_ :: (Monad m, KnownNat n) => (a -> a -> m a) -> Vector (n + 1) a -> m () Source #

O(n) Monad fold over non-empty vectors with strict accumulator that discards the result

sequence :: Monad m => Vector n (m a) -> m (Vector n a) Source #

Evaluate each action and collect the results

sequence_ :: Monad m => Vector n (m a) -> m () Source #

Evaluate each action and discard the results

# Prefix sums (scans)

prescanl :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

O(n) Prescan

prescanl f z = init . scanl f z

Example: prescanl (+) 0 <1,2,3,4> = <0,1,3,6>

prescanl' :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

O(n) Prescan with strict accumulator

postscanl :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

O(n) Scan

postscanl' :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

O(n) Scan with strict accumulator

scanl :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

scanl' :: (a -> b -> a) -> a -> Vector n b -> Vector n a Source #

O(n) Haskell-style scan with strict accumulator

scanl1 :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> Vector (n + 1) a Source #

O(n) Scan over a non-empty vector

scanl1' :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> Vector (n + 1) a Source #

O(n) Scan over a non-empty vector with a strict accumulator

prescanr :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

O(n) Right-to-left prescan

prescanr' :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

O(n) Right-to-left prescan with strict accumulator

postscanr :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

O(n) Right-to-left scan

postscanr' :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

O(n) Right-to-left scan with strict accumulator

scanr :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

scanr' :: (a -> b -> b) -> b -> Vector n a -> Vector n b Source #

O(n) Right-to-left Haskell-style scan with strict accumulator

scanr1 :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> Vector (n + 1) a Source #

O(n) Right-to-left scan over a non-empty vector

scanr1' :: KnownNat n => (a -> a -> a) -> Vector (n + 1) a -> Vector (n + 1) a Source #

O(n) Right-to-left scan over a non-empty vector with a strict accumulator

# Conversions

## Lists

toList :: Vector n a -> [a] Source #

O(n) Convert a vector to a list

fromList :: KnownNat n => [a] -> Maybe (Vector n a) Source #

O(n) Convert a list to a vector

fromListN :: forall n a. KnownNat n => [a] -> Maybe (Vector n a) Source #

O(n) Convert the first n elements of a list to a vector. The length of the resultant vector is inferred from the type.

fromListN' :: forall n a p. KnownNat n => p n -> [a] -> Maybe (Vector n a) Source #

O(n) Convert the first n elements of a list to a vector. The length of the resultant vector is given explicitly as a Proxy argument.

withSizedList :: forall a r. [a] -> (forall n. KnownNat n => Vector n a -> r) -> r Source #

O(n) Takes a list and returns a continuation providing a vector with a size parameter corresponding to the length of the list.

Essentially converts a list into a vector with the proper size parameter, determined at runtime.

See withSized

## Unsized Vectors

toSized :: forall n a. KnownNat n => Vector a -> Maybe (Vector n a) Source #

Convert a Vector into a Vector if it has the correct size, otherwise return Nothing.

withSized :: forall a r. Vector a -> (forall n. KnownNat n => Vector n a -> r) -> r Source #

Takes a Vector and returns a continuation providing a Vector with a size parameter n that is determined at runtime based on the length of the input vector.

Essentially converts a Vector into a Vector with the correct size parameter n.

withVectorUnsafe :: (Vector a -> Vector b) -> Vector n a -> Vector n b Source #

Apply a function on unsized vectors to a sized vector. The function must preserve the size of the vector, this is not checked.