Add String as a subclass of Sequence in core.wren and implement the iterator protocol for strings in wren_core.c. The string_iterate native advances through UTF-8 code point boundaries, while string_iteratorValue extracts the full code point at a given byte index. Includes comprehensive test coverage for iteration, edge cases (empty strings, mid-sequence positions), and error handling for invalid iterator types and out-of-bounds indices. Also updates documentation for String, List, and Sequence classes with iterator protocol details and usage examples.
1.8 KiB
^title Sequence Class ^category core
An abstract base class for any iterable object. Any class that implements the core iterator protocol can extend this to get a number of helpful methods.
all(predicate)
Tests whether all the elements in the sequence pass the predicate.
Iterates over the sequence, passing each element to the function predicate.
If it returns false, stops iterating and returns false. Otherwise, returns
true.
:::dart
[1, 2, 3].all {|n| n > 2} // False.
[1, 2, 3].all {|n| n < 4} // True.
map(transformation)
Creates a new list by applying transformation to each element in the
sequence.
Iterates over the sequence, passing each element to the function
transformation. Generates a new list from the result of each of those calls.
:::dart
[1, 2, 3].map {|n| n * 2} // [2, 4, 6].
reduce(function)
Reduces the sequence down to a single value. function is a function that takes two arguments, the accumulator and sequence item and returns the new accumulator value. The accumulator is initialized from the first item in the sequence. Then, the function is invoked on each remaining item in the sequence, iteratively updating the accumulator.
It is a runtime error to call this on an empty sequence.
reduce(seed, function)
Similar to above, but uses seed for the initial value of the accumulator. If the sequence is empty, returns seed.
where(predicate)
Produces a new list containing only the elements in the sequence that pass the
predicate.
Iterates over the sequence, passing each element to the function predicate.
If it returns true, adds the element to the result list.
(1..10).where {|n| n % 2 == 1} // [1, 3, 5, 7, 9].