Iterator<T> can be converted to a sequence constrained to be one-time iterable.
This commit is contained in:
@@ -30,6 +30,16 @@ public fun <T> streamOf(progression: Progression<T>): Stream<T> = object : Strea
|
||||
override fun iterator(): Iterator<T> = progression.iterator()
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns all values from this iterator. The sequence is constrained to be iterated only once.
|
||||
*/
|
||||
public fun <T> Iterator<T>.sequence(): Sequence<T> {
|
||||
val iteratorSequence = object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> = this@sequence
|
||||
}
|
||||
return iteratorSequence.constrainOnce()
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns the specified values.
|
||||
*/
|
||||
|
||||
@@ -186,6 +186,16 @@ public class SequenceTest {
|
||||
}
|
||||
|
||||
|
||||
test fun sequenceFromIterator() {
|
||||
val list = listOf(3, 2, 1, 0)
|
||||
val iterator = list.iterator()
|
||||
val sequence = iterator.sequence()
|
||||
assertEquals(list, sequence.toList())
|
||||
fails {
|
||||
sequence.toList()
|
||||
}
|
||||
}
|
||||
|
||||
test fun makeSequenceOneTimeConstrained() {
|
||||
val sequence = sequenceOf(1, 2, 3, 4)
|
||||
sequence.toList()
|
||||
|
||||
Reference in New Issue
Block a user