diff --git a/libraries/stdlib/samples/test/samples/collections/sequences.kt b/libraries/stdlib/samples/test/samples/collections/sequences.kt index 1a866fac43e..395be08575f 100644 --- a/libraries/stdlib/samples/test/samples/collections/sequences.kt +++ b/libraries/stdlib/samples/test/samples/collections/sequences.kt @@ -7,6 +7,7 @@ import kotlin.coroutines.experimental.buildSequence @RunWith(Enclosed::class) class Sequences { + class Building { @Sample @@ -158,6 +159,17 @@ class Sequences { } + class Usage { + + @Sample + fun sequenceOrEmpty() { + val nullSequence: Sequence? = null + assertPrints(nullSequence.orEmpty().toList(), "[]") + + val sequence: Sequence? = sequenceOf(1, 2, 3) + assertPrints(sequence.orEmpty().toList(), "[1, 2, 3]") + } + } class Transformations { diff --git a/libraries/stdlib/src/kotlin/collections/Sequences.kt b/libraries/stdlib/src/kotlin/collections/Sequences.kt index 0fe4bc68b29..5f617fa99d1 100644 --- a/libraries/stdlib/src/kotlin/collections/Sequences.kt +++ b/libraries/stdlib/src/kotlin/collections/Sequences.kt @@ -47,6 +47,14 @@ private object EmptySequence : Sequence, DropTakeSequence { override fun take(n: Int) = EmptySequence } +/** + * Returns this sequence if it's not `null` and the empty sequence otherwise. + * @sample samples.collections.Sequences.Usage.sequenceOrEmpty + */ +@SinceKotlin("1.3") +@kotlin.internal.InlineOnly +public inline fun Sequence?.orEmpty(): Sequence = this ?: emptySequence() + /** * Returns a sequence of all elements from all sequences in this sequence. * diff --git a/libraries/stdlib/test/collections/SequenceTest.kt b/libraries/stdlib/test/collections/SequenceTest.kt index 257675d60f4..01338c987c8 100644 --- a/libraries/stdlib/test/collections/SequenceTest.kt +++ b/libraries/stdlib/test/collections/SequenceTest.kt @@ -543,6 +543,14 @@ public class SequenceTest { assertEquals(listOf("act", "wast", "test"), sequenceOf("act", "test", "wast").sortedWith(comparator).toList()) } + @Test fun orEmpty() { + val s1: Sequence? = null + assertEquals(emptySequence(), s1.orEmpty()) + + val s2: Sequence? = sequenceOf(1) + assertEquals(s2, s2.orEmpty()) + } + /* test fun pairIterator() { val pairStr = (fibonacci() zip fibonacci().map { i -> i*2 }).joinToString(limit = 10)