Skip to content

Array[A: A]

[Source]

Contiguous, resizable memory to store elements of type A.

Usage

Creating an Array of String.

  let array: Array[String] = ["dog"; "cat"; "wombat"]
  // array.size() == 3
  // array.space() >= 3

Creating an empty Array of String, which may hold at least 10 elements before requesting more space.

  let array = Array(10)
  // array.size() == 0
  // array.space() >= 10

Accessing elements can be done via the apply(i: USize): this->A ? method. The provided index might be out of bounds so apply is partial and has to be called within a try-catch block or inside another partial method.

  let array: Array[String] = ["dog"; "cat"; "wombat"]
  let is_second_element_wobat = try
    // indexes start from 0, so 1 is the second element
    array(1)? == "wombat"
  else
    false
  end

Adding and removing elements to and from the end of the Array can be done via push and pop methods. You could treat the array as a FIFO queue using those methods.

  while (array.size() > 0) do
    let elem = array.pop()?
    // do something with element
  end

Modifying the Array can be done via update, insert and delete methods which alter the Array at an arbitrary index, moving elements left (when deleting) or right (when inserting) as necessary.

Iterating over the elements of an Array can be done using the values method.

  for element in array.values() do
      // do something with element
  end

Memory allocation

Array allocates contiguous memory. It always allocates at least enough memory space to hold all of its elements. Space is the number of elements the Array can hold without allocating more memory. The space() method returns the number of elements an Array can hold. The size() method returns the number of elements the Array holds.

Different data types require different amounts of memory. Array[U64] with size of 6 will take more memory than an Array[U8] of the same size.

When creating an Array or adding more elements will calculate the next power of 2 of the requested number of elements and allocate that much space, with a lower bound of space for 8 elements.

Here's a few examples of the space allocated when initialising an Array with various number of elements:

size space
0 0
1 8
8 8
9 16
16 16
17 32

Call the compact() method to ask the GC to reclaim unused space. There are no guarantees that the GC will actually reclaim any space.

class ref Array[A: A] is
  Seq[A] ref

Implements


Constructors

create

[Source]

Create an array with zero elements, but space for len elements.

new ref create(
  len: USize val = seq)
: Array[A] ref^

Parameters

Returns


init

[Source]

Create an array of len elements, all initialised to the given value.

new ref init(
  from: A^,
  len: USize val)
: Array[A] ref^

Parameters

  • from: A^
  • len: USize val

Returns


from_cpointer

[Source]

Create an array from a C-style pointer and length. The contents are not copied.

new ref from_cpointer(
  ptr: Pointer[A] ref,
  len: USize val,
  alloc: USize val = seq)
: Array[A] ref^

Parameters

Returns


Public Functions

cpointer

[Source]

Return the underlying C-style pointer.

fun box cpointer(
  offset: USize val = seq)
: Pointer[A] tag

Parameters

  • offset: USize val = seq

Returns


size

[Source]

The number of elements in the array.

fun box size()
: USize val

Returns


space

[Source]

The available space in the array.

fun box space()
: USize val

Returns


reserve

[Source]

Reserve space for len elements, including whatever elements are already in the array. Array space grows geometrically.

fun ref reserve(
  len: USize val)
: None val

Parameters

Returns


compact

[Source]

Try to remove unused space, making it available for garbage collection. The request may be ignored.

fun ref compact()
: None val

Returns


undefined[optional B: (A & Real[B] val & (I8 val | I16 val | I32 val | I64 val | I128 val | ILong val | ISize val | U8 val | U16 val | U32 val | U64 val | U128 val | ULong val | USize val | F32 val | F64 val))]

[Source]

Resize to len elements, populating previously empty elements with random memory. This is only allowed for an array of numbers.

fun ref undefined[optional B: (A & Real[B] val & (I8 val | I16 val | I32 val | 
    I64 val | I128 val | ILong val | 
    ISize val | U8 val | U16 val | 
    U32 val | U64 val | U128 val | 
    ULong val | USize val | F32 val | 
    F64 val))](
  len: USize val)
: None val

Parameters

Returns


apply

[Source]

Get the i-th element, raising an error if the index is out of bounds.

fun box apply(
  i: USize val)
: this->A ?

Parameters

Returns

  • this->A ?

update

[Source]

Change the i-th element, raising an error if the index is out of bounds.

fun ref update(
  i: USize val,
  value: A)
: A^ ?

Parameters

Returns

  • A^ ?

insert

[Source]

Insert an element into the array. Elements after this are moved up by one index, extending the array. An out of bounds index raises an error.

fun ref insert(
  i: USize val,
  value: A)
: None val ?

Parameters

Returns


delete

[Source]

Delete an element from the array. Elements after this are moved down by one index, compacting the array. An out of bounds index raises an error. The deleted element is returned.

fun ref delete(
  i: USize val)
: A^ ?

Parameters

Returns

  • A^ ?

truncate

[Source]

Truncate an array to the given length, discarding excess elements. If the array is already smaller than len, do nothing.

fun ref truncate(
  len: USize val)
: None val

Parameters

Returns


trim_in_place

[Source]

Trim the array to a portion of itself, covering from until to. Unlike slice, the operation does not allocate a new array nor copy elements.

fun ref trim_in_place(
  from: USize val = seq,
  to: USize val = seq)
: None val

Parameters

Returns


trim

[Source]

Return a shared portion of this array, covering from until to. Both the original and the new array are immutable, as they share memory. The operation does not allocate a new array pointer nor copy elements.

fun val trim(
  from: USize val = seq,
  to: USize val = seq)
: Array[A] val

Parameters

Returns


chop

[Source]

Chops the array in half at the split point requested and returns both the left and right portions. The original array is trimmed in place and returned as the right portion. If the split point is larger than the array, the left portion is the original array and the right portion is a new empty array. Both arrays are isolated and mutable, as they do not share memory. The operation does not allocate a new array pointer nor copy elements.

fun iso chop(
  split_point: USize val)
: (Array[A] iso^ , Array[A] iso^)

Parameters

Returns


copy_to

[Source]

Copy len elements from this(src_idx) to dst(dst_idx).

fun box copy_to(
  dst: Array[this->A!] ref,
  src_idx: USize val,
  dst_idx: USize val,
  len: USize val)
: None val

Parameters

Returns


remove

[Source]

Remove n elements from the array, beginning at index i.

fun ref remove(
  i: USize val,
  n: USize val)
: None val

Parameters

Returns


clear

[Source]

Remove all elements from the array.

fun ref clear()
: None val

Returns


push

[Source]

Add an element to the end of the array.

fun ref push(
  value: A)
: None val

Parameters

  • value: A

Returns


pop

[Source]

Remove an element from the end of the array. The removed element is returned.

fun ref pop()
: A^ ?

Returns

  • A^ ?

unshift

[Source]

Add an element to the beginning of the array.

fun ref unshift(
  value: A)
: None val

Parameters

  • value: A

Returns


shift

[Source]

Remove an element from the beginning of the array. The removed element is returned.

fun ref shift()
: A^ ?

Returns

  • A^ ?

append

[Source]

Append the elements from a sequence, starting from the given offset.

fun ref append(
  seq: (ReadSeq[A] box & ReadElement[A^] box),
  offset: USize val = seq,
  len: USize val = seq)
: None val

Parameters

Returns


concat

[Source]

Add len iterated elements to the end of the array, starting from the given offset.

fun ref concat(
  iter: Iterator[A^] ref,
  offset: USize val = seq,
  len: USize val = seq)
: None val

Parameters

Returns


find

[Source]

Find the nth appearance of value from the beginning of the array, starting at offset and examining higher indices, and using the supplied predicate for comparisons. Returns the index of the value, or raise an error if the value isn't present.

By default, the search starts at the first element of the array, returns the first instance of value found, and uses object identity for comparison.

fun box find(
  value: A!,
  offset: USize val = seq,
  nth: USize val = seq,
  predicate: {(box->A!, box->A!): Bool}[A] val = seq)
: USize val ?

Parameters

  • value: A!
  • offset: USize val = seq
  • nth: USize val = seq
  • predicate: {(box->A!, box->A!): Bool}[A] val = seq

Returns


contains

[Source]

Returns true if the array contains value, false otherwise.

The default predicate checks for matches by identity. To search for matches by structural equality, pass an object literal such as {(l, r) => l == r}.

fun box contains(
  value: A!,
  predicate: {(box->A!, box->A!): Bool}[A] val = seq)
: Bool val

Parameters

  • value: A!
  • predicate: {(box->A!, box->A!): Bool}[A] val = seq

Returns


rfind

[Source]

Find the nth appearance of value from the end of the array, starting at offset and examining lower indices, and using the supplied predicate for comparisons. Returns the index of the value, or raise an error if the value isn't present.

By default, the search starts at the last element of the array, returns the first instance of value found, and uses object identity for comparison.

fun box rfind(
  value: A!,
  offset: USize val = seq,
  nth: USize val = seq,
  predicate: {(box->A!, box->A!): Bool}[A] val = seq)
: USize val ?

Parameters

  • value: A!
  • offset: USize val = seq
  • nth: USize val = seq
  • predicate: {(box->A!, box->A!): Bool}[A] val = seq

Returns


clone

[Source]

Clone the array. The new array contains references to the same elements that the old array contains, the elements themselves are not cloned.

fun box clone()
: Array[this->A!] ref^

Returns


slice

[Source]

Create a new array that is a clone of a portion of this array. The range is exclusive and saturated. The new array contains references to the same elements that the old array contains, the elements themselves are not cloned.

fun box slice(
  from: USize val = seq,
  to: USize val = seq,
  step: USize val = seq)
: Array[this->A!] ref^

Parameters

Returns


permute

[Source]

Create a new array with the elements permuted. Permute to an arbitrary order that may include duplicates. An out of bounds index raises an error. The new array contains references to the same elements that the old array contains, the elements themselves are not copied.

fun box permute(
  indices: Iterator[USize val] ref)
: Array[this->A!] ref^ ?

Parameters

Returns


reverse

[Source]

Create a new array with the elements in reverse order. The new array contains references to the same elements that the old array contains, the elements themselves are not copied.

fun box reverse()
: Array[this->A!] ref^

Returns


reverse_in_place

[Source]

Reverse the array in place.

fun ref reverse_in_place()
: None val

Returns


swap_elements

[Source]

Swap the element at index i with the element at index j. If either i or j are out of bounds, an error is raised.

fun ref swap_elements(
  i: USize val,
  j: USize val)
: None val ?

Parameters

Returns


keys

[Source]

Return an iterator over the indices in the array.

fun box keys()
: ArrayKeys[A, this->Array[A] ref] ref^

Returns


values

[Source]

Return an iterator over the values in the array.

fun box values()
: ArrayValues[A, this->Array[A] ref] ref^

Returns


pairs

[Source]

Return an iterator over the (index, value) pairs in the array.

fun box pairs()
: ArrayPairs[A, this->Array[A] ref] ref^

Returns


Private Functions

_copy_to

[Source]

Copy copy_len elements from this to that at specified offsets.

fun box _copy_to(
  ptr: Pointer[this->A!] ref,
  copy_len: USize val,
  from_offset: USize val = seq,
  to_offset: USize val = seq)
: None val

Parameters

Returns