|Iterable, test: |Any| -> Bool| -> Bool
Checks the Iterable's values against a test function.
The test function should return true
if the value passes the test, otherwise
it should return false
.
all
will return true
if all values pass the test, otherwise it will return
false
.
all
stops running as soon as it finds a value that fails the test.
print! (1..9).all |x| x > 0
check! true
print! ('', '', 'foo').all string.is_empty
check! false
print! [10, 20, 30]
.each |x| x / 10
.all |x| x < 10
check! true
|Iterable, test: |Any| -> Bool| -> Bool
Checks the Iterable's values against a test function.
The test function should return true
if the value passes the test, otherwise
it should return false
.
any
will return true
if any of the values pass the test,
otherwise it will return false
.
any
stops running as soon as it finds a passing test.
print! (1..9).any |x| x == 5
check! true
print! ('', '', 'foo').any string.is_empty
check! true
print! [10, 20, 30]
.each |x| x / 10
.any |x| x == 2
check! true
|first: Iterable, second: Iterable| -> Iterator
chain
returns an iterator that iterates over the output of the first iterator,
followed by the output of the second iterator.
print! [1, 2]
.chain 'abc'
.to_tuple()
check! (1, 2, 'a', 'b', 'c')
|Iterable, size: Number| -> Iterator
Returns an iterator that splits up the input data into chunks of size N
,
where each chunk is provided as a Tuple.
The final chunk may have fewer than N
elements.
print! 1..=10
.chunks 3
.to_list()
check! [(1, 2, 3), (4, 5, 6), (7, 8, 9), (10)]
|Iterable| -> Null
Consumes the output of the iterator.
|Iterable, |Any| -> Any| -> Null
Consumes the output of the iterator, calling the provided function with each iterator output value.
result = []
1..=10
.keep |n| n % 2 == 0
.each |n| result.push n
.consume()
print! result
check! [2, 4, 6, 8, 10]
# Alternatively, calling consume with a function is equivalent to having an
# `each` / `consume` chain
result = []
1..=10
.keep |n| n % 2 == 1
.consume |n| result.push n
print! result
check! [1, 3, 5, 7, 9]
|Iterable| -> Number
Counts the number of items yielded from the iterator.
print! (5..15).count()
check! 10
print! 0..100
.keep |x| x % 2 == 0
.count()
check! 50
|Iterable| -> Iterator
Takes an Iterable and returns a new iterator that endlessly repeats the iterable's output.
The iterable's output gets cached, which may result in a large amount of memory being used if the cycle has a long length.
print! (1, 2, 3)
.cycle()
.take 10
.to_list()
check! [1, 2, 3, 1, 2, 3, 1, 2, 3, 1]
|Iterable, function: |Any| -> Any| -> Iterator
Creates a new iterator that yields the result of calling the provided function
with each value from the input iterator.
print! (2, 3, 4)
.each |x| x * 2
.to_list()
check! [4, 6, 8]
|Iterable| -> Iterator
Creates an iterator that yields each value along with an associated index.
print! ('a', 'b', 'c').enumerate().to_list()
check! [(0, 'a'), (1, 'b'), (2, 'c')]
|Iterable, test: |Any| -> Bool| -> Any
Returns the first value in the iterable that passes the test function.
The function is called for each value in the iterator, and should return either
true
if the value is a match, or false
if it's not.
The first matching value will cause iteration to stop.
If no match is found then null
is returned.
print! (10..20).find |x| x > 14 and x < 16
check! 15
print! (10..20).find |x| x > 100
check! null
|Iterable| -> Iterator
Returns the output of the input iterator, with any nested iterable values flattened out.
Note that only one level of flattening is performed, so any double-nested containers will still be present in the output.
print! [(2, 4), [6, 8, (10, 12)]]
.flatten()
.to_list()
check! [2, 4, 6, 8, (10, 12)]
|
input: Iterable,
initial_value: Any,
accumulator: |accumulated: Any, next: Any| -> Any
| -> Any
Returns the result of 'folding' the iterator's values into an accumulator function.
The function takes the accumulated value and the next iterator value, and then returns the result of folding the value into the accumulator.
The first argument is an initial accumulated value that gets passed to the function along with the first value from the iterator.
The result is then the final accumulated value.
This operation is also known in other languages as reduce
, accumulate
,
inject
, fold left
, along with other names.
print! ('a', 'b', 'c')
.fold [], |result, x|
result.push x
result.push '-'
check! ['a', '-', 'b', '-', 'c', '-']
|generator: || -> Any| -> Iterator
Creates an iterator that yields the result of repeatedly calling the generator
function.
Warning: This version of generate
will iterate endlessly, so consider using
an adaptor like iterator.take
to produce an iterator that has an end.
|n: Number, generator: || -> Any| -> Any
Creates an iterator that yields the result of calling the generator
function n
times.
from iterator import generate
state = {x: 0}
f = || state.x += 1
print! generate(f)
.take(5)
.to_list()
check! [1, 2, 3, 4, 5]
print! generate(3, f).to_tuple()
check! (6, 7, 8)
|Iterable, value: Any| -> Iterator
Returns an iterator that yields a copy of the provided value between each adjacent pair of output values.
|Iterable, generator: || -> Any| -> Iterator
Returns an iterator that yields the result of calling the provided function between each adjacent pair of output values.
print! ('a', 'b', 'c').intersperse('-').to_string()
check! a-b-c
separators = (1, 2, 3).iter()
print! ('a', 'b', 'c')
.intersperse || separators.next().get()
.to_tuple(),
check! ('a', 1, 'b', 2, 'c')
|Iterable| -> Iterator
Returns an iterator that yields the provided iterable's values.
Iterable values will be automatically accepted by most iterator operations,
so it's usually not necessary to call .iter()
, however it can be usefult
sometimes to make a standalone iterator for manual iteration.
Note that calling .iter
with an Iterator
will return the iterator without
modification. If a copy of the iterator is needed then see koto.copy
and
koto.deep_copy
.
i = (1..10).iter()
i.skip 5
print! i.next().get()
check! 6
|Iterable, test: |Any| -> Bool| -> Iterator
Returns an iterator that keeps only the values that pass a test function.
The function is called for each value in the iterator, and should return either
true
if the value should be kept in the iterator output, or false
if it
should be discarded.
print! 0..10
.keep |x| x % 2 == 0
.to_tuple()
check! (0, 2, 4, 6, 8)
|Iterable| -> Any
Consumes the iterator, returning the last yielded value.
print! (1..100).take(5).last()
check! 5
print! (0..0).last()
check! null
|Iterable| -> Any
Returns the maximum value found in the iterable.
|Iterable, key: |Any| -> Any| -> Any
Returns the maximum value found in the iterable, based on first calling a 'key' function with the value, and then using the resulting keys for the comparisons.
A <
'less than' comparison is performed between each value and the maximum
found so far, until all values in the iterator have been compared.
print! (8, -3, 99, -1).max()
check! 99
|Iterable| -> Any
Returns the minimum value found in the iterable.
|Iterable, key: |Any| -> Any| -> Any
Returns the minimum value found in the iterable, based on first calling a 'key' function with the value, and then using the resulting keys for the comparisons.
A <
'less than' comparison is performed between each value and the minimum
found so far, until all values in the iterator have been compared.
print! (8, -3, 99, -1).min()
check! -3
|Iterable| -> (Any, Any)
Returns the minimum and maximum values found in the iterable.
|Iterable, key: |Any| -> Any| -> Any
Returns the minimum and maximum values found in the iterable, based on first calling a 'key' function with the value, and then using the resulting keys for the comparisons.
A <
'less than' comparison is performed between each value and both the
minimum and maximum found so far, until all values in the iterator have been
compared.
print! (8, -3, 99, -1).min_max()
check! (-3, 99)
|Iterable| -> IteratorOutput
Returns the next value from the iterator wrapped in an
IteratorOutput
,
or null
if the iterator has been exhausted.
x = (1, null, 'x').iter()
print! x.next()
check! IteratorOutput(1)
print! x.next()
check! IteratorOutput(null)
print! x.next()
check! IteratorOutput(x)
print! x.next()
check! null
# Call .get() to access the value from an IteratorOutput
print! 'abc'.next().get()
check! a
|Iterable| -> IteratorOutput
Returns the next value from the end of the iterator wrapped in an
IteratorOutput
,
or null
if the iterator has been exhausted.
This only works with iterators that have a defined end, so attempting to call
next_back
on endless iterators like iterator.generate
will
result in an error.
x = (1..=5).iter()
print! x.next_back()
check! IteratorOutput(5)
print! x.next_back()
check! IteratorOutput(4)
# calls to next and next_back can be mixed together
print! x.next()
check! IteratorOutput(1)
print! x.next_back()
check! IteratorOutput(3)
print! x.next_back()
check! IteratorOutput(2)
# 1 has already been produced by the iterator, so it's now exhausted
print! x.next_back()
check! null
|Any| -> Iterator
Returns an iterator that yields the given value a single time.
print! iterator.once(99)
.chain('abc')
.to_tuple()
check! (99, 'a', 'b', 'c')
|Iterable| -> Peekable
Wraps the given iterable value in a peekable iterator.
Returns the next value from the iterator without advancing it. The peeked value is cached until the iterator is advanced.
x = 'abc'.peekable()
print! x.peek()
check! IteratorOutput(a)
print! x.peek()
check! IteratorOutput(a)
print! x.next()
check! IteratorOutput(a)
print! x.peek()
check! IteratorOutput(b)
print! x.next(), x.next()
check! (IteratorOutput(b), IteratorOutput(c))
print! x.peek()
check! null
Returns the next value from the end of the iterator without advancing it. The peeked value is cached until the iterator is advanced.
x = 'abc'.peekable()
print! x.peek_back()
check! IteratorOutput(c)
print! x.next_back()
check! IteratorOutput(c)
print! x.peek()
check! IteratorOutput(a)
print! x.peek_back()
check! IteratorOutput(b)
print! x.next_back(), x.next_back()
check! (IteratorOutput(b), IteratorOutput(a))
print! x.peek_back()
check! null
|Iterable, test: |Any| -> Bool| -> Any
Returns the position of the first value in the iterable that passes the test function.
The function is called for each value in the iterator, and should return either
true
if the value is a match, or false
if it's not.
The first matching value will cause iteration to stop, and the number of steps taken to reach the matched value is returned as the result.
If no match is found then null
is returned.
print! (10..20).position |x| x == 15
check! 5
print! (10..20).position |x| x == 99
check! null
|Iterable| -> Any
Returns the result of multiplying each value in the iterable together, using 1
as the initial value.
# Find the product of a sequence of numbers
print! (2, 3, 4).product()
check! 24
my_type = |n|
n: n
@*: |other| my_type self.n * other.n
@display: || 'my_type({self.n})'
# Find the sum of a sequence of my_type values
print! (my_type(2), my_type(3)).product my_type(10)
check! my_type(60)
|value: Any| -> Iterator
Creates an iterator that endlessly yields the provided value
.
Warning: This version of repeat
will iterate endlessly, so consider using
an adaptor like iterator.take
to produce an iterator with an end.
|value: Any, n: Number| -> Iterator
Creates an iterator that yields n
repeats of the provided value
.
from iterator import repeat
print! repeat(42).take(5).to_list()
check! [42, 42, 42, 42, 42]
print! repeat('x', 3).to_tuple()
check! ('x', 'x', 'x')
|Iterator| -> Iterator
Reverses the order of the iterator's output.
This only works with iterators that have a defined end, so attempting to reverse
endless iterators like iterator.generate
will result in an error.
print! 'Héllö'.reversed().to_tuple()
check! ('ö', 'l', 'l', 'é', 'H')
print! (1..=10).reversed().skip(5).to_tuple()
check! (5, 4, 3, 2, 1)
|Iterable, steps: Number| -> Iterator
Skips over a number of steps in the iterator.
print! (100..200).skip(50).next().get()
check! 150
|Iterable, step_size: Number| -> Iterator
Steps over the iterable's output by the provided step size.
print! (0..10).step(3).to_tuple()
check! (0, 3, 6, 9)
print! 'Héllö'.step(2).to_string()
check! Hlö
|Iterable| -> Any
Returns the result of adding each value in the iterable together, using 0
as
the initial value.
|Iterable, initial_value: Any| -> Any
Returns the result of adding each value in the iterable together, using the provided initial value as the start of the operation.
# Find the sum of a sequence of numbers
print! (2, 3, 4).sum()
check! 9
my_type = |n|
n: n
@+: |other| my_type self.n + other.n
@display: || 'my_type({self.n})'
# Find the sum of a sequence of my_type values
print! (my_type(1), my_type(2)).sum my_type(100)
check! my_type(103)
|Iterable, count: Number| -> Iterator
Creates an iterator that yields a number of values from the input before finishing.
|Iterable, test: |Any| -> Bool| -> Iterator
Creates an iterator that yields values from the input while they pass a test function.
The test function should return true
if the iterator should continue to yield
values, and false
if the iterator should stop yielding values.
print! (100..200).take(3).to_tuple()
check! (100, 101, 102)
print! 'hey!'.take(|c| c != '!').to_string()
check! hey
|Iterable| -> List
Consumes all values coming from the iterator and places them in a list.
print! ('a', 42, (-1, -2)).to_list()
check! ['a', 42, (-1, -2)]
|Iterable| -> Map
Consumes all values coming from the iterator and places them in a map.
If a value is a tuple, then the first element in the tuple will be inserted as the key for the map entry, and the second element will be inserted as the value.
If the value is anything other than a tuple, then it will be inserted as the map
key, with null
as the entry's value.
print! ('a', 'b', 'c').to_map()
check! {a: null, b: null, c: null}
print! ('a', 'bbb', 'cc')
.each |x| x, size x
.to_map()
check! {a: 1, bbb: 3, cc: 2}
|Iterable| -> String
Consumes all values coming from the iterator and produces a string containing the formatted values.
print! ('x', 'y', 'z').to_string()
check! xyz
print! (1, 2, 3).intersperse('-').to_string()
check! 1-2-3
|Iterable| -> Tuple
Consumes all values coming from the iterator and places them in a tuple.
print! ('a', 42, (-1, -2)).to_tuple()
check! ('a', 42, (-1, -2))
|Iterable, size: Number| -> Iterator
Returns an iterator that splits up the input data into overlapping windows of
the specified size
, where each window is provided as a Tuple.
If the input has fewer elements than the window size, then no windows will be produced.
print! 1..=5
.windows 3
.to_list(),
check! [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
|first: Iterable, second: Iterable| -> Iterator
Combines the values in two iterables into an iterator that yields corresponding pairs of values, one at a time from each input iterable.
print! (1, 2, 3)
.zip ('a', 'b', 'c')
.to_list()
check! [(1, 'a'), (2, 'b'), (3, 'c')]
A wrapper for a single item of iterator output.
This exists to allow functions like iterator.next
to return null
to
indicate that the iterator has been exhausted,
while also allowing null
to appear in the iterator's output.
|IteratorOutput| -> Any
Returns the wrapped iterator output value.
print! x = 'abc'.next()
check! IteratorOutput(a)
print! x.get()
check! a