Rename sequence and iterator builder functions and their scope class
This introduces new functions instead of the existing sequence builders: - `sequence` instead of `buildSequence` - `iterator` instead of `buildIterator` - `SequenceScope` instead of `SequenceBuilder` The old functions were deprecated with error and made inline-only, and `SequenceBuilder` has been made a deprecated typealias to `SequenceScope`. Move sequence builders to `SequencesKt` facade class. Replace sequence builder usages in stdlib and samples. #KT-26678
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
@file:kotlin.jvm.JvmMultifileClass
|
||||
@file:kotlin.jvm.JvmName("SequenceBuilderKt")
|
||||
@file:kotlin.jvm.JvmName("SequencesKt")
|
||||
|
||||
package kotlin.sequences
|
||||
|
||||
@@ -21,7 +21,12 @@ import kotlin.coroutines.intrinsics.*
|
||||
* @sample samples.collections.Sequences.Building.buildFibonacciSequence
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public fun <T> buildSequence(builderAction: suspend SequenceBuilder<T>.() -> Unit): Sequence<T> = Sequence { buildIterator(builderAction) }
|
||||
public fun <T> sequence(block: suspend SequenceScope<T>.() -> Unit): Sequence<T> = Sequence { iterator(block) }
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
@Deprecated("Use 'sequence { }' function instead.", ReplaceWith("sequence(builderAction)"), level = DeprecationLevel.ERROR)
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun <T> buildSequence(noinline builderAction: suspend SequenceScope<T>.() -> Unit): Sequence<T> = Sequence { iterator(builderAction) }
|
||||
|
||||
/**
|
||||
* Builds an [Iterator] lazily yielding values one by one.
|
||||
@@ -30,24 +35,29 @@ public fun <T> buildSequence(builderAction: suspend SequenceBuilder<T>.() -> Uni
|
||||
* @sample samples.collections.Iterables.Building.iterable
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public fun <T> buildIterator(builderAction: suspend SequenceBuilder<T>.() -> Unit): Iterator<T> {
|
||||
public fun <T> iterator(block: suspend SequenceScope<T>.() -> Unit): Iterator<T> {
|
||||
val iterator = SequenceBuilderIterator<T>()
|
||||
iterator.nextStep = builderAction.createCoroutineUnintercepted(receiver = iterator, completion = iterator)
|
||||
iterator.nextStep = block.createCoroutineUnintercepted(receiver = iterator, completion = iterator)
|
||||
return iterator
|
||||
}
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
@Deprecated("Use 'iterator { }' function instead.", ReplaceWith("iterator(builderAction)"), level = DeprecationLevel.ERROR)
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun <T> buildIterator(noinline builderAction: suspend SequenceScope<T>.() -> Unit): Iterator<T> = iterator(builderAction)
|
||||
|
||||
/**
|
||||
* Builder for a [Sequence] or an [Iterator], provides [yield] and [yieldAll] suspension functions.
|
||||
* The scope for yielding values of a [Sequence] or an [Iterator], provides [yield] and [yieldAll] suspension functions.
|
||||
*
|
||||
* @see buildSequence
|
||||
* @see buildIterator
|
||||
* @see sequence
|
||||
* @see iterator
|
||||
*
|
||||
* @sample samples.collections.Sequences.Building.buildSequenceYieldAll
|
||||
* @sample samples.collections.Sequences.Building.buildFibonacciSequence
|
||||
*/
|
||||
@RestrictsSuspension
|
||||
@SinceKotlin("1.3")
|
||||
public abstract class SequenceBuilder<in T> internal constructor() {
|
||||
public abstract class SequenceScope<in T> internal constructor() {
|
||||
/**
|
||||
* Yields a value to the [Iterator] being built.
|
||||
*
|
||||
@@ -85,6 +95,9 @@ public abstract class SequenceBuilder<in T> internal constructor() {
|
||||
public suspend fun yieldAll(sequence: Sequence<T>) = yieldAll(sequence.iterator())
|
||||
}
|
||||
|
||||
@Deprecated("Use SequenceScope class instead.", ReplaceWith("SequenceScope<T>"), level = DeprecationLevel.ERROR)
|
||||
public typealias SequenceBuilder<T> = SequenceScope<T>
|
||||
|
||||
private typealias State = Int
|
||||
|
||||
private const val State_NotReady: State = 0
|
||||
@@ -94,7 +107,7 @@ private const val State_Ready: State = 3
|
||||
private const val State_Done: State = 4
|
||||
private const val State_Failed: State = 5
|
||||
|
||||
private class SequenceBuilderIterator<T> : SequenceBuilder<T>(), Iterator<T>, Continuation<Unit> {
|
||||
private class SequenceBuilderIterator<T> : SequenceScope<T>(), Iterator<T>, Continuation<Unit> {
|
||||
private var state = State_NotReady
|
||||
private var nextValue: T? = null
|
||||
private var nextIterator: Iterator<T>? = null
|
||||
|
||||
Reference in New Issue
Block a user