diff --git a/libraries/stdlib/src/kotlin/collections/Sequence.kt b/libraries/stdlib/src/kotlin/collections/Sequence.kt index a2d51fe4197..581564795c2 100644 --- a/libraries/stdlib/src/kotlin/collections/Sequence.kt +++ b/libraries/stdlib/src/kotlin/collections/Sequence.kt @@ -53,7 +53,7 @@ public fun Enumeration.asSequence(): Sequence = this.iterator().sequenc /** * Creates a sequence that returns the specified values. */ -public fun sequenceOf(vararg elements: T): Sequence = elements.asSequence() +public fun sequenceOf(vararg elements: T): Sequence = if (elements.isEmpty()) emptySequence() else elements.asSequence() /** * Creates a sequence that returns all values in the specified [progression]. @@ -62,6 +62,20 @@ public fun sequenceOf(progression: Progression): Sequence = object : S override fun iterator(): Iterator = progression.iterator() } +/** + * Returns an empty sequence. + */ +public fun emptySequence(): Sequence = EmptySequence + +private object EmptySequence : Sequence { + override fun iterator(): Iterator = EmptySequenceIterator +} + +private object EmptySequenceIterator : Iterator { + override fun next(): Nothing = throw NoSuchElementException("Sequence is empty.") + override fun hasNext(): Boolean = false +} + deprecated("Use FilteringSequence instead") public class FilteringStream(stream: Stream, sendWhen: Boolean = true, predicate: (T) -> Boolean) : Stream by FilteringSequence(stream.toSequence(), sendWhen, predicate) diff --git a/libraries/stdlib/test/collections/SequenceTest.kt b/libraries/stdlib/test/collections/SequenceTest.kt index eebcdfd8e4d..1b09f563d0c 100644 --- a/libraries/stdlib/test/collections/SequenceTest.kt +++ b/libraries/stdlib/test/collections/SequenceTest.kt @@ -20,15 +20,16 @@ fun fibonacci(): Sequence { public class SequenceTest { test fun filterEmptySequence() { - val sequence = sequenceOf() - assertEquals(0, sequence.filter { false }.count()) - assertEquals(0, sequence.filter { true }.count()) + for (sequence in listOf(emptySequence(), sequenceOf())) { + assertEquals(0, sequence.filter { false }.count()) + assertEquals(0, sequence.filter { true }.count()) + } } test fun mapEmptySequence() { - val sequence = sequenceOf() - assertEquals(0, sequence.map { false }.count()) - assertEquals(0, sequence.map { true }.count()) + for (sequence in listOf(emptySequence(), sequenceOf())) { + assertEquals(0, sequence.map { true }.count()) + } } test fun requireNoNulls() {