Add samples for sequence building API.
This commit is contained in:
@@ -12599,6 +12599,8 @@ public fun CharArray.asIterable(): Iterable<Char> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun <T> Array<out T>.asSequence(): Sequence<T> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12607,6 +12609,8 @@ public fun <T> Array<out T>.asSequence(): Sequence<T> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun ByteArray.asSequence(): Sequence<Byte> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12615,6 +12619,8 @@ public fun ByteArray.asSequence(): Sequence<Byte> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun ShortArray.asSequence(): Sequence<Short> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12623,6 +12629,8 @@ public fun ShortArray.asSequence(): Sequence<Short> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun IntArray.asSequence(): Sequence<Int> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12631,6 +12639,8 @@ public fun IntArray.asSequence(): Sequence<Int> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun LongArray.asSequence(): Sequence<Long> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12639,6 +12649,8 @@ public fun LongArray.asSequence(): Sequence<Long> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun FloatArray.asSequence(): Sequence<Float> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12647,6 +12659,8 @@ public fun FloatArray.asSequence(): Sequence<Float> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun DoubleArray.asSequence(): Sequence<Double> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12655,6 +12669,8 @@ public fun DoubleArray.asSequence(): Sequence<Double> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun BooleanArray.asSequence(): Sequence<Boolean> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
@@ -12663,6 +12679,8 @@ public fun BooleanArray.asSequence(): Sequence<Boolean> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original array returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromArray
|
||||
*/
|
||||
public fun CharArray.asSequence(): Sequence<Char> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
|
||||
@@ -2041,6 +2041,8 @@ public inline fun <T> Iterable<T>.asIterable(): Iterable<T> {
|
||||
|
||||
/**
|
||||
* Creates a [Sequence] instance that wraps the original collection returning its elements when being iterated.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromCollection
|
||||
*/
|
||||
public fun <T> Iterable<T>.asSequence(): Sequence<T> {
|
||||
return Sequence { this.iterator() }
|
||||
|
||||
@@ -7,6 +7,8 @@ package kotlin.sequences
|
||||
* Given an [iterator] function constructs a [Sequence] that returns values through the [Iterator]
|
||||
* provided by that function.
|
||||
* The values are evaluated lazily, and the sequence is potentially infinite.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromIterator
|
||||
*/
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun <T> Sequence(crossinline iterator: () -> Iterator<T>): Sequence<T> = object : Sequence<T> {
|
||||
@@ -15,6 +17,8 @@ public inline fun <T> Sequence(crossinline iterator: () -> Iterator<T>): Sequenc
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns all elements from this iterator. The sequence is constrained to be iterated only once.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceFromIterator
|
||||
*/
|
||||
public fun <T> Iterator<T>.asSequence(): Sequence<T> = Sequence { this }.constrainOnce()
|
||||
|
||||
@@ -27,6 +31,8 @@ public inline fun<T> java.util.Enumeration<T>.asSequence(): Sequence<T> = this.i
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns the specified values.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.sequenceOfValues
|
||||
*/
|
||||
public fun <T> sequenceOf(vararg elements: T): Sequence<T> = if (elements.isEmpty()) emptySequence() else elements.asSequence()
|
||||
|
||||
@@ -552,6 +558,9 @@ private class ConstrainedOnceSequence<T>(sequence: Sequence<T>) : Sequence<T> {
|
||||
* The returned sequence is constrained to be iterated only once.
|
||||
*
|
||||
* @see constrainOnce
|
||||
* @see kotlin.coroutines.experimental.buildSequence
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.generateSequence
|
||||
*/
|
||||
public fun <T : Any> generateSequence(nextFunction: () -> T?): Sequence<T> {
|
||||
return GeneratorSequence(nextFunction, { nextFunction() }).constrainOnce()
|
||||
@@ -565,6 +574,10 @@ public fun <T : Any> generateSequence(nextFunction: () -> T?): Sequence<T> {
|
||||
* If [seed] is `null`, an empty sequence is produced.
|
||||
*
|
||||
* The sequence can be iterated multiple times, each time starting with [seed].
|
||||
*
|
||||
* @see kotlin.coroutines.experimental.buildSequence
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.generateSequenceWithSeed
|
||||
*/
|
||||
@kotlin.internal.LowPriorityInOverloadResolution
|
||||
public fun <T : Any> generateSequence(seed: T?, nextFunction: (T) -> T?): Sequence<T> =
|
||||
@@ -581,6 +594,10 @@ public fun <T : Any> generateSequence(seed: T?, nextFunction: (T) -> T?): Sequen
|
||||
* If [seedFunction] returns `null`, an empty sequence is produced.
|
||||
*
|
||||
* The sequence can be iterated multiple times.
|
||||
*
|
||||
* @see kotlin.coroutines.experimental.buildSequence
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.generateSequenceWithLazySeed
|
||||
*/
|
||||
public fun <T: Any> generateSequence(seedFunction: () -> T?, nextFunction: (T) -> T?): Sequence<T> =
|
||||
GeneratorSequence(seedFunction, nextFunction)
|
||||
|
||||
@@ -21,13 +21,20 @@ package kotlin.coroutines.experimental
|
||||
import kotlin.coroutines.experimental.intrinsics.*
|
||||
|
||||
/**
|
||||
* Builds a [Sequence] lazily yielding values one by one.
|
||||
* Builds a [Sequence] lazily yielding values one by one.
|
||||
*
|
||||
* @see kotlin.sequences.generateSequence
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
* @sample samples.collections.Sequences.Building.buildFibonacciSequence
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public fun <T> buildSequence(builderAction: suspend SequenceBuilder<T>.() -> Unit): Sequence<T> = Sequence { buildIterator(builderAction) }
|
||||
|
||||
/**
|
||||
* Builds an [Iterator] lazily yielding values one by one.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildIterator
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public fun <T> buildIterator(builderAction: suspend SequenceBuilder<T>.() -> Unit): Iterator<T> {
|
||||
@@ -38,12 +45,21 @@ public fun <T> buildIterator(builderAction: suspend SequenceBuilder<T>.() -> Uni
|
||||
|
||||
/**
|
||||
* Builder for a [Sequence] or an [Iterator], provides [yield] and [yieldAll] suspension functions.
|
||||
*
|
||||
* @see buildSequence
|
||||
* @see buildIterator
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
* @sample samples.collections.Sequences.Building.buildFibonacciSequence
|
||||
*/
|
||||
@RestrictsSuspension
|
||||
@SinceKotlin("1.1")
|
||||
public abstract class SequenceBuilder<in T> internal constructor() {
|
||||
/**
|
||||
* Yields a value to the [Iterator] being built.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
* @sample samples.collections.Sequences.Building.buildFibonacciSequence
|
||||
*/
|
||||
public abstract suspend fun yield(value: T)
|
||||
|
||||
@@ -51,11 +67,15 @@ public abstract class SequenceBuilder<in T> internal constructor() {
|
||||
* Yields all values from the `iterator` to the [Iterator] being built.
|
||||
*
|
||||
* The sequence of values returned by the given iterator can be potentially infinite.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
*/
|
||||
public abstract suspend fun yieldAll(iterator: Iterator<T>)
|
||||
|
||||
/**
|
||||
* Yields a collections of values to the [Iterator] being built.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
*/
|
||||
public suspend fun yieldAll(elements: Iterable<T>) {
|
||||
if (elements is Collection && elements.isEmpty()) return
|
||||
@@ -66,6 +86,8 @@ public abstract class SequenceBuilder<in T> internal constructor() {
|
||||
* Yields potentially infinite sequence of values to the [Iterator] being built.
|
||||
*
|
||||
* The sequence can be potentially infinite.
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
*/
|
||||
public suspend fun yieldAll(sequence: Sequence<T>) = yieldAll(sequence.iterator())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user