shine_tree

Types

An ordered tree of values used to implement other kinds of data structures like queues. Elements can be added or removed from the head or tail of the tree in nearly constant time.

pub opaque type ShineTree(u)

Constants

pub const empty: ShineTree(a)

Functions

pub fn all(tree: ShineTree(a), f: fn(a) -> Bool) -> Bool

Returns true if the predicate f returns True for each element in the ShineTree. Returns False otherwise.

Examples

shine_tree.all(shine_tree.empty, fn(x) { x == 0 })
// -> True
all(shine_tree.from_list([-1, -42]), fn(x) { x < 0 })
// -> True
all(shine_tree.from_list([2, 4, 6, 8, 10, 11]), int.is_even)
// -> False
pub fn any(tree: ShineTree(a), f: fn(a) -> Bool) -> Bool

Returns True if the predicate f returns True for any element in the ShineTree. Returns False otherwise.

Examples

// No items in the tree will always be false
any(shine_tree.empty, int.is_even)
// -> False
any([10, 32, 42, 43, 44], fn(x) { x == 42 })
// -> True
any([3, 4], fn(x) { x + 1 == 42 })
// -> False
pub fn append(
  tree_1: ShineTree(a),
  tree_2: ShineTree(a),
) -> ShineTree(a)
pub fn concat(trees: List(ShineTree(a))) -> ShineTree(a)
pub fn contains(tree: ShineTree(a), u: a) -> Bool
pub fn count(tree: ShineTree(a), where f: fn(a) -> Bool) -> Int

Counts the number of elements in a given ShineTree satisfying a given predicate.

This function has to traverse the entire tree to determine the number of elements, so it runs in linear time.

Examples

count(shine_tree.from_list([2, 3, 4, 5, 6, 7, 8, 9, 10]), int.is_even)
// -> 5
pub fn equals(a: ShineTree(a), b: ShineTree(a)) -> Bool

Compares two trees for equality. Since trees can have many shapes, the items can be in the correct order and values, but the tree is balanced differently.

This function reduces over the two trees and compares their values, immediately returning False if they are not equal.

pub fn filter(
  tree: ShineTree(a),
  f: fn(a) -> Bool,
) -> ShineTree(a)

Creates a new tree containing all the elements of the given tree, for which the given predicate returns True.

shine_tree.from_list([1, 2, 3, 4, 5, 6, 7])
|> filter(int.is_odd)
// -> shine_tree.from_list([1, 3, 5, 7])
pub fn fold_l(
  over tree: ShineTree(a),
  from v: b,
  with f: fn(c, a) -> c,
) -> c

Reduces all the elements of the given tree into a single value, made by calling a given function on all the elements, traversing the tree from left to right.

fold_l(shine_tree.from_list([1, 2, 3]), 0, int.add) is the equivalent of add(add(add(0, 1), 2), 3).

// calculate 20! (factorial)
let n = 20
shine_tree.fold_l(shine_tree.range(2, n), int.multiply)
// -> 2432902008176640000
pub fn fold_r(tree: ShineTree(a), v: b, f: fn(c, a) -> c) -> c

Reduces all the elements of the given tree into a single value, made by calling a given function on all the elements, traversing the tree from left to right.

fold_r(shine_tree.from_list([1, 2, 3]), 0, int.add) is the equivalent of add(add(add(0, 3), 2), 1).

// calculate 20! (factorial)
let n = 20
shine_tree.fold_r(shine_tree.range(2, n), int.multiply)
// -> 2432902008176640000
pub fn fold_until(
  tree: ShineTree(a),
  v: b,
  with f: fn(b, a) -> ContinueOrStop(b),
) -> b

Fold a given value over the items of a given tree, starting with the beginning until the given function returns Stop.

The accumulated value is then returned.

Examples

fold_until(shine_tree.from_list([2, 3, 4, 5, 6, 7, 8, 9, 10]), 0, fn(acc, x) {
  case x {
    5 -> Stop(acc + 1)
    _ -> Continue(acc + x)
  }
})
// -> 10
pub fn from_iterator(iterable: Iterator(a)) -> ShineTree(a)
pub fn from_list(values: List(a)) -> ShineTree(a)

Creates a new tree containing all the elements of the given list.

shine_tree.from_list([1, 2, 3, 4, 5, 6, 7])
// -> It's a ShineTree with all the items in it!
// Were you expecting a list?
pub fn map(
  tree: ShineTree(a),
  with f: fn(a) -> b,
) -> ShineTree(b)

Maps all the elements of the given tree into a new tree where each element has been transformed by the given function.

let tree = shine_tree.from_list([1, 2, 3])
shine_tree.map(tree, int.multiply(2, _))
// -> shine_tree.from_list([2, 4, 6])
pub fn pop(tree: ShineTree(a)) -> Result(#(a, ShineTree(a)), Nil)

Pops an element from the end of the given tree.

If there are no items, it returns Error(Nil), otherwise it returns the popped item, and the resulting tree with the element removed.

let tree = shine_tree.from_list([1, 2, 3])
shine_tree.pop(tree)
// -> Ok(3, shine_tree.from_list([1, 2]))
shine_tree.empty |> shine_tree.pop
// -> Error(Nil)
pub fn prepend(
  tree_1: ShineTree(a),
  tree_2: ShineTree(a),
) -> ShineTree(a)
pub fn push(tree: ShineTree(a), value: a) -> ShineTree(a)

Pushes an element to the end of the given tree.

let tree = shine_tree.from_list([1, 2, 3])
shine_tree.push(tree, 4)
// -> shine_tree.from_list([1, 2, 3, 4])
pub fn range(start: Int, finish: Int) -> ShineTree(Int)

Creates a tree of n consecutive integers, starting from start. and finishing with finish.

Examples

let ten_items = shine_tree.range(1, 10)
pub fn reverse(tree: ShineTree(a)) -> ShineTree(a)
pub fn shift(
  tree: ShineTree(a),
) -> Result(#(a, ShineTree(a)), Nil)

Pops an element from the front of the given tree.

If there are no items, it returns Error(Nil), otherwise it returns the popped item, and the resulting tree with the element removed.

let tree = shine_tree.from_list([1, 2, 3])
shine_tree.shift(tree)
// -> Ok(1, shine_tree.from_list([2, 3]))
shine_tree.empty |> shine_tree.pop
// -> Error(Nil)
pub fn single(u: a) -> ShineTree(a)
pub fn size(tree: ShineTree(a)) -> Int
pub fn to_iterator(tree: ShineTree(a)) -> Iterator(a)

Creates an iterator from a given tree, yielding each element in succession until there are no elements left.

Examples

let iter = unfold(shine_tree.from_list([1, 2, 3]))

let #(num, iter) = iterator.step(iter)
// -> Next(1, Iterator(Int))
let #(num, iter) = iterator.step(iter)
// -> Next(2, Iterator(Int))
let #(num, iter) = iterator.step(iter)
// -> Next(3, Iterator(Int))
let a = iterator.step(iter)
// -> Done
pub fn to_list(tree: ShineTree(a)) -> List(a)

Creates a new list containing all the elements of the given tree.

shine_tree.from_list([1, 2, 3, 4, 5, 6, 7])
|> to_list
// -> [1, 2, 3, 4, 5, 6, 7]
pub fn unshift(tree: ShineTree(a), value: a) -> ShineTree(a)

Pushes an element to the beginning of the given tree.

let tree = shine_tree.from_list([1, 2, 3])
shine_tree.unshift(tree, 0)
// -> shine_tree.from_list([0, 1, 2, 3])
Search Document