Errow.String (errow v0.1.0)

Copy Markdown View Source

An immutable, continuous-memory string array implementing the Apache Arrow Utf8 columnar format.

Under the hood, data is organized in three buffers:

  1. Offsets buffer (offsets): a continuous binary of 32-bit signed integers in little-endian.
  2. Data buffer (data): a continuous binary containing the concatenated UTF-8 string bytes.
  3. Validity bitmap (validity): a bitstring tracking null (nil) values (1 bit per element).

Features

  • O(1) Random Access: Slicing and indexing (array[i]) use binary_part/3 without copying memory.
  • Full Protocol Integration: Implements Enumerable, Collectable, and Access.
  • Arrow Compatible: 100% byte-for-byte compliant with the Apache Arrow specification.

Summary

Functions

Appends a string or nil to the array.

Returns the byte size of the continuous data buffer.

Deletes the element at index idx.

Fetches the element at the given index or a slice specified by a range. Supports negative indices (e.g. -1 for the last element).

Builds an Errow.String array from a list or enumerable of strings and optional nils.

Gets the value at index idx or returns default if out of bounds.

Joins the strings in the array with the given separator. Null values are skipped by default.

Finds the lexicographically largest string in the array.

Finds the lexicographically smallest string in the array.

Creates a new empty Errow.String array.

Checks if the value at the given index is null (nil).

Returns the count of null values.

Replaces the element at the given index with a new string or nil.

Returns the number of elements in the array.

Converts the Errow.String array into a standard Elixir list.

Returns the sum of byte lengths of all strings in the array.

Types

t()

@type t() :: %Errow.String{
  data: binary(),
  length: non_neg_integer(),
  null_count: non_neg_integer(),
  offsets: binary(),
  validity: bitstring()
}

Functions

append(arr, str)

@spec append(t(), binary() | nil) :: t()

Appends a string or nil to the array.

buffer_byte_size(string)

@spec buffer_byte_size(t()) :: non_neg_integer()

Returns the byte size of the continuous data buffer.

delete_at(arr, idx)

@spec delete_at(t(), integer()) :: t()

Deletes the element at index idx.

fetch(arr, idx)

@spec fetch(t(), integer() | Range.t()) :: {:ok, any()} | :error

Fetches the element at the given index or a slice specified by a range. Supports negative indices (e.g. -1 for the last element).

from_list(enumerable)

@spec from_list(Enumerable.t()) :: t()

Builds an Errow.String array from a list or enumerable of strings and optional nils.

get(arr, idx, default \\ nil)

@spec get(t(), integer(), any()) :: binary() | nil | any()

Gets the value at index idx or returns default if out of bounds.

join(arr, separator \\ "", opts \\ [])

@spec join(t(), binary(), keyword()) :: binary()

Joins the strings in the array with the given separator. Null values are skipped by default.

max(arr, opts \\ [])

@spec max(t(), keyword()) :: binary() | nil

Finds the lexicographically largest string in the array.

min(arr, opts \\ [])

@spec min(t(), keyword()) :: binary() | nil

Finds the lexicographically smallest string in the array.

new()

@spec new() :: t()

Creates a new empty Errow.String array.

null?(string, idx)

@spec null?(t(), integer()) :: boolean()

Checks if the value at the given index is null (nil).

null_count(string)

@spec null_count(t()) :: non_neg_integer()

Returns the count of null values.

replace_at(arr, idx, new_val)

@spec replace_at(t(), integer(), binary() | nil) :: t()

Replaces the element at the given index with a new string or nil.

size(string)

@spec size(t()) :: non_neg_integer()

Returns the number of elements in the array.

to_list(arr)

@spec to_list(t()) :: [binary() | nil]

Converts the Errow.String array into a standard Elixir list.

total_bytes(string)

@spec total_bytes(t()) :: non_neg_integer()

Returns the sum of byte lengths of all strings in the array.