Function std.algorithm.iteration.splitWhen
Splits a forward range into subranges in places determined by a binary predicate.
auto splitWhen(alias pred, Range)(
Range r
)
if (isForwardRange!Range);
When iterating, one element of r is compared with pred to the next
element. If pred return true, a new subrange is started for the next element.
Otherwise, they are part of the same subrange.
If the elements are compared with an inequality (!=) operator, consider
chunkBy instead, as it's likely faster to execute.
Parameters
| Name | Description |
|---|---|
| pred | Predicate for determining where to split. The earlier element in the source range is always given as the first argument. |
| r | A forward range to be split. |
Returns
a range of subranges of r, split such that within a given subrange,
calling pred with any pair of adjacent elements as arguments returns false.
Copying the range currently has reference semantics, but this may change in the future.
See also
splitter, which uses elements as splitters instead of element-to-element
relations.
Example
import std .algorithm .comparison : equal;
import std .range : dropExactly;
auto source = [4, 3, 2, 11, 0, -3, -3, 5, 3, 0];
auto result1 = source .splitWhen!((a,b) => a <= b);
assert(result1 .save .equal!equal([
[4, 3, 2],
[11, 0, -3],
[-3],
[5, 3, 0]
]));
//splitWhen, like chunkBy, is currently a reference range (this may change
//in future). Remember to call `save` when appropriate.
auto result2 = result1 .dropExactly(2);
assert(result1 .save .equal!equal([
[-3],
[5, 3, 0]
]));