Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Data.Frozen

Frozen arrays: the immutable array representation.

A Frozen(a) is an Array(a) with the write surface removed at the type level: construction happens once and afterwards the contents are fixed, so a frozen array can be shared, stored, and indexed with no defensive copies. Freezing is O(1) and adds no storage: arrays already carry value semantics (a uniquely owned array updates in place, a shared one copies on write), so a frozen view can never observe later writes to its source.

Types

Frozen

type Frozen(a) = Frz(Array(a))

An immutable array of a.

Functions and Values

fz_freeze

fz_freeze : forall a. (Array(a)) -> Data.Frozen.Frozen(a)

Freeze a growable array, O(1). Value semantics guarantee the frozen view is independent of any later writes to arr.

fz_len(fz_freeze(array_of_list([1, 2, 3])))
3

fz_of_list

fz_of_list : forall a. (List(a)) -> Data.Frozen.Frozen(a)

Build a frozen array from a list.

fz_get(fz_of_list([5, 6, 7]), 2)
7

fz_thaw

fz_thaw : forall a. (Data.Frozen.Frozen(a)) -> Array(a)

A growable array with the frozen contents. The frozen view is unaffected by writes to the result (a shared array copies on write).

fz_len

fz_len : forall a. (Data.Frozen.Frozen(a)) -> Int

The element count.

fz_get

fz_get : forall a. (Data.Frozen.Frozen(a), Int) -> a ! {Fail}

The element at i, or fail() out of bounds.

fz_get(fz_of_list([5, 6, 7]), 0)
5

fz_foldl

fz_foldl : forall e0 a b. ((a, b) -> a ! {e0}, a, Data.Frozen.Frozen(b)) -> a ! {e0}

Left-fold over the elements in order.

fz_foldl(\(acc, x) -> acc + x, 0, fz_of_list([1, 2, 3]))
6

fz_to_list

fz_to_list : forall a. (Data.Frozen.Frozen(a)) -> List(a)

The elements as a list, in order.

fz_to_list(fz_of_list([1, 2, 3]))
[1, 2, 3]

fz_map

fz_map : forall e0 a b. ((b) -> a ! {e0}, Data.Frozen.Frozen(b)) -> Data.Frozen.Frozen(a) ! {e0}

A new frozen array with f applied to every element, one pass.

fz_to_list(fz_map(\(x) -> x * 2, fz_of_list([1, 2, 3])))
[2, 4, 6]