diff --git a/libraries/stdlib/src/kotlin/collections/Sequence.kt b/libraries/stdlib/src/kotlin/collections/Sequence.kt index 23874680e53..155358f9b8f 100644 --- a/libraries/stdlib/src/kotlin/collections/Sequence.kt +++ b/libraries/stdlib/src/kotlin/collections/Sequence.kt @@ -30,6 +30,16 @@ public fun streamOf(progression: Progression): Stream = object : Strea override fun iterator(): Iterator = progression.iterator() } +/** + * Creates a sequence that returns all values from this iterator. The sequence is constrained to be iterated only once. + */ +public fun Iterator.sequence(): Sequence { + val iteratorSequence = object : Sequence { + override fun iterator(): Iterator = this@sequence + } + return iteratorSequence.constrainOnce() +} + /** * Creates a sequence that returns the specified values. */ diff --git a/libraries/stdlib/test/collections/SequenceTest.kt b/libraries/stdlib/test/collections/SequenceTest.kt index f0c2fa31afe..087c20661c3 100644 --- a/libraries/stdlib/test/collections/SequenceTest.kt +++ b/libraries/stdlib/test/collections/SequenceTest.kt @@ -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()