diff --git a/libraries/stdlib/src/generated/_Arrays.kt b/libraries/stdlib/src/generated/_Arrays.kt index d341e4ad810..cdef5951d89 100644 --- a/libraries/stdlib/src/generated/_Arrays.kt +++ b/libraries/stdlib/src/generated/_Arrays.kt @@ -11949,9 +11949,7 @@ public fun CharArray.joinToString(separator: CharSequence = ", ", prefix: CharSe */ public fun Array.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -11959,9 +11957,7 @@ public fun Array.asIterable(): Iterable { */ public fun ByteArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -11969,9 +11965,7 @@ public fun ByteArray.asIterable(): Iterable { */ public fun ShortArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -11979,9 +11973,7 @@ public fun ShortArray.asIterable(): Iterable { */ public fun IntArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -11989,9 +11981,7 @@ public fun IntArray.asIterable(): Iterable { */ public fun LongArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -11999,9 +11989,7 @@ public fun LongArray.asIterable(): Iterable { */ public fun FloatArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -12009,9 +11997,7 @@ public fun FloatArray.asIterable(): Iterable { */ public fun DoubleArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -12019,9 +12005,7 @@ public fun DoubleArray.asIterable(): Iterable { */ public fun BooleanArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -12029,9 +12013,7 @@ public fun BooleanArray.asIterable(): Iterable { */ public fun CharArray.asIterable(): Iterable { if (isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -12039,11 +12021,7 @@ public fun CharArray.asIterable(): Iterable { */ public fun Array.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12051,11 +12029,7 @@ public fun Array.asSequence(): Sequence { */ public fun ByteArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12063,11 +12037,7 @@ public fun ByteArray.asSequence(): Sequence { */ public fun ShortArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12075,11 +12045,7 @@ public fun ShortArray.asSequence(): Sequence { */ public fun IntArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12087,11 +12053,7 @@ public fun IntArray.asSequence(): Sequence { */ public fun LongArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12099,11 +12061,7 @@ public fun LongArray.asSequence(): Sequence { */ public fun FloatArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12111,11 +12069,7 @@ public fun FloatArray.asSequence(): Sequence { */ public fun DoubleArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12123,11 +12077,7 @@ public fun DoubleArray.asSequence(): Sequence { */ public fun BooleanArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** @@ -12135,11 +12085,7 @@ public fun BooleanArray.asSequence(): Sequence { */ public fun CharArray.asSequence(): Sequence { if (isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** diff --git a/libraries/stdlib/src/generated/_Collections.kt b/libraries/stdlib/src/generated/_Collections.kt index e6c9fbb6e81..478017d7d6b 100644 --- a/libraries/stdlib/src/generated/_Collections.kt +++ b/libraries/stdlib/src/generated/_Collections.kt @@ -1884,11 +1884,7 @@ public inline fun Iterable.asIterable(): Iterable { * Creates a [Sequence] instance that wraps the original collection returning its elements when being iterated. */ public fun Iterable.asSequence(): Sequence { - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } /** diff --git a/libraries/stdlib/src/generated/_Maps.kt b/libraries/stdlib/src/generated/_Maps.kt index b1fd7c64c9e..37a2b217197 100644 --- a/libraries/stdlib/src/generated/_Maps.kt +++ b/libraries/stdlib/src/generated/_Maps.kt @@ -183,10 +183,6 @@ public inline fun Map.asIterable(): Iterable> { * Creates a [Sequence] instance that wraps the original map returning its entries when being iterated. */ public fun Map.asSequence(): Sequence> { - return object : Sequence> { - override fun iterator(): Iterator> { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } diff --git a/libraries/stdlib/src/generated/_Sequences.kt b/libraries/stdlib/src/generated/_Sequences.kt index 2a4c58d6e96..348fad72c13 100644 --- a/libraries/stdlib/src/generated/_Sequences.kt +++ b/libraries/stdlib/src/generated/_Sequences.kt @@ -1170,9 +1170,7 @@ public fun Sequence.joinToString(separator: CharSequence = ", ", prefix: * Creates an [Iterable] instance that wraps the original sequence returning its elements when being iterated. */ public fun Sequence.asIterable(): Iterable { - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** diff --git a/libraries/stdlib/src/generated/_Strings.kt b/libraries/stdlib/src/generated/_Strings.kt index b33c44907cf..f8879ae70af 100644 --- a/libraries/stdlib/src/generated/_Strings.kt +++ b/libraries/stdlib/src/generated/_Strings.kt @@ -1131,9 +1131,7 @@ public inline fun CharSequence.zip(other: CharSequence, transform: (Char, Ch */ public fun CharSequence.asIterable(): Iterable { if (this is String && isEmpty()) return emptyList() - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } } /** @@ -1141,10 +1139,6 @@ public fun CharSequence.asIterable(): Iterable { */ public fun CharSequence.asSequence(): Sequence { if (this is String && isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } } diff --git a/libraries/stdlib/src/kotlin/collections/Iterables.kt b/libraries/stdlib/src/kotlin/collections/Iterables.kt index bd0ae08551b..c9abe4a882f 100644 --- a/libraries/stdlib/src/kotlin/collections/Iterables.kt +++ b/libraries/stdlib/src/kotlin/collections/Iterables.kt @@ -19,6 +19,15 @@ package kotlin.collections import java.util.* +/** + * Given an [iterator] function constructs an [Iterable] instance that returns values through the [Iterator] + * provided by that function. + */ +@kotlin.internal.InlineOnly +public inline fun Iterable(crossinline iterator: () -> Iterator): Iterable = object : Iterable { + override fun iterator(): Iterator = iterator() +} + /** * A wrapper over another [Iterable] (or any other object that can produce an [Iterator]) that returns * an indexing iterator. diff --git a/libraries/stdlib/src/kotlin/collections/Sequences.kt b/libraries/stdlib/src/kotlin/collections/Sequences.kt index e0726d2f982..6b9306b5ac9 100644 --- a/libraries/stdlib/src/kotlin/collections/Sequences.kt +++ b/libraries/stdlib/src/kotlin/collections/Sequences.kt @@ -5,17 +5,20 @@ package kotlin.sequences import java.util.* - +/** + * 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. + */ +@kotlin.internal.InlineOnly +public inline fun Sequence(crossinline iterator: () -> Iterator): Sequence = object : Sequence { + override fun iterator(): Iterator = iterator() +} /** * Creates a sequence that returns all elements from this iterator. The sequence is constrained to be iterated only once. */ -public fun Iterator.asSequence(): Sequence { - val iteratorSequence = object : Sequence { - override fun iterator(): Iterator = this@asSequence - } - return iteratorSequence.constrainOnce() -} +public fun Iterator.asSequence(): Sequence = Sequence { this }.constrainOnce() /** * Creates a sequence that returns all values from this enumeration. The sequence is constrained to be iterated only once. diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Sequence.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Sequence.kt index bb7163a9efb..796accc2423 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Sequence.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Sequence.kt @@ -16,9 +16,7 @@ fun sequences(): List { CharSequences -> "if (this is String && isEmpty()) return emptyList()" else -> "" }} - return object : Iterable { - override fun iterator(): Iterator = this@asIterable.iterator() - } + return Iterable { this.iterator() } """ } @@ -30,7 +28,7 @@ fun sequences(): List { } templates add f("asSequence()") { - include(Maps) + include(CharSequences, Maps) doc { f -> "Creates a [Sequence] instance that wraps the original ${f.collection} returning its ${f.element.pluralize()} when being iterated." } returns("Sequence") body { f -> @@ -40,24 +38,7 @@ fun sequences(): List { CharSequences -> "if (this is String && isEmpty()) return emptySequence()" else -> "" }} - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } - """ - } - - // TODO: Drop special case - - body(CharSequences) { - """ - if (this is String && isEmpty()) return emptySequence() - return object : Sequence { - override fun iterator(): Iterator { - return this@asSequence.iterator() - } - } + return Sequence { this.iterator() } """ }