Iterator<T> can be converted to a sequence constrained to be one-time iterable.

This commit is contained in:
Ilya Gorbunov
2015-04-06 20:39:20 +03:00
parent f2d865e836
commit fbb567c11a
2 changed files with 20 additions and 0 deletions
@@ -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()