From 9f303ed06e6f04461ce1464beeed3fbd4f20e6ad Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 13 Jan 2017 19:09:58 +0300 Subject: [PATCH] Migrate to new coroutines API, rename Iterator implementation, annotate new API with SinceKotlin. --- .../stdlib/src/kotlin/collections/Iterators.kt | 1 + .../src/kotlin/collections/SequenceBuilder.kt | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/libraries/stdlib/src/kotlin/collections/Iterators.kt b/libraries/stdlib/src/kotlin/collections/Iterators.kt index 607106599dc..38206e06fdf 100644 --- a/libraries/stdlib/src/kotlin/collections/Iterators.kt +++ b/libraries/stdlib/src/kotlin/collections/Iterators.kt @@ -6,6 +6,7 @@ package kotlin.collections /** * Builds an [Iterator] lazily yielding values one by one. */ +@SinceKotlin("1.1") public fun buildIterator(builderAction: suspend SequenceBuilder.() -> Unit): Iterator = buildIteratorImpl(builderAction) /** diff --git a/libraries/stdlib/src/kotlin/collections/SequenceBuilder.kt b/libraries/stdlib/src/kotlin/collections/SequenceBuilder.kt index 63baa7db06a..99408853816 100644 --- a/libraries/stdlib/src/kotlin/collections/SequenceBuilder.kt +++ b/libraries/stdlib/src/kotlin/collections/SequenceBuilder.kt @@ -3,10 +3,12 @@ package kotlin.sequences import kotlin.coroutines.* +import kotlin.coroutines.intrinsics.* /** * Builds a [Sequence] lazily yielding values one by one. */ +@SinceKotlin("1.1") public fun buildSequence(builderAction: suspend SequenceBuilder.() -> Unit): Sequence = Sequence { buildIteratorImpl(builderAction) } @@ -14,6 +16,7 @@ public fun buildSequence(builderAction: suspend SequenceBuilder.() -> Uni * Builder for a [Sequence] or an [Iterator], provides [yield] and [yieldAll] suspension functions. */ @RestrictsSuspension +@SinceKotlin("1.1") public abstract class SequenceBuilder internal constructor() { /** * Yields a value to the [Iterator] being built. @@ -46,7 +49,7 @@ public abstract class SequenceBuilder internal constructor() { internal fun buildIteratorImpl(builderAction: suspend SequenceBuilder.() -> Unit): Iterator { - val iterator = YieldingIterator() + val iterator = SequenceBuilderIterator() iterator.nextStep = builderAction.createCoroutine(receiver = iterator, completion = iterator) return iterator } @@ -62,7 +65,7 @@ private const val State_Done: State = 3 private const val State_Failed: State = 4 -private class YieldingIterator : SequenceBuilder(), Iterator, Continuation { +private class SequenceBuilderIterator : SequenceBuilder(), Iterator, Continuation { private var state = State_NotReady private var nextValue: T? = null private var nextIterator: Iterator? = null @@ -114,9 +117,9 @@ private class YieldingIterator : SequenceBuilder(), Iterator, Continuat suspend override fun yield(value: T) { nextValue = value state = State_Ready - return CoroutineIntrinsics.suspendCoroutineOrReturn { c -> + return suspendCoroutineOrReturn { c -> nextStep = c - CoroutineIntrinsics.SUSPENDED + SUSPENDED_MARKER } } @@ -124,9 +127,9 @@ private class YieldingIterator : SequenceBuilder(), Iterator, Continuat if (!iterator.hasNext()) return nextIterator = iterator state = State_ManyReady - return CoroutineIntrinsics.suspendCoroutineOrReturn { c -> + return suspendCoroutineOrReturn { c -> nextStep = c - CoroutineIntrinsics.SUSPENDED + SUSPENDED_MARKER } } @@ -138,4 +141,7 @@ private class YieldingIterator : SequenceBuilder(), Iterator, Continuat override fun resumeWithException(exception: Throwable) { throw exception // just rethrow } + + override val context: CoroutineContext + get() = EmptyCoroutineContext }