Skip to content

API Reference

Constants

None

As Lua dictionaries cannot distinguish between a value not being present and a value of nil, Llama.None exists to represent values that should be interpreted as nil. This is especially useful when removing values with Dictionary.merge.


Dictionary

Dictionaries are tables with key-value pairs.

Constructors

fromLists

Llama.Dictionary.fromLists(keys, values) -> dictionary

Returns a new dictionary constructed from keys and values. The lists are expected to be the same size.

Example:

local keys = { "foo", "bar", "baz" }
local values = { 1, 2, 3 }

Llama.Dictionary.fromLists(keys, values)

Results:

{
    foo = 1,
    bar = 2,
    baz = 3,
}

Copying

copy

Llama.Dictionary.copy(dictionary) -> dictionary

Returns a shallow copy of dictionary.


copyDeep

Llama.Dictionary.copyDeep(dictionary) -> dictionary

Returns a deep copy of dictionary.

Warning

Deep copying is more expensive than shallow copying and forces you to resort to the more expensive equalsDeep for value equality checking. Only use it when absolutely necessary.


Comparing

equals

Llama.Dictionary.equals(...dictionaries) -> result

Returns whether all dictionaries have shallow value equality.


equalsDeep

Llama.Dictionary.equalsDeep(...dictionaries) -> result

Returns whether all dictionaries have deep value equality.

Warning

Deep comparison is more expensive than shallow comparison. Only use it when absolutely necessary.


Persistent changes

merge

Llama.Dictionary.merge(...dictionaries) -> dictionary

Returns a new dictionary with all of the entries of dictionaries merged together. Later entries replace older ones, and Llama.None can be used to remove values.

Aliases
join

Example:

local a = {
    key = "value",
    foo = "bar",
    removeMe = 0,
}

local b = {
    removeMe = Llama.None,
    addMe = 1,
}

Llama.Dictionary.merge(a, b)
Results:
{
    key = "value",
    foo = "bar",
    addMe = 1,
}


mergeDeep

Llama.Dictionary.mergeDeep(...dictionaries) -> dictionary
Returns a new dictionary with all of the entries of dictionaries deeply merged together. Later entries replace older ones, and Llama.None can be used to remove values.

Aliases
joinDeep

Example:

local a = {
    key = "value",
    foo = "bar",
    dictionary = {
        foo = "foo",
        bar = "bar",
    },
    removeMe = 0,
}

local b = {
    removeMe = Llama.None,
    addMe = 1,
    dictionary = {
        baz = "baz",
    },
}

Llama.Dictionary.mergeDeep(a, b)
Results:
{
    key = "value",
    foo = "bar",
    addMe = 1,
    dictionary = {
        foo = "foo",
        bar = "bar",
        baz = "baz",
    },
}

Warning

Deep merging is more expensive than shallow merging and forces you to resort to the more expensive equalsDeep for value equality checking. Only use it when absolutely necessary.


removeKey

Llama.Dictionary.removeKey(dictionary, key) -> dictionary

Returns a new dictionary with the entry at key is removed from dictionary.


removeKeys

Llama.Dictionary.removeKeys(dictionary, ...keys) -> dictionary

Returns new dictionary with entries at keys are removed from dictionary.


removeValue

Llama.Dictionary.removeValue(dictionary, value) -> dictionary

Returns a new dictionary where any entry with value are removed from dictionary.


removeValues

Llama.Dictionary.removeValues(dictionary, ...values) -> dictionary

Returns a new dictionary where any entry with any values are removed from dictionary.


set

Llama.Dictionary.set(dictionary, key, value) -> dictionary

Returns a new dictionary with the entry at key in dictionary is set to value.


update

Llama.Dictionary.update(dictionary, key[, updater[, callback]]) -> dictionary

Returns a new dictionary with the entry at key is updated by updater. If the entry does not exist, callback is invoked and the entry is created from its return value.

updater and callback are expected to have the following signatures:

updater(value, key) -> value
callback(key) -> value

Example:

local dictionary = {
    foo = "foo",
    bar = "bar",
}

local function fooify(value)
    return "foo" .. value
end

Llama.Dictionary.update(dictionary, "bar", fooify)
Llama.Dictionary.update(dictionary, "baz", fooify, function()
    return "baz"
end)

Results:

{
    foo = "foo",
    bar = "foobar",
}

{
    foo = "foo",
    bar = "bar",
    baz = "baz",
}

Sequence algorithms

filter

Llama.Dictionary.filter(dictionary, filterer) -> dictionary

Returns a new dictionary with only the entries of dictionary for which filterer returns a truthy.

filterer is expected to have the following signature:

filterer(value, key) -> result

Example:

local dictionary = {
    foo1 = "foo",
    foo2 = "foo",
    bar1 = "bar",
}

local function onlyFoo(value)
    return value == "foo"
end

Llama.Dictionary.filter(dictionary, onlyFoo)

Results:

{
    foo1 = "foo",
    foo2 = "foo",
}

flip

Llama.Dictionary.flip(dictionary) -> dictionary

Returns a new dictionary with the keys and values of dictionary swapped.

Example:

local dictionary = {
    foo = "oof",
    bar = "rab",
    baz = "zab",
}

Llama.Dictionary.flip(dictionary)

Results:

{
    oof = "foo",
    rab = "bar",
    zab = "baz",
}

map

Llama.Dictionary.map(dictionary, mapper) -> dictionary

Returns a new dictionary with the values (and keys) of dictionary mapped over using mapper.

mapper is expected to have the following signature:

mapper(value, key) -> value[, key]

Example:

local dictionary = {
    foo = "foo",
    bar = "bar",
    baz = "baz",
}

local function fooify(value)
    return "foo" .. value
end

Llama.Dictionary.map(dictionary, fooify)

Results:

{
    foo = "foofoo",
    bar = "foobar",
    baz = "foobaz",
}

Reading values

has

Llama.Dictionary.has(dictionary, key) -> result

Returns whether dictionary has a value at the key.


includes

Llama.Dictionary.includes(dictionary, value) -> result

Returns whether dictionary includes a value.


Conversion

keys

Llama.Dictionary.keys(dictionary) -> list

Returns a list of dictionary's keys.


values

Llama.Dictionary.values(dictionary) -> list

Returns a list of dictionary's values.


Reducing

count

Llama.Dictionary.count(dictionary[, predicate]) -> result

Returns the number of entries in dictionary for which predicate returns a truthy. If predicate is not provided, count simply counts all of the entries in dictionary (useful since #dictionary does not give the number of dictionary entries, only the number of list entries).

predicate is expected to have the following signature:

predicate(value, key) -> result

Example:

local dictionary = {
    foo1 = "foo",
    foo2 = "foo",
    bar1 = "bar",
    bar2 = "bar",
}

local function onlyFoo(value)
    return value == "foo"
end

Llama.Dictionary.count(dictionary, onlyFoo)

Results:

2

every

Llama.Dictionary.every(dictionary, predicate) -> result

Returns whether predicate returns a truthy for all of dictionary's entries.

predicate is expected to have the following signature:

predicate(value, key) -> result

Example:

local a = {
    foo1 = "foo",
    foo2 = "foo",
}

local b = {
    foo = "foo",
    bar = "bar",
    baz = "baz",
}

local function onlyFoo(value)
    return value == "foo"
end

Llama.Dictionary.every(a, onlyFoo)
Llama.Dictionary.every(b, onlyFoo)

Results:

true
false

some

Llama.Dictionary.some(dictionary, predicate) -> result

Returns whether predicate returns a truthy for any of dictionary's entries.

predicate is expected to have the following signature:

predicate(value, key) -> result

Example:

local a = {
    bar1 = "bar",
    bar2 = "bar",
}

local b = {
    foo = "foo",
    bar = "bar",
    baz = "baz",
}

local function onlyFoo(value)
    return value == "foo"
end

Llama.Dictionary.some(a, onlyFoo)
Llama.Dictionary.every(b, onlyFoo)

Results:

false
true

Combination

flatten

Llama.Dictionary.flatten(dictionary[, depth]) -> dictionary

Returns a new dictionary with dictionary's entries flattened to depth or as deeply as possible if depth is not provided.

Example:

local dictionary = {
    foo = "foo",
    foobar = {
        bar = "bar",
        barbaz = {
            baz = "baz",
        }
    }
}

Llama.Dictionary.flatten(dictionary)

Results:

{
    foo = "foo",
    bar = "bar",
    baz = "baz",
}

List

Lists are tables with index-value pairs.

Constructors

create

Llama.List.create(count, value) -> list

Creates a new list of count values.


Copying

copy

Llama.List.copy(list) -> list

Returns a shallow copy of list.


copyDeep

Llama.List.copyDeep(list) -> list

Returns a deep copy of list.

Warning

Deep copying is more expensive than shallow copying and forces you to resort to the more expensive equalsDeep for value equality checking. Only use it when absolutely necessary.


Comparing

equals

Llama.List.equals(...lists) -> result

Returns whether all lists have shallow value equality.


equalsDeep

Llama.List.equalsDeep(...lists) -> result

Returns whether all lists have deep value equality.

Warning

Deep comparison is more expensive than shallow comparison. Only use it when absolutely necessary.


Persistent changes

concat

Llama.List.concat(...lists) -> list

Returns a concatenation of all of the lists in lists.

Aliases
join

Example:

local a = { 1, 2, 3 }
local b = { 4, 5, 6 }

Llama.List.concat(a, b)

Results:

{ 1, 2, 3, 4, 5, 6 }

concatDeep

Llama.List.concatDeep(...lists) -> list

Returns a concatenation of all of the lists in lists with their sublists deep copied.

Aliases
joinDeep

Warning

Deep concatenating is more expensive than shallow concatenating and forces you to resort to the more expensive equalsDeep for value equality checking. Only use it when absolutely necessary.


insert

Llama.List.insert(list, index, ...values) -> list

Returns a new list with values inserted at index of list. If index is 0 or negative, insert inserts at index relative to the end of list.


push

Llama.List.push(list, ...values) -> list

Returns copy of list with values appended to the end of list.

Aliases
append

pop

Llama.List.pop(list[, numPops]) -> list

Returns copy of list with numPops values popped off the end of list.


removeIndex

Llama.List.removeIndex(list, index) -> list

Returns a new list where the entry in list at index is removed. If index is 0 or negative, removeIndex removes at index relative to the end of list.


removeIndices

Llama.List.removeIndices(list, ...indices) -> list

Returns a new list where all entries in list at indices is removed. If an index is 0 or negative, removeIndex removes at the index relative to the end of list.


removeValue

Llama.List.removeValue(list, value) -> list

Returns a new list with all entries of list with value removed.


removeValues

Llama.List.removeValues(list, ...values) -> list

Returns a new list with all entries of list with any values removed.


set

Llama.List.set(list, index, value) -> list

Returns a new list with index in list set to the value. If index is 0 or negative, set sets at index relative to the end of list.


shift

Llama.List.shift(list[, numPlaces]) -> list

Returns new list with numPlaces values shifted off the beginning of list.

Example:

local list = { "foo", "bar", "baz" }

Llama.List.shift(list)

Results:

{ "bar", "baz" }

unshift

Llama.List.unshift(list, ...values) -> list

Returns new list with values prepended to the beginning of list.

Example:

local list = { "baz" }

Llama.List.unshift(list, "foo", "bar")

Results:

{ "foo", "bar", "baz" }

update

Llama.List.update(list, index[, updater[, callback]]) -> list

Returns a new list with the entry at index being updated by updater. If the entry does not exist, callback is invoked and the entry is created from its return value.

updater and callback are expected to have the following signatures:

updater(value, index) -> value
callback(index) -> value

Example:

local list = { "foo", "bar" }

local function fooify(value)
    return "foo" .. value
end

Llama.List.update(list, 2, fooify)
Llama.List.update(list, 3, fooify, function()
    return "baz"
end)

Results:

{ "foo", "foobar" }

{ "foo", "bar", "baz" }

Sequence algorithms

filter

Llama.List.filter(list, filterer) -> list

Returns a new list with only the entries of list for which filterer returns a truthy.

filterer is expected to have the following signature:

filterer(value, index) -> result

Example:

local list = { "foo", "foo", "bar" }

local function onlyFoo(value)
    return value == "foo"
end

Llama.List.filter(list, onlyFoo)

Results:

{ "foo", "foo" }

map

Llama.List.map(list, mapper) -> list

Returns a new list with the values of list mapped over using mapper.

mapper is expected to have the following signature:

mapper(value, index) -> value

Example:

local list = { "foo", "bar", "baz" }

local function fooify(value)
    return "foo" .. value
end

Llama.List.map(list, fooify)

Results:

{ "foofoo", "foobar", "foobaz" }

reverse

Llama.List.reverse(list) -> list

Returns a new list with the entries of list reversed.

Example:

local list = { 1, 2, 3 }

Llama.List.reverse(list)

Results:

{ 3, 2, 1 }

sort

Llama.list.sort(list[, comparator]) -> list

Returns a new list with the entries of list sorted by comparator if given. comparator should return true if the first argument should come before the second, and false otherwise.

comparator is expected to have the following signature:

comparator(a, b) -> result

zip

Llama.list.zip(...lists) -> list

Returns a new list of lists "zipped" together. The length of list is the length of the shortest provided list.

Example:

local a = { "foo", "bar", "baz" }
local b = { 1, 2, 3, 4 }

Llama.List.zip(a, b)

Results:

{
    { "foo", 1 },
    { "bar", 2 },
    { "baz", 3 },
}

zipAll

Llama.list.zipAll(...lists) -> list

Returns a new list of lists "zipped" together. zipAll zips as much as possible, filling in nil values with Llama.None

Example:

local a = { "foo", "bar", "baz" }
local b = { 1, 2, 3, 4 }

Llama.List.zipAll(a, b)

Results:

{
    { "foo", 1 },
    { "bar", 2 },
    { "baz", 3 },
    { Llama.None, 4 },
}

Creating subsets

slice

Llama.List.slice(list[, from[, to]]) -> list

Returns a new list sliced from list. If from is not provided, slice slices from the beginning of list. If to is not provided, slice slices to the end of list.

Example:

local list = { 1, 2, 3, 4, 5 }

Llama.List.slice(list, 1, 3)
{ 1, 2, 3 }

Reading values

first

Llama.List.first(list) -> result

Returns the first value in list.


last

Llama.List.last(list) -> result

Returns the last value in list.


includes

Llama.List.includes(list, value) -> result

Returns whether list includes a value.


Finding a value

find

Llama.List.find(list, value[, from]) -> index

Returns the first index from from if provided for which list has value. If from is 0 or negative, find searches from from relative to the end of list.


findLast

Llama.List.findLast(list, value[, from]) -> index

Returns the last index from from if provided for which list has value. If from is 0 or negative, findLast searches from from relative to the end of list.


findWhere

Llama.List.findWhere(list, predicate[, from]) -> index

Returns the first index from from if provided for which list's value satisfies predicate. If from is 0 or negative, findWhere searches from from relative to the end of list.

predicate is expected to have the following signature:

predicate(value, index) -> result

findWhereLast

Llama.List.findWhereLast(list, predicate[, from]) -> index

Returns the last index from from if provided for which list's value satisfies predicate. If from is 0 or negative, findWhereLast searches from from relative to the end of list.

predicate is expected to have the following signature:

predicate(value, index) -> result

Conversion

toSet

Llama.List.toSet(list) -> list

Returns a new set created from list.


Reducing

count

Llama.List.count(list[, predicate]) -> result

Returns the number of entries in list for which predicate returns a truthy. If no predicate is provided, count simply counts all of the entries in list.

predicate is expected to have the following signature:

predicate(value, index) -> result

Example:

local list = { "foo", "foo", "bar" }

local function onlyFoo(value)
    return value == "foo"
end

Llama.List.count(list, onlyFoo)

Results:

2

every

Llama.List.every(list, predicate) -> result

Returns whether predicate returns a truthy for all of list's entries.

predicate is expected to have the following signature:

predicate(value, index) -> result

Example:

local a = { "foo", "foo" }
local b = { "foo", "foo", "bar" }

local function onlyFoo(value)
    return value == "foo"
end

Llama.List.every(a, onlyFoo)
Llama.List.every(b, onlyFoo)

Results:

true
false

some

Llama.List.some(list, predicate) -> result

Returns whether predicate returns a truthy for any of list's entries.

predicate is expected to have the following signature:

predicate(value, key) -> result

Example:

local a = { "bar", "bar" }
local b = { "foo", "bar", "baz" }

local function onlyFoo(value)
    return value == "foo"
end

Llama.List.some(a, onlyFoo)
Llama.List.some(b, onlyFoo)

Results:

false
true

reduce

Llama.List.reduce(list, reducer[, initialReduction]) -> value

Reduces list to a single value, from left to right. If initialReduction is not provided, reduce uses the first value in list.

reducer is expected to have the following signature:

reducer(reduction, value, key) -> reduction

Example:

local list = { 1, 2, 3 }

local function add(reduction, value)
    return reduction = reduction + value
end

Llama.List.reduce(list, add)

Results:

6

reduceRight

Llama.List.reduceRight(list, reducer[, initialReduction]) -> value

Reduces list to a single value, from right to left. If initialReduction is not provided, reduceRight uses the last value in list.

reducer is expected to have the following signature:

reducer(reduction, value, key) -> reduction

Example:

local list = { 1, 2, 3 }

local function subtract(reduction, value)
    return reduction = reduction - value
end

Llama.List.reduceRight(list, subtract)

Results:

0

Combination

flatten

Llama.List.flatten(list[, depth]) -> list

Returns a new list with all of list's entries flattened to depth or as deeply as possible if depth is not provided.

Example:

local list = {
    "foo",
    {
        "bar",
        {
            "baz",
        }
    }
}

Llama.List.flatten(list)

Results:

{ "foo", "bar", "baz" }

splice

Llama.List.splice(list, from, to, ...values) -> list

Returns a new list with values replacing the values between from and to in list.

Example:

local list = { "foo", 2, 3}

Llama.List.splice(list, 2, 3, "bar", "baz")

Results:

{ "foo", "bar", "baz" }

Set

Sets are tables where each value may only occur once.

Constructors

fromList

Llama.Set.fromList(list) -> set

Creates a set from list.

Example:

local list = { "foo", "bar", "baz" }

Llama.Set.fromList(list)

Results:

{
    foo = true,
    bar = true,
    baz = true,
}

Copying

copy

Llama.Set.copy(set) -> set

Returns a shallow copy of set.


Comparing

isSubset

Llama.Set.isSubset(subset, superset) -> result

Returns whether subset is a subset of superset.

Example:

local a = {
    foo = true,
    bar = true,
}

local b = {
    foo = true,
    bar = true,
    baz = true,
}

Llama.Set.isSubset(a, b)
Llama.Set.isSubset(b, a)

Results:

true
false

isSuperset

Llama.Set.isSuperset(superset, subset) -> result

Returns whether superset is a superset of subset.

Example:

local a = {
    foo = true,
    bar = true,
    baz = true,
}

local b = {
    foo = true,
    bar = true,
}

Llama.Set.isSuperset(a, b)
Llama.Set.isSuperset(b, a)

Results:

true
false

Persistent changes

add

Llama.Set.add(set, ...values) -> set

Returns a new set with values added to set.

Example:

local set = {
    foo = true,
    bar = true,
}

Llama.Set.add(set, "baz")

Results:

{
    foo = true,
    bar = true,
    baz = true,
}

subtract

Llama.Set.subtract(set, ...values) -> set

Returns a new set with values subtracted from set.

Example:

local set = {
    foo = true,
    bar = true,
    baz = true,
}

Llama.Set.subtract(set, "baz")

Results:

{
    foo = true,
    bar = true,
}

union

Llama.Set.union(...sets) -> set

Returns a new set with all of the values of sets combined.

Example:

local a = {
    foo = true,
    bar = true,
}

local b = {
    bar = true,
    baz = true,
}

Llama.Set.union(a, b)

Results:

{
    foo = true,
    bar = true,
    baz = true,
}

intersection

Llama.Set.intersection(...sets) -> set

Returns a new set with only the values of sets that intersect.

Example:

local a = {
    foo = true,
    bar = true,
}

local b = {
    bar = true,
    baz = true,
}

Llama.Set.intersection(a, b)

Results:

{
    bar = true,
}

Sequence algorithms

filter

Llama.Set.filter(set, filterer) -> set

Returns a new set with only the entries of the set for which the filterer returns a truthy.

filterer is expected to have the following signature:

filterer(value) -> result

Example:

local set = {
    [1] = true,
    [2] = true,
    [3] = true,
    [4] = true,
    [5] = true,
}

local function onlyEvens(value)
    return value % 2 == 0
end

Llama.Set.filter(set, onlyEvens)

Results:

{
    [2] = true,
    [4] = true,
}

map

Llama.Set.map(set, mapper) -> set

Returns a new set with the values (and keys) of dictionary mapped using the mapper.

mapper is expected to have the following signature:

mapper(value) -> value

Example:

local set = {
    foo = true,
    bar = true,
    baz = true,
}

local function fooify(value)
    return "foo" .. value
end

Llama.Set.map(set, fooify)

Results:

{
    foofoo = true,
    foobar = true,
    foobaz = true,
}

Reading values

has

Llama.Set.has(set, value) -> result

Returns whether set has value.


equalObjects

Llama.equalObjects(...objects) -> result

Returns whether the items have reference equality.


isEmpty

Llama.isEmpty(table) -> result

Returns whether the table is empty.