From fbb567c11a23e2d6cb0e825863b234c969e3e2d8 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 6 Apr 2015 20:39:20 +0300 Subject: [PATCH] Iterator can be converted to a sequence constrained to be one-time iterable. --- libraries/stdlib/src/kotlin/collections/Sequence.kt | 10 ++++++++++ libraries/stdlib/test/collections/SequenceTest.kt | 10 ++++++++++ 2 files changed, 20 insertions(+) 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()