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()
|
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.
|
* 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() {
|
test fun makeSequenceOneTimeConstrained() {
|
||||||
val sequence = sequenceOf(1, 2, 3, 4)
|
val sequence = sequenceOf(1, 2, 3, 4)
|
||||||
sequence.toList()
|
sequence.toList()
|
||||||
|
|||||||
Reference in New Issue
Block a user