6.1. Miscellaneous algorithms

The ALGORITHM module provides array and collection manipulation algorithms including sorting, searching, set operations, element removal, and more.

Key features:

  • Search: lower_bound, upper_bound, binary_search, equal_range

  • Array manipulation: unique, sort_unique, reverse, combine, fill, rotate, erase_all, min_element, max_element, is_sorted, topological_sort

  • Set operations (on tables): intersection, union, difference, symmetric_difference, identical, is_subset

Most functions also support fixed-size arrays via [expect_any_array] overloads.

See Algorithm for a hands-on tutorial.

All functions and symbols are in “algorithm” module, use require to get access to it.

require daslib/algorithm

Example:

require daslib/algorithm

    [export]
    def main() {
        var arr <- [3, 1, 4, 1, 5, 9, 2, 6, 5]
        sort_unique(arr)
        print("sort_unique: {arr}\n")
        print("has 4: {binary_search(arr, 4)}\n")
        print("has 7: {binary_search(arr, 7)}\n")
        print("lower_bound(4): {lower_bound(arr, 4)}\n")
        print("upper_bound(4): {upper_bound(arr, 4)}\n")
        let er = equal_range(arr, 5)
        print("equal_range(5): {er}\n")
        print("min index: {min_element(arr)}\n")
        print("is_sorted: {is_sorted(arr)}\n")
    }

6.1.2. Array manipulation

6.1.2.1. combine

combine(a: array<auto(TT)>; b: array<auto(TT)> ): auto

def combine (a: array<auto(TT)>; b: array<auto(TT)>) : auto

Arguments:
  • a : array<auto(TT)>

  • b : array<auto(TT)>

combine(a: auto; b: auto ): auto

erase_all(arr: auto; value: auto ): auto

def erase_all (var arr: auto; value: auto) : auto

Arguments:
  • arr : auto

  • value : auto

6.1.2.2. fill

fill(a: array<auto(TT)>; value: TT ): auto

def fill (var a: array<auto(TT)>; value: TT) : auto

Arguments:
  • a : array<auto(TT)>

  • value : TT

fill(a: auto; value: auto ): auto

6.1.2.3. is_sorted

is_sorted(a: array<auto(TT)> ): bool

def is_sorted (a: array<auto(TT)>) : bool

Arguments:
  • a : array<auto(TT)>

is_sorted(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): bool
is_sorted(a: auto ): bool

6.1.2.4. max_element

max_element(a: array<auto(TT)> ): int

def max_element (a: array<auto(TT)>) : int

Arguments:
  • a : array<auto(TT)>

max_element(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): int
max_element(a: auto ): int

6.1.2.5. min_element

min_element(a: array<auto(TT)> ): int

def min_element (a: array<auto(TT)>) : int

Arguments:
  • a : array<auto(TT)>

min_element(a: array<auto(TT)>; less: block<(a:TT;b:TT):bool> ): int
min_element(a: auto ): int

6.1.2.6. reverse

reverse(a: array<auto> ): auto

def reverse (var a: array<auto>) : auto

Arguments:
  • a : array<auto>

reverse(a: auto ): auto

6.1.2.7. rotate

rotate(a: array<auto>; mid: int ): auto

def rotate (var a: array<auto>; mid: int) : auto

Arguments:
  • a : array<auto>

  • mid : int

rotate(a: auto; mid: int ): auto

sort_unique(a: array<auto(TT)> ): auto

def sort_unique (var a: array<auto(TT)>) : auto

Arguments:
  • a : array<auto(TT)>

topological_sort(nodes: array<auto(Node)> ): auto

def topological_sort (nodes: array<auto(Node)>) : auto

Arguments:
  • nodes : array<auto(Node)>

unique(a: array<auto(TT)> ): auto

def unique (var a: array<auto(TT)>) : auto

Arguments:
  • a : array<auto(TT)>

6.1.3. Table manipulation

difference(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>

def difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>

identical(a: table<auto(TT), void>; b: table<auto(TT), void> ): bool

def identical (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>

intersection(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>

def intersection (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>

is_subset(a: table<auto(TT), void>; b: table<auto(TT), void> ): bool

def is_subset (a: table<auto(TT), void>; b: table<auto(TT), void>) : bool

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>

symmetric_difference(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>

def symmetric_difference (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>

union(a: table<auto(TT), void>; b: table<auto(TT), void> ): table<TT, void>

def union (a: table<auto(TT), void>; b: table<auto(TT), void>) : table<TT, void>

Arguments:
  • a : table<auto(TT);void>

  • b : table<auto(TT);void>