4.5 Vector Builders
(require rebellion/collection/vector/builder) | |
package: rebellion |
A vector builder is a single-use object for building a vector. First create a builder with make-vector-builder, then repeatedly add elements to it with vector-builder-add or vector-builder-add-all, and finally construct a vector using either build-vector or build-mutable-vector.
Vector builders try to efficiently minimize allocation when adding more elements to a builder. Constructing a vector of size N using a builder performs log(N) allocations and consumes an amount of space linear in N.
Vector builders are linear objects. Each operation on a vector builder destructively uses the builder and returns an updated, unused builder. Used builders cannot be reused; attempting to do so may raise a contract error, but this is not guaranteed.
> (define builder (make-vector-builder)) > (define builder2 (vector-builder-add builder 1 2 3)) > (vector-builder-add builder 1 2 3) vector-builder-add: contract violation;
this builder has already been used
builder: #<vector-builder>
in: the 1st argument of
(->
unused-vector-builder/c
any/c
...
unused-vector-builder/c)
contract from:
<pkgs>/rebellion/private/vector-builder.rkt
blaming: top-level
(assuming the contract is correct)
at: <pkgs>/rebellion/private/vector-builder.rkt:12.3
procedure
(vector-builder? v) → boolean?
v : any/c
procedure
(make-vector-builder [ initial-contents #:expected-size expected-size]) → unused-vector-builder/c initial-contents : (sequence/c any/c) = empty-list expected-size : (or/c natural? #f) = #f
procedure
(vector-builder-add builder v ...) → unused-vector-builder/c
builder : unused-vector-builder/c v : any/c
> (define builder (make-vector-builder)) > (vector-builder-add builder 1 2 3) #<vector-builder>
> (vector-builder-add builder 4 5 6) vector-builder-add: contract violation;
this builder has already been used
builder: #<vector-builder>
in: the 1st argument of
(->
unused-vector-builder/c
any/c
...
unused-vector-builder/c)
contract from:
<pkgs>/rebellion/private/vector-builder.rkt
blaming: top-level
(assuming the contract is correct)
at: <pkgs>/rebellion/private/vector-builder.rkt:12.3
procedure
(vector-builder-add-all builder seq) → unused-vector-builder/c
builder : unused-vector-builder/c seq : (sequence/c any/c)
> (define builder (make-vector-builder)) > (vector-builder-add-all builder (in-range 0 20)) #<vector-builder>
> (vector-builder-add-all builder (in-range 20 40)) vector-builder-add-all: contract violation;
this builder has already been used
builder: #<vector-builder>
in: the 1st argument of
(->
unused-vector-builder/c
(sequence/c any/c)
unused-vector-builder/c)
contract from:
<pkgs>/rebellion/private/vector-builder.rkt
blaming: top-level
(assuming the contract is correct)
at: <pkgs>/rebellion/private/vector-builder.rkt:14.3
procedure
(build-vector builder) → immutable-vector?
builder : unused-vector-builder/c
> (define builder (vector-builder-add-all (make-vector-builder) (in-range 0 10))) > (build-vector builder) '#(0 1 2 3 4 5 6 7 8 9)
> (build-vector builder) build-vector: contract violation;
this builder has already been used
builder: #<vector-builder>
in: the 1st argument of
(->
unused-vector-builder/c
immutable-vector?)
contract from:
<pkgs>/rebellion/private/vector-builder.rkt
blaming: top-level
(assuming the contract is correct)
at: <pkgs>/rebellion/private/vector-builder.rkt:16.3
procedure
(build-mutable-vector builder)
→ (and/c vector? (not/c immutable?)) builder : unused-vector-builder/c
> (define builder (vector-builder-add-all (make-vector-builder) (in-range 0 10))) > (build-mutable-vector builder) '#(0 1 2 3 4 5 6 7 8 9)
> (build-mutable-vector builder) build-mutable-vector: contract violation;
this builder has already been used
builder: #<vector-builder>
in: the 1st argument of
(->
unused-vector-builder/c
(and/c vector? (not/c immutable?)))
contract from:
<pkgs>/rebellion/private/vector-builder.rkt
blaming: top-level
(assuming the contract is correct)
at: <pkgs>/rebellion/private/vector-builder.rkt:17.3