API documentation
This commit is contained in:
parent
a86eba55d7
commit
43b4af23f8
669
api/arrays.md
Normal file
669
api/arrays.md
Normal file
@ -0,0 +1,669 @@
|
|||||||
|
# Arrays
|
||||||
|
|
||||||
|
Tomo supports arrays as a container type that holds a list of elements of any
|
||||||
|
type in a compact format. Arrays are immutable by default, but use
|
||||||
|
copy-on-write semantics to efficiently mutate in place when possible. **Arrays
|
||||||
|
are 1-indexed**, which means the first item in the array has index `1`.
|
||||||
|
|
||||||
|
```tomo
|
||||||
|
nums := [10, 20, 30]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Array Methods
|
||||||
|
|
||||||
|
### `binary_search`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Performs a binary search on a sorted array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
binary_search(arr: [T], by=T.compare) -> Int
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The sorted array to search.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Assuming the input array is sorted according to the given comparison function,
|
||||||
|
return the index where the given item would be inserted to maintain the sorted
|
||||||
|
order.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [1, 3, 5, 7, 9]:binary_search(5)
|
||||||
|
= 3
|
||||||
|
|
||||||
|
>> [1, 3, 5, 7, 9]:binary_search(-999)
|
||||||
|
= 1
|
||||||
|
|
||||||
|
>> [1, 3, 5, 7, 9]:binary_search(999)
|
||||||
|
= 6
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `by`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new array with elements spaced by the specified step value.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
by(arr: [T], step: Int) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The original array.
|
||||||
|
- `step`: The step value for selecting elements.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new array with every `step`-th element from the original array.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [1, 2, 3, 4, 5, 6]:by(2)
|
||||||
|
= [1, 3, 5]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `clear`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Clears all elements from the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
clear(arr: & [T]) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array to be cleared.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> my_array:clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `counts`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Counts the occurrences of each element in the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
counts(arr: [T]) -> {T: Int}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to count elements in.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A table mapping each element to its count.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30, 30, 30]:counts()
|
||||||
|
= {10: 1, 20: 1, 30: 3}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `find`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Finds the index of the first occurrence of an element.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
find(arr: [T]) -> Int
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to search through.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
The index of the first occurrence or `-1` if not found.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30, 40, 50]:find(20)
|
||||||
|
= 2
|
||||||
|
|
||||||
|
>> [10, 20, 30, 40, 50]:find(9999)
|
||||||
|
= -1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `from`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a slice of the array starting from a specified index.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
from(arr: [T], first: Int) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The original array.
|
||||||
|
- `first`: The index to start from.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new array starting from the specified index.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30, 40, 50]:from(3)
|
||||||
|
= [30, 40, 50]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `has`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Checks if the array has any elements.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
has(arr: [T]) -> Bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to check.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
`yes` if the array has elements, `no` otherwise.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30]:has(20)
|
||||||
|
= yes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `heap_pop`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes and returns the top element of a heap. By default, this is the
|
||||||
|
*minimum* value in the heap.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
heap_pop(arr: & [T], by=T.compare) -> T
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the heap.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
The removed top element of the heap.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> my_heap := [30, 10, 20]
|
||||||
|
>> my_heap:heapify()
|
||||||
|
>> my_heap:heap_pop()
|
||||||
|
= 10
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `heap_push`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Adds an element to the heap and maintains the heap property. By default, this
|
||||||
|
is a *minimum* heap.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
heap_push(arr: & [T], item: T, by=T.compare) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the heap.
|
||||||
|
- `item`: The item to be added.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> my_heap:heap_push(10)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `heapify`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Converts an array into a heap.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
heapify(arr: & [T], by=T.compare) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array to be heapified.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> my_heap := [30, 10, 20]
|
||||||
|
>> my_heap:heapify()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `insert`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Inserts an element at a specified position in the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
insert(arr: & [T], item: T, at: Int = 0) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array.
|
||||||
|
- `item`: The item to be inserted.
|
||||||
|
- `at`: The index at which to insert the item (default is `0`). Since indices
|
||||||
|
are 1-indexed and negative indices mean "starting from the back", an index of
|
||||||
|
`0` means "after the last item".
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> arr := [10, 20]
|
||||||
|
>> arr:insert(30)
|
||||||
|
>> arr
|
||||||
|
= [10, 20, 30]
|
||||||
|
|
||||||
|
>> arr:insert(999, at=2)
|
||||||
|
>> arr
|
||||||
|
= [10, 999, 20, 30]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `insert_all`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Inserts an array of items at a specified position in the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
insert_all(arr: & [T], items: [T], at: Int = 0) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array.
|
||||||
|
- `items`: The items to be inserted.
|
||||||
|
- `at`: The index at which to insert the item (default is `0`). Since indices
|
||||||
|
are 1-indexed and negative indices mean "starting from the back", an index of
|
||||||
|
`0` means "after the last item".
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
arr := [10, 20]
|
||||||
|
arr:insert_all([30, 40])
|
||||||
|
>> arr
|
||||||
|
= [10, 20, 30, 40]
|
||||||
|
|
||||||
|
arr:insert_all([99, 100], at=2)
|
||||||
|
>> arr
|
||||||
|
= [10, 99, 100, 20, 30, 40]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `random`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Selects a random element from the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
random(arr: [T]) -> T
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array from which to select a random element.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A random element from the array.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30]:random()
|
||||||
|
= 20
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `remove_at`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes elements from the array starting at a specified index.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
remove_at(arr: & [T], at: Int = -1, count: Int = 1) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array.
|
||||||
|
- `at`: The index at which to start removing elements (default is `-1`, which means the end of the array).
|
||||||
|
- `count`: The number of elements to remove (default is `1`).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
arr := [10, 20, 30, 40, 50]
|
||||||
|
arr:remove_at(2)
|
||||||
|
>> arr
|
||||||
|
= [10, 30, 40, 50]
|
||||||
|
|
||||||
|
arr:remove_at(2, count=2)
|
||||||
|
>> arr
|
||||||
|
= [10, 50]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `remove_item`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes all occurrences of a specified item from the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
remove_item(arr: & [T], item: T, max_count: Int = -1) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array.
|
||||||
|
- `item`: The item to be removed.
|
||||||
|
- `max_count`: The maximum number of occurrences to remove (default is `-1`, meaning all occurrences).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
arr := [10, 20, 10, 20, 30]
|
||||||
|
arr:remove_item(10)
|
||||||
|
>> arr
|
||||||
|
= [20, 20, 30]
|
||||||
|
|
||||||
|
arr:remove_item(20, max_count=1)
|
||||||
|
>> arr
|
||||||
|
= [20, 30]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `reversed`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a reversed slice of the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
reversed(arr: [T]) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to be reversed.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A slice of the array with elements in reverse order.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30]:reversed()
|
||||||
|
= [30, 20, 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `sample`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Selects a sample of elements from the array, optionally with weighted
|
||||||
|
probabilities.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
sample(arr: [T], count: Int, weights: [Num]) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to sample from.
|
||||||
|
- `count`: The number of elements to sample.
|
||||||
|
- `weights`: The probability weights for each element in the array. These
|
||||||
|
values do not need to add up to any particular number, they are relative
|
||||||
|
weights. If no weights are provided, the default is equal probabilities.
|
||||||
|
Negative, infinite, or NaN weights will cause a runtime error. If the number of
|
||||||
|
weights given is less than the length of the array, elements from the rest of
|
||||||
|
the array are considered to have zero weight.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A list of sampled elements from the array.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30]:sample(2, weights=[90%, 5%, 5%])
|
||||||
|
= [10, 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `shuffle`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Shuffles the elements of the array in place.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
shuffle(arr: & [T]) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array to be shuffled.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> arr:shuffle()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `shuffled`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new array with elements shuffled.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
shuffled(arr: [T]) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to be shuffled.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new array with shuffled elements.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30, 40]:shuffled()
|
||||||
|
= [40, 10, 30, 20]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `sort`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Sorts the elements of the array in place in ascending order (small to large).
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
sort(arr: & [T], by=T.compare) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The mutable reference to the array to be sorted.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
arr := [40, 10, -30, 20]
|
||||||
|
arr:sort()
|
||||||
|
>> arr
|
||||||
|
= [-30, 10, 20, 40]
|
||||||
|
|
||||||
|
arr:sort(func(a,b:&Int): a:abs() <> b:abs())
|
||||||
|
>> arr
|
||||||
|
= [10, 20, -30, 40]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `sorted`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new array with elements sorted.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
sorted(arr: [T], by=T.compare) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to be sorted.
|
||||||
|
- `by`: The comparison function used to determine order. If not specified, the
|
||||||
|
default comparison function for the item type will be used.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new array with sorted elements.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [40, 10, -30, 20]:sorted()
|
||||||
|
= [-30, 10, 20, 40]
|
||||||
|
|
||||||
|
>> [40, 10, -30, 20]:sorted(func(a,b:&Int): a:abs() <> b:abs())
|
||||||
|
= [10, 20, -30, 40]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `to`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a slice of the array from the start of the original array up to a specified index (inclusive).
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
to(arr: [T], last: Int) -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The original array.
|
||||||
|
- `last`: The index up to which elements should be included.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new array containing elements from the start up to the specified index.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 30, 40, 50]:to(3)
|
||||||
|
= [10, 20, 30]
|
||||||
|
|
||||||
|
>> [10, 20, 30, 40, 50]:to(-2)
|
||||||
|
= [10, 20, 30, 40]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `unique`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a Set that contains the unique elements of the array.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
unique(arr: [T]) -> {T}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `arr`: The array to process.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A set containing only unique elements from the array.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> [10, 20, 10, 10, 30]:unique()
|
||||||
|
= {10, 20, 30}
|
||||||
|
```
|
138
api/channels.md
Normal file
138
api/channels.md
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
# Channels
|
||||||
|
|
||||||
|
Channels are a thread-safe message queue for communicating between threads,
|
||||||
|
although they can also be used as a general-purpose queue.
|
||||||
|
|
||||||
|
```tomo
|
||||||
|
channel := |Int|
|
||||||
|
channel:push(10)
|
||||||
|
channel:push(20)
|
||||||
|
>> channel:pop()
|
||||||
|
= 10
|
||||||
|
>> channel:pop()
|
||||||
|
= 20
|
||||||
|
```
|
||||||
|
|
||||||
|
## Channel Methods
|
||||||
|
|
||||||
|
### `push`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Adds an item to the channel.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
push(channel:|T|, item: T) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `channel`: The channel to which the item will be added.
|
||||||
|
- `item`: The item to add to the channel.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> channel:push("Hello")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `push_all`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Adds multiple items to the channel.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
push_all(channel:|T|, items: [T]) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `channel`: The channel to which the items will be added.
|
||||||
|
- `items`: The array of items to add to the channel.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> channel:push_all([1, 2, 3])
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `pop`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes and returns an item from the channel. If the channel is empty, it waits until an item is available.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
pop(channel:|T|) -> T
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `channel`: The channel from which to remove an item.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
The item removed from the channel.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> channel:pop()
|
||||||
|
= "Hello"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `clear`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes all items from the channel.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
clear(channel:|T|) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `channel`: The mutable reference to the channel.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> channel:clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `view`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a list of all items currently in the channel without removing them.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
channel:view() -> [T]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `channel`: The channel to view.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
An array of items currently in the channel.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> channel:view()
|
||||||
|
= [1, 2, 3]
|
||||||
|
```
|
65
api/ranges.md
Normal file
65
api/ranges.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# Ranges
|
||||||
|
|
||||||
|
Ranges are Tomo's way to do iteration over numeric ranges. Ranges are typically
|
||||||
|
created using the `Int.to()` method like so: `5:to(10)`. Ranges are
|
||||||
|
*inclusive*.
|
||||||
|
|
||||||
|
```tomo
|
||||||
|
>> [i for i in 3:to(5)]
|
||||||
|
= [3, 4, 5]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Range Methods
|
||||||
|
|
||||||
|
### `reversed`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Returns a reversed copy of the range.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
reversed(range: Range) -> Range
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `range`: The range to be reversed.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new `Range` with the order of elements reversed.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> 1:to(5):reversed()
|
||||||
|
= Range(first=5, last=1, step=-1)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `by`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new range with a specified step value.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
by(range: Range, step: Int) -> Range
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `range`: The original range.
|
||||||
|
- `step`: The step value to be used in the new range.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new `Range` that increments by the specified step value.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> 1:to(5):by(2)
|
||||||
|
= Range(first=1, last=5, step=2)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
297
api/sets.md
Normal file
297
api/sets.md
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
# Sets
|
||||||
|
|
||||||
|
Sets represent an unordered collection of unique elements. These are
|
||||||
|
implemented using hash tables.
|
||||||
|
|
||||||
|
```tomo
|
||||||
|
a := {10, 20, 30}
|
||||||
|
b := {20, 30}
|
||||||
|
>> a:overlap(b)
|
||||||
|
= {20}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here’s the Markdown documentation for set functions:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Set Functions
|
||||||
|
|
||||||
|
### `has`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Checks if the set contains a specified item.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
has(set:{T}, item:T) -> Bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The set to check.
|
||||||
|
- `item`: The item to check for presence.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
`yes` if the item is present, `no` otherwise.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {10, 20}:has(20)
|
||||||
|
= yes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `add`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Adds an item to the set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
add(set:{T}, item: T) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The mutable reference to the set.
|
||||||
|
- `item`: The item to add to the set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> nums:add(42)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `add_all`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Adds multiple items to the set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
add_all(set:&{T}, items: [T]) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The mutable reference to the set.
|
||||||
|
- `items`: The array of items to add to the set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> nums:add_all([1, 2, 3])
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `remove`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes an item from the set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
remove(set:&{T}, item: T) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The mutable reference to the set.
|
||||||
|
- `item`: The item to remove from the set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> nums:remove(42)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `remove_all`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes multiple items from the set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
remove_all(set:&{T}, items: [T]) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The mutable reference to the set.
|
||||||
|
- `items`: The array of items to remove from the set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> nums:remove_all([1, 2, 3])
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `clear`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes all items from the set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
clear(set:&{T}) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The mutable reference to the set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> nums:clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `with`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new set that is the union of the original set and another set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
with(set:{T}, other: {T}) -> {T}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The original set.
|
||||||
|
- `other`: The set to union with.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new set containing all items from both sets.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {1, 2}:with({2, 3})
|
||||||
|
= {1, 2, 3}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `overlap`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new set with items that are in both the original set and another set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
overlap(set:{T}, other: {T}) -> {T}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The original set.
|
||||||
|
- `other`: The set to intersect with.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new set containing only items present in both sets.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {1, 2}:overlap({2, 3})
|
||||||
|
= {2}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `without`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new set with items from the original set but without items from another set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
without(set:{T}, other: {T}) -> {T}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The original set.
|
||||||
|
- `other`: The set of items to remove from the original set.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new set containing items from the original set excluding those in the other set.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {1, 2}:without({2, 3})
|
||||||
|
= {1}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `is_subset_of`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Checks if the set is a subset of another set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
set:is_subset_of(other: {T}, strict: Bool = no) -> Bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The set to check.
|
||||||
|
- `other`: The set to compare against.
|
||||||
|
- `strict`: If `yes`, checks if the set is a strict subset (does not equal the other set).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
`yes` if the set is a subset of the other set (strictly or not), `no` otherwise.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {1, 2}:is_subset_of({1, 2, 3})
|
||||||
|
= yes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `is_superset_of`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Checks if the set is a superset of another set.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
is_superset_of(set:{T}, other: {T}, strict: Bool = no) -> Bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `set`: The set to check.
|
||||||
|
- `other`: The set to compare against.
|
||||||
|
- `strict`: If `yes`, checks if the set is a strict superset (does not equal the other set).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
`yes` if the set is a superset of the other set (strictly or not), `no` otherwise.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> {1, 2, 3}:is_superset_of({1, 2})
|
||||||
|
= yes
|
||||||
|
```
|
215
api/tables.md
Normal file
215
api/tables.md
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
# Tables
|
||||||
|
|
||||||
|
Tables are Tomo's associative mapping structure, also known as a Dictionary or
|
||||||
|
Map. Tables are efficiently implemented as a hash table that preserves
|
||||||
|
insertion order and has fast access to keys and values as array slices. Tables
|
||||||
|
support *all* types as both keys and values.
|
||||||
|
|
||||||
|
Tables do not support square bracket indexing (`t[key]`), but instead rely on
|
||||||
|
the methods `:get(key)` and `:set(key, value)`. This is explicit to avoid
|
||||||
|
hiding the fact that table lookups and table insertion are performing function
|
||||||
|
calls and have edge conditions like a failure to find an entry.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Table Methods
|
||||||
|
|
||||||
|
### `bump`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Increments the value associated with a key by a specified amount. If the key is
|
||||||
|
not already in the table, its value will be assumed to be zero.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
bump(t:{K:V}, key: K, amount: Int = 1) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The mutable reference to the table.
|
||||||
|
- `key`: The key whose value is to be incremented.
|
||||||
|
- `amount`: The amount to increment the value by (default: 1).
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> t := {"A":1}
|
||||||
|
t:bump("A")
|
||||||
|
t:bump("B", 10)
|
||||||
|
>> t
|
||||||
|
= {"A": 2, "B": 10}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `clear`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes all key-value pairs from the table.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
t:clear() -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The mutable reference to the table.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> t:clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `get`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Retrieves the value associated with a key, or returns a default value if the key is not present.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
t:get(key: K, default: V) -> V
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The table.
|
||||||
|
- `key`: The key whose associated value is to be retrieved.
|
||||||
|
- `default`: The value to return if the key is not present. If this argument is
|
||||||
|
not provided, a runtime error will be created if the key is not present.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
The value associated with the key or the default value if the key is not found.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> t := {"A":1, "B":2}
|
||||||
|
>> t:get("A")
|
||||||
|
= 1
|
||||||
|
|
||||||
|
>> t:get("xxx", 0)
|
||||||
|
= 0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `get_or_null`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Retrieves the value associated with a key, or returns `null` if the key is not present.
|
||||||
|
This method is only available on tables whose values are pointers.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
t:get_or_null(key: K) -> @V?
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The table.
|
||||||
|
- `key`: The key whose associated value is to be retrieved.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A mutable reference to the value associated with the key or `null` if the key is not found.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> t := {"A": @[10]}
|
||||||
|
>> t:get_or_null("A")
|
||||||
|
= @[10]?
|
||||||
|
>> t:get_or_null("xxx")
|
||||||
|
= !@[Int]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `has`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Checks if the table contains a specified key.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
has(t:{K:V}, key: K) -> Bool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The table.
|
||||||
|
- `key`: The key to check for presence.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
`yes` if the key is present, `no` otherwise.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
>> {"A":1, "B":2}:has("A")
|
||||||
|
= yes
|
||||||
|
>> {"A":1, "B":2}:has("xxx")
|
||||||
|
= no
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `remove`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Removes the key-value pair associated with a specified key.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
remove(t:{K:V}, key: K) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The mutable reference to the table.
|
||||||
|
- `key`: The key of the key-value pair to remove.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
t := {"A":1, "B":2}
|
||||||
|
t:remove("A")
|
||||||
|
>> t
|
||||||
|
= {"B": 2}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `set`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Sets or updates the value associated with a specified key.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```markdown
|
||||||
|
set(t:{K:V}, key: K, value: V) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `t`: The mutable reference to the table.
|
||||||
|
- `key`: The key to set or update.
|
||||||
|
- `value`: The value to associate with the key.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
t := {"A": 1, "B": 2}
|
||||||
|
t:set("C", 3)
|
||||||
|
>> t
|
||||||
|
= {"A": 1, "B": 2, "C": 3}
|
||||||
|
```
|
76
api/text.md
76
api/text.md
@ -282,7 +282,7 @@ finding the value because the two texts are equivalent under normalization.
|
|||||||
Converts a `Text` value to a C-style string.
|
Converts a `Text` value to a C-style string.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
as_c_string(text: Text) -> CString
|
as_c_string(text: Text) -> CString
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -294,7 +294,7 @@ as_c_string(text: Text) -> CString
|
|||||||
A C-style string (`CString`) representing the text.
|
A C-style string (`CString`) representing the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
>> "Hello":as_c_string()
|
>> "Hello":as_c_string()
|
||||||
= CString("Hello")
|
= CString("Hello")
|
||||||
```
|
```
|
||||||
@ -307,7 +307,7 @@ A C-style string (`CString`) representing the text.
|
|||||||
Converts a `Text` value to an array of bytes.
|
Converts a `Text` value to an array of bytes.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
bytes(text: Text) -> [Int8]
|
bytes(text: Text) -> [Int8]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -319,7 +319,7 @@ bytes(text: Text) -> [Int8]
|
|||||||
An array of bytes (`[Int8]`) representing the text.
|
An array of bytes (`[Int8]`) representing the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
>> "Amélie":bytes()
|
>> "Amélie":bytes()
|
||||||
= [65_i8, 109_i8, 101_i8, -52_i8, -127_i8, 108_i8, 105_i8, 101_i8]
|
= [65_i8, 109_i8, 101_i8, -52_i8, -127_i8, 108_i8, 105_i8, 101_i8]
|
||||||
```
|
```
|
||||||
@ -332,7 +332,7 @@ An array of bytes (`[Int8]`) representing the text.
|
|||||||
Returns a list of character names from the text.
|
Returns a list of character names from the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
character_names(text: Text) -> [Text]
|
character_names(text: Text) -> [Text]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -344,7 +344,7 @@ character_names(text: Text) -> [Text]
|
|||||||
A list of character names (`[Text]`).
|
A list of character names (`[Text]`).
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
>> "Amélie":character_names()
|
>> "Amélie":character_names()
|
||||||
= ["LATIN CAPITAL LETTER A", "LATIN SMALL LETTER M", "LATIN SMALL LETTER E", "COMBINING ACUTE ACCENT", "LATIN SMALL LETTER L", "LATIN SMALL LETTER I", "LATIN SMALL LETTER E"]
|
= ["LATIN CAPITAL LETTER A", "LATIN SMALL LETTER M", "LATIN SMALL LETTER E", "COMBINING ACUTE ACCENT", "LATIN SMALL LETTER L", "LATIN SMALL LETTER I", "LATIN SMALL LETTER E"]
|
||||||
```
|
```
|
||||||
@ -360,7 +360,7 @@ in a text editor and you hit the left or right arrow key, it will move the
|
|||||||
cursor by one graphical cluster.
|
cursor by one graphical cluster.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
clusters(text: Text) -> [Text]
|
clusters(text: Text) -> [Text]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ clusters(text: Text) -> [Text]
|
|||||||
A list of graphical clusters (`[Text]`) within the text.
|
A list of graphical clusters (`[Text]`) within the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
>> "Amélie":clusters()
|
>> "Amélie":clusters()
|
||||||
= ["A", "m", "é", "l", "i", "e"] : [Text]
|
= ["A", "m", "é", "l", "i", "e"] : [Text]
|
||||||
```
|
```
|
||||||
@ -385,7 +385,7 @@ A list of graphical clusters (`[Text]`) within the text.
|
|||||||
Returns a list of Unicode code points for the text.
|
Returns a list of Unicode code points for the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
codepoints(text: Text) -> [Int32]
|
codepoints(text: Text) -> [Int32]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -397,7 +397,7 @@ codepoints(text: Text) -> [Int32]
|
|||||||
A list of Unicode code points (`[Int32]`).
|
A list of Unicode code points (`[Int32]`).
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
>> "Amélie":codepoints()
|
>> "Amélie":codepoints()
|
||||||
= [65_i32, 109_i32, 101_i32, 769_i32, 108_i32, 105_i32, 101_i32] : [Int32]
|
= [65_i32, 109_i32, 101_i32, 769_i32, 108_i32, 105_i32, 101_i32] : [Int32]
|
||||||
```
|
```
|
||||||
@ -410,7 +410,7 @@ A list of Unicode code points (`[Int32]`).
|
|||||||
Converts a C-style string to a `Text` value.
|
Converts a C-style string to a `Text` value.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
from_c_string(str: CString) -> Text
|
from_c_string(str: CString) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -422,7 +422,7 @@ from_c_string(str: CString) -> Text
|
|||||||
A `Text` value representing the C-style string.
|
A `Text` value representing the C-style string.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
from_c_string(CString("Hello")) // "Hello"
|
from_c_string(CString("Hello")) // "Hello"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -434,7 +434,7 @@ from_c_string(CString("Hello")) // "Hello"
|
|||||||
Checks if the `Text` contains a target substring.
|
Checks if the `Text` contains a target substring.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
has(text: Text, target: Text, where: Where = Where.Anywhere) -> Bool
|
has(text: Text, target: Text, where: Where = Where.Anywhere) -> Bool
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -448,7 +448,7 @@ has(text: Text, target: Text, where: Where = Where.Anywhere) -> Bool
|
|||||||
`yes` if the target substring is found, `no` otherwise.
|
`yes` if the target substring is found, `no` otherwise.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
has("Hello, world!", "world") // yes
|
has("Hello, world!", "world") // yes
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -460,7 +460,7 @@ has("Hello, world!", "world") // yes
|
|||||||
Joins a list of text pieces with a specified glue.
|
Joins a list of text pieces with a specified glue.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
join(glue: Text, pieces: [Text]) -> Text
|
join(glue: Text, pieces: [Text]) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -473,7 +473,7 @@ join(glue: Text, pieces: [Text]) -> Text
|
|||||||
A single `Text` value with the pieces joined by the glue.
|
A single `Text` value with the pieces joined by the glue.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
join(", ", ["apple", "banana", "cherry"]) // "apple, banana, cherry"
|
join(", ", ["apple", "banana", "cherry"]) // "apple, banana, cherry"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -485,7 +485,7 @@ join(", ", ["apple", "banana", "cherry"]) // "apple, banana, cherry"
|
|||||||
Converts all characters in the text to lowercase.
|
Converts all characters in the text to lowercase.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
lower(text: Text) -> Text
|
lower(text: Text) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ lower(text: Text) -> Text
|
|||||||
The lowercase version of the text.
|
The lowercase version of the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
lower("HELLO") // "hello"
|
lower("HELLO") // "hello"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -509,7 +509,7 @@ lower("HELLO") // "hello"
|
|||||||
Returns the number of bytes used by the text.
|
Returns the number of bytes used by the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
num_bytes(text: Text) -> Int
|
num_bytes(text: Text) -> Int
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -521,7 +521,7 @@ num_bytes(text: Text) -> Int
|
|||||||
The number of bytes used by the text.
|
The number of bytes used by the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
num_bytes("Hello") // 5
|
num_bytes("Hello") // 5
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -533,7 +533,7 @@ num_bytes("Hello") // 5
|
|||||||
Returns the number of clusters in the text.
|
Returns the number of clusters in the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
num_clusters(text: Text) -> Int
|
num_clusters(text: Text) -> Int
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -545,7 +545,7 @@ num_clusters(text: Text) -> Int
|
|||||||
The number of clusters in the text.
|
The number of clusters in the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
num_clusters("Hello") // 5
|
num_clusters("Hello") // 5
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -557,7 +557,7 @@ num_clusters("Hello") // 5
|
|||||||
Returns the number of Unicode code points in the text.
|
Returns the number of Unicode code points in the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
num_codepoints(text: Text) -> Int
|
num_codepoints(text: Text) -> Int
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -569,7 +569,7 @@ num_codepoints(text: Text) -> Int
|
|||||||
The number of Unicode code points in the text.
|
The number of Unicode code points in the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
num_codepoints("Hello") // 5
|
num_codepoints("Hello") // 5
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -581,7 +581,7 @@ num_codepoints("Hello") // 5
|
|||||||
Formats the text as a quoted string.
|
Formats the text as a quoted string.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
quoted(text: Text, color: Bool = no) -> Text
|
quoted(text: Text, color: Bool = no) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -594,7 +594,7 @@ quoted(text: Text, color: Bool = no) -> Text
|
|||||||
The text formatted as a quoted string.
|
The text formatted as a quoted string.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
quoted("Hello") // "\"Hello\""
|
quoted("Hello") // "\"Hello\""
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -606,7 +606,7 @@ quoted("Hello") // "\"Hello\""
|
|||||||
Replaces occurrences of a pattern in the text with a replacement string.
|
Replaces occurrences of a pattern in the text with a replacement string.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
replace(text: Text, pattern: Text, replacement: Text, limit: Int = -1) -> Text
|
replace(text: Text, pattern: Text, replacement: Text, limit: Int = -1) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -621,7 +621,7 @@ replace(text: Text, pattern: Text, replacement: Text, limit: Int = -1) -> Text
|
|||||||
The text with occurrences of the pattern replaced.
|
The text with occurrences of the pattern replaced.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
replace("Hello world", "world", "there") // "Hello there"
|
replace("Hello world", "world", "there") // "Hello there"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -633,7 +633,7 @@ replace("Hello world", "world", "there") // "Hello there"
|
|||||||
Splits the text into a list of substrings based on a delimiter.
|
Splits the text into a list of substrings based on a delimiter.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
split(text: Text, split: Text) -> [Text]
|
split(text: Text, split: Text) -> [Text]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -646,7 +646,7 @@ split(text: Text, split: Text) -> [Text]
|
|||||||
A list of substrings resulting from the split.
|
A list of substrings resulting from the split.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
split("apple,banana,cherry", ",") // ["apple", "banana", "cherry"]
|
split("apple,banana,cherry", ",") // ["apple", "banana", "cherry"]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -658,7 +658,7 @@ split("apple,banana,cherry", ",") // ["apple", "banana", "cherry"]
|
|||||||
Converts the text to title case (capitalizing the first letter of each word).
|
Converts the text to title case (capitalizing the first letter of each word).
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
title(text: Text) -> Text
|
title(text: Text) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -670,7 +670,7 @@ title(text: Text) -> Text
|
|||||||
The text in title case.
|
The text in title case.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
title("hello world") // "Hello World"
|
title("hello world") // "Hello World"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -682,7 +682,7 @@ title("hello world") // "Hello World"
|
|||||||
Trims characters from the beginning and end of the text.
|
Trims characters from the beginning and end of the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
trimmed(text: Text, trim: Text = " {\n\r\t}", where: Where = Where.Anywhere) -> Text
|
trimmed(text: Text, trim: Text = " {\n\r\t}", where: Where = Where.Anywhere) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -696,7 +696,7 @@ trimmed(text: Text, trim: Text = " {\n\r\t}", where: Where = Where.Anywhere) ->
|
|||||||
The trimmed text.
|
The trimmed text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
trimmed(" Hello ") // "Hello"
|
trimmed(" Hello ") // "Hello"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -708,7 +708,7 @@ trimmed(" Hello ") // "Hello"
|
|||||||
Converts all characters in the text to uppercase.
|
Converts all characters in the text to uppercase.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
upper(text: Text) -> Text
|
upper(text: Text) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -720,7 +720,7 @@ upper(text: Text) -> Text
|
|||||||
The uppercase version of the text.
|
The uppercase version of the text.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
upper("hello") // "HELLO"
|
upper("hello") // "HELLO"
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -732,7 +732,7 @@ upper("hello") // "HELLO"
|
|||||||
Removes all occurrences of a target substring from the text.
|
Removes all occurrences of a target substring from the text.
|
||||||
|
|
||||||
**Usage:**
|
**Usage:**
|
||||||
```markdown
|
```tomo
|
||||||
without(text: Text, target: Text, where: Where = Where.Anywhere) -> Text
|
without(text: Text, target: Text, where: Where = Where.Anywhere) -> Text
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -746,7 +746,7 @@ without(text: Text, target: Text, where: Where = Where.Anywhere) -> Text
|
|||||||
The text with occurrences of the target removed.
|
The text with occurrences of the target removed.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
```markdown
|
```tomo
|
||||||
without("Hello world", "world") // "Hello "
|
without("Hello world", "world") // "Hello "
|
||||||
```
|
```
|
||||||
|
|
||||||
|
111
api/threads.md
Normal file
111
api/threads.md
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# Threads
|
||||||
|
|
||||||
|
Tomo supports POSIX threads (pthreads) through the `Thread` type. The
|
||||||
|
recommended practice is to have each thread interact with other threads only
|
||||||
|
through thread-safe Channels with no other shared data.
|
||||||
|
|
||||||
|
## Thread Methods
|
||||||
|
|
||||||
|
### `new`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Creates a new thread to execute a specified function.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
Thread.new(fn: func() -> Void) -> Thread
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `fn`: The function to be executed by the new thread.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
A new `Thread` object representing the created thread.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> jobs := |Int|
|
||||||
|
>> results := |Int|
|
||||||
|
>> thread := Thread.new(func():
|
||||||
|
while yes:
|
||||||
|
input := jobs:pop()
|
||||||
|
results:push(input + 10
|
||||||
|
)
|
||||||
|
= Thread<0x12345678>
|
||||||
|
>> jobs:push(10)
|
||||||
|
>> results:pop()
|
||||||
|
= 11
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `cancel`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Requests the cancellation of a specified thread.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
cancel(thread: Thread) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `thread`: The thread to cancel.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> thread:cancel()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `join`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Waits for a specified thread to terminate.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
join(thread: Thread) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `thread`: The thread to join.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> thread:join()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `detach`
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Detaches a specified thread, allowing it to run independently.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```tomo
|
||||||
|
detach(thread: Thread) -> Void
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
|
||||||
|
- `thread`: The thread to detach.
|
||||||
|
|
||||||
|
**Returns:**
|
||||||
|
Nothing.
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```tomo
|
||||||
|
>> thread:detach()
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user