Description

Dynamic (dense) vectors based on SRFI-43.

Author

Ivan Raikov

Version

Requires

Usage

(require-extension dyn-vector)

Download

dyn-vector.egg

Documentation

The dyn-vector library is an implementation of a dynamically-growing vector, based on SRFI-43. An attempt to set the i'th element of a dynvector of underlying size n causes the dynvector to grow to size 2n, i+1, or 16, whichever is greatest. The semantics of this library follow SRFI-43 closely, with the exception of the following procedures:

procedure: dynvector-ref vect i

if the index i is greater than the current size of the vector, this procedure returns the default value specified when the dynamic vector was created

procedure: dynvector-set! vect i e

if the index i is greater than the current size of the vector, the vector size is increased to max(2*N,i+1) and the new element is then inserted in the vector

procedure: dynvector-clear! vect n

this procedure removes all elements from the dynamic vector, and sets the size of the vector to n

procedure: dynvector-extend! vect n

this procedure explicitly resizes the dynamic vector to the specified size

procedure: dynvector-tabulate f len [dflt]

if the optional argument dflt is specified, it is used as default value, otherwise the first element in the vector is used as default value

procedure: list->dynvector lst [dflt] -> dynvector

if the optional argument dflt is specified, it is used as default value, otherwise the first element in the list is used as default value

Procedures

procedure: dynvector? x -> boolean

returns #t if x is a dynamic vector, #f otherwise

procedure: dynvector-tabulate f len [dflt]

creates a new dynamic vector of length len and iterates across each index, applying f at each iteration to the current index; if the optional argument dflt is specified, it is used as default value, otherwise the first element in the vector is used as default value

procedure: list->dynvector lst [dflt] -> dynvector

creates a dynamic vector with the elements of the given list; if the optional argument dflt is specified, it is used as default value, otherwise the first element in the vector is used as default value

procedure: make-dynvector n default -> dynvector

creates a dynamic vector of length n and fills it with value default

procedure: dynvector-clear! x n -> unspecified

removes all elements from the given dynamic vector, and sets the size of the vector to n

procedure: dynvector-length x -> integer

returns the length of the given dynamic vector

procedure: dynvector-ref x i -> value

returns the element at index iof the given dynamic vectorx

procedure: dynvector-set! x i e -> unspecified

updates the element at index iof the given dynamic vectorx; if the index i is greater than the current size of the vector, the vector size is increased to max(2*N,i+1) and the new element is then inserted in the vector

procedure: dynvector-expand! x n -> unspecified

expand the size of the dynamic vector to the given size n

procedure: dynvector-for-each f x1 ... -> unspecified

dynamic vector iterator: applies fto each index in the range [0, k), where k is the length of the smallest dynamic vector argument passed, and the respective list of parallel elements from x1 ... at that index.

procedure: dynvector-map f x1 ... -> dynvector

constructs a new dynamic vector of the shortest size of the given dynamic vector; each element at index i of the new dynamic vector is mapped from the old vectors by f i (dynvector-ref x1 i) ...

procedure: dynvector-copy x -> dynvector

creates a copy of the given dynamic vector

procedure: dynvector-fold f initial x1 ... -> state

left-to-right dynamic vector iterator with state. f is iterated over each index in all of the vectors, stopping at the end of the shortest; f is applied as (f i state (dynvector-ref x1 i) ...) where state is the current state value, which begins with initial and becomes whatever freturns at the respective iteration; i is the current index

procedure: dynvector-fold-right f initial x1 ... -> state

right-to-left dynamic vector iterator with state. f is iterated over each index in all of the vectors, stopping at the end of the shortest; f is applied as (f i state (dynvector-ref x1 i) ...) where state is the current state value, which begins with initial and becomes whatever freturns at the respective iteration; i is the current index

procedure: dynvector-index pred? x1 ... -> integer or #f

finds and returns the index of the first elements in x1 ... that satisfy pred?; if no matching element is found by the end of the shortest vector, #f is returned

procedure: dynvector-any pred? x1 ... -> value or #f

finds the first set of elements in x1 ... for which pred? returns a true value. If such a parallel set of elements exists, this procedure returns the value that pred?returned for that set of elements

procedure: dynvector-every pred? x1 ... -> value or #f

if, for every index i between 0 and the length of the shortest vector argument, the set of elements (dynvector-ref x1 i) ... satisfies pred?, this procedure returns the value that pred?returned for the last set of elements

procedure: dynvector->list x1 -> list

returns a list containing all the elements in the given dynamic vector

Examples

csi> (require-extension dyn-vector)

csi> (define dv (make-dynvector 1 0))
csi> (dynvector-ref dv 6)
0
csi> (dynvector-set! dv 6 18)
csi> (dynvector-ref dv 6)
18
csi> (define dv2 (list->dynvector '(1 2 3)))
csi> dv2
#(dynvector 1 2 3)
csi> (dynvector-ref dv2 4)
1
csi> (dynvector-clear! dv2 5)
csi> (dynvector-for-each (lambda (i x) (print i " = " x)) dv2)
0 = 1
1 = 1
2 = 1
3 = 1
4 = 1
csi> (dynvector-map (lambda (i x) (+ x i)) dv2)
#(dynvector 1 2 3 4 5)
csi> (dynvector-fold (lambda (i state v) (+ state v)) 0 dv2)
5

License

Parts of this documentation are taken from SRFI-43.
The rest was created by Ivan Raikov.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

A full copy of the GPL license can be found at
<http://www.gnu.org/licenses/>.