Lazily-evaluating versions of
split(maxSplits:omittingEmptySubsequences:whereSeparator:)
and split(separator:maxSplits:omittingEmptySubsequences:)
,
performing the same operation as their counterparts defined on
Sequence
and Collection
, are added to LazySequence
and
LazyCollection
. The LazyCollection
methods allow splitting a
collection without allocating additional storage on the heap.
// Splitting a lazy sequence.
let numbers = stride(from: 1, through: 16, by: 1)
for subsequence in numbers.lazy.split(
whereSeparator: { $0 % 3 == 0 || $0 % 5 == 0 }
) {
print(subsequence)
}
/* Prints:
[1, 2]
[4]
[7, 8]
[11]
[13, 14]
[16]
*/
// Splitting a lazy collection.
let line = "BLANCHE: I don't want realism. I want magic!"
for subsequence in line.lazy.split(separator: " ") {
print(subsequence)
}
/* Prints
BLANCHE:
I
don't
want
realism.
I
want
magic!
*/
LazySequence
and LazyCollection
are each extended with
split(maxSplits:omittingEmptySubsequences:whereSeparator:)
and
split(separator:maxSplits:omittingEmptySubsequences:)
.
The LazySequence
versions of those methods return an instance of
SplitSequence
. The LazyCollection
versions return an instance of
SplitCollection
.
SplitSequence
wraps the sequence to be split, and provides an iterator whose
next
method returns a newly-allocated array containing the elements of each
subsequence in the split sequence in turn.
SplitCollection
wraps the collection to be split. Its Index
wraps a range of
base collection indices. startIndex
is computed at initialization.
Subscripting a SplitCollection
instance returns the slice of the original
collection which is the subsequence of the split collection at the given index's
position.
Iterating a SplitSequence
instance is O(n) in time and space, since each
subsequence returned is a newly-allocated array.
Iterating a SplitCollection
instance is O(n) in time and O(1) in space,
since each subsequence returned is a slice of the base collection. Since
startIndex
is computed at initialization, some or all of the time cost may be
paid at initialization. For example, if the base collection contains no elements
determined to be separators, it will be iterated entirely on initialization of
the split collection, and all subsequent operations on the split collection,
such as index(after:)
, will have complexity O(1).