Add samples for sequence building API.

This commit is contained in:
Ilya Gorbunov
2017-03-01 20:56:10 +03:00
parent a04e6de047
commit 61e8848aa2
12 changed files with 251 additions and 4 deletions
+18
View File
@@ -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())
}