SAM-constructors for Iterable and Sequence interfaces.
This commit is contained in:
@@ -11949,9 +11949,7 @@ public fun CharArray.joinToString(separator: CharSequence = ", ", prefix: CharSe
|
||||
*/
|
||||
public fun <T> Array<out T>.asIterable(): Iterable<T> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<T> {
|
||||
override fun iterator(): Iterator<T> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11959,9 +11957,7 @@ public fun <T> Array<out T>.asIterable(): Iterable<T> {
|
||||
*/
|
||||
public fun ByteArray.asIterable(): Iterable<Byte> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Byte> {
|
||||
override fun iterator(): Iterator<Byte> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11969,9 +11965,7 @@ public fun ByteArray.asIterable(): Iterable<Byte> {
|
||||
*/
|
||||
public fun ShortArray.asIterable(): Iterable<Short> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Short> {
|
||||
override fun iterator(): Iterator<Short> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11979,9 +11973,7 @@ public fun ShortArray.asIterable(): Iterable<Short> {
|
||||
*/
|
||||
public fun IntArray.asIterable(): Iterable<Int> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Int> {
|
||||
override fun iterator(): Iterator<Int> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11989,9 +11981,7 @@ public fun IntArray.asIterable(): Iterable<Int> {
|
||||
*/
|
||||
public fun LongArray.asIterable(): Iterable<Long> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Long> {
|
||||
override fun iterator(): Iterator<Long> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -11999,9 +11989,7 @@ public fun LongArray.asIterable(): Iterable<Long> {
|
||||
*/
|
||||
public fun FloatArray.asIterable(): Iterable<Float> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Float> {
|
||||
override fun iterator(): Iterator<Float> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12009,9 +11997,7 @@ public fun FloatArray.asIterable(): Iterable<Float> {
|
||||
*/
|
||||
public fun DoubleArray.asIterable(): Iterable<Double> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Double> {
|
||||
override fun iterator(): Iterator<Double> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12019,9 +12005,7 @@ public fun DoubleArray.asIterable(): Iterable<Double> {
|
||||
*/
|
||||
public fun BooleanArray.asIterable(): Iterable<Boolean> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Boolean> {
|
||||
override fun iterator(): Iterator<Boolean> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12029,9 +12013,7 @@ public fun BooleanArray.asIterable(): Iterable<Boolean> {
|
||||
*/
|
||||
public fun CharArray.asIterable(): Iterable<Char> {
|
||||
if (isEmpty()) return emptyList()
|
||||
return object : Iterable<Char> {
|
||||
override fun iterator(): Iterator<Char> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12039,11 +12021,7 @@ public fun CharArray.asIterable(): Iterable<Char> {
|
||||
*/
|
||||
public fun <T> Array<out T>.asSequence(): Sequence<T> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12051,11 +12029,7 @@ public fun <T> Array<out T>.asSequence(): Sequence<T> {
|
||||
*/
|
||||
public fun ByteArray.asSequence(): Sequence<Byte> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Byte> {
|
||||
override fun iterator(): Iterator<Byte> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12063,11 +12037,7 @@ public fun ByteArray.asSequence(): Sequence<Byte> {
|
||||
*/
|
||||
public fun ShortArray.asSequence(): Sequence<Short> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Short> {
|
||||
override fun iterator(): Iterator<Short> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12075,11 +12045,7 @@ public fun ShortArray.asSequence(): Sequence<Short> {
|
||||
*/
|
||||
public fun IntArray.asSequence(): Sequence<Int> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Int> {
|
||||
override fun iterator(): Iterator<Int> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12087,11 +12053,7 @@ public fun IntArray.asSequence(): Sequence<Int> {
|
||||
*/
|
||||
public fun LongArray.asSequence(): Sequence<Long> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Long> {
|
||||
override fun iterator(): Iterator<Long> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12099,11 +12061,7 @@ public fun LongArray.asSequence(): Sequence<Long> {
|
||||
*/
|
||||
public fun FloatArray.asSequence(): Sequence<Float> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Float> {
|
||||
override fun iterator(): Iterator<Float> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12111,11 +12069,7 @@ public fun FloatArray.asSequence(): Sequence<Float> {
|
||||
*/
|
||||
public fun DoubleArray.asSequence(): Sequence<Double> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Double> {
|
||||
override fun iterator(): Iterator<Double> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12123,11 +12077,7 @@ public fun DoubleArray.asSequence(): Sequence<Double> {
|
||||
*/
|
||||
public fun BooleanArray.asSequence(): Sequence<Boolean> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Boolean> {
|
||||
override fun iterator(): Iterator<Boolean> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -12135,11 +12085,7 @@ public fun BooleanArray.asSequence(): Sequence<Boolean> {
|
||||
*/
|
||||
public fun CharArray.asSequence(): Sequence<Char> {
|
||||
if (isEmpty()) return emptySequence()
|
||||
return object : Sequence<Char> {
|
||||
override fun iterator(): Iterator<Char> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1884,11 +1884,7 @@ public inline fun <T> Iterable<T>.asIterable(): Iterable<T> {
|
||||
* Creates a [Sequence] instance that wraps the original collection returning its elements when being iterated.
|
||||
*/
|
||||
public fun <T> Iterable<T>.asSequence(): Sequence<T> {
|
||||
return object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -183,10 +183,6 @@ public inline fun <K, V> Map<K, V>.asIterable(): Iterable<Map.Entry<K, V>> {
|
||||
* Creates a [Sequence] instance that wraps the original map returning its entries when being iterated.
|
||||
*/
|
||||
public fun <K, V> Map<K, V>.asSequence(): Sequence<Map.Entry<K, V>> {
|
||||
return object : Sequence<Map.Entry<K, V>> {
|
||||
override fun iterator(): Iterator<Map.Entry<K, V>> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
|
||||
@@ -1170,9 +1170,7 @@ public fun <T> Sequence<T>.joinToString(separator: CharSequence = ", ", prefix:
|
||||
* Creates an [Iterable] instance that wraps the original sequence returning its elements when being iterated.
|
||||
*/
|
||||
public fun <T> Sequence<T>.asIterable(): Iterable<T> {
|
||||
return object : Iterable<T> {
|
||||
override fun iterator(): Iterator<T> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1131,9 +1131,7 @@ public inline fun <V> CharSequence.zip(other: CharSequence, transform: (Char, Ch
|
||||
*/
|
||||
public fun CharSequence.asIterable(): Iterable<Char> {
|
||||
if (this is String && isEmpty()) return emptyList()
|
||||
return object : Iterable<Char> {
|
||||
override fun iterator(): Iterator<Char> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1141,10 +1139,6 @@ public fun CharSequence.asIterable(): Iterable<Char> {
|
||||
*/
|
||||
public fun CharSequence.asSequence(): Sequence<Char> {
|
||||
if (this is String && isEmpty()) return emptySequence()
|
||||
return object : Sequence<Char> {
|
||||
override fun iterator(): Iterator<Char> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
}
|
||||
|
||||
|
||||
@@ -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 <T> Iterable(crossinline iterator: () -> Iterator<T>): Iterable<T> = object : Iterable<T> {
|
||||
override fun iterator(): Iterator<T> = iterator()
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper over another [Iterable] (or any other object that can produce an [Iterator]) that returns
|
||||
* an indexing iterator.
|
||||
|
||||
@@ -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 <T> Sequence(crossinline iterator: () -> Iterator<T>): Sequence<T> = object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> = iterator()
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns all elements from this iterator. The sequence is constrained to be iterated only once.
|
||||
*/
|
||||
public fun <T> Iterator<T>.asSequence(): Sequence<T> {
|
||||
val iteratorSequence = object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> = this@asSequence
|
||||
}
|
||||
return iteratorSequence.constrainOnce()
|
||||
}
|
||||
public fun <T> Iterator<T>.asSequence(): Sequence<T> = Sequence { this }.constrainOnce()
|
||||
|
||||
/**
|
||||
* Creates a sequence that returns all values from this enumeration. The sequence is constrained to be iterated only once.
|
||||
|
||||
@@ -16,9 +16,7 @@ fun sequences(): List<GenericFunction> {
|
||||
CharSequences -> "if (this is String && isEmpty()) return emptyList()"
|
||||
else -> ""
|
||||
}}
|
||||
return object : Iterable<T> {
|
||||
override fun iterator(): Iterator<T> = this@asIterable.iterator()
|
||||
}
|
||||
return Iterable { this.iterator() }
|
||||
"""
|
||||
}
|
||||
|
||||
@@ -30,7 +28,7 @@ fun sequences(): List<GenericFunction> {
|
||||
}
|
||||
|
||||
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<T>")
|
||||
body { f ->
|
||||
@@ -40,24 +38,7 @@ fun sequences(): List<GenericFunction> {
|
||||
CharSequences -> "if (this is String && isEmpty()) return emptySequence()"
|
||||
else -> ""
|
||||
}}
|
||||
return object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
"""
|
||||
}
|
||||
|
||||
// TODO: Drop special case
|
||||
|
||||
body(CharSequences) {
|
||||
"""
|
||||
if (this is String && isEmpty()) return emptySequence()
|
||||
return object : Sequence<T> {
|
||||
override fun iterator(): Iterator<T> {
|
||||
return this@asSequence.iterator()
|
||||
}
|
||||
}
|
||||
return Sequence { this.iterator() }
|
||||
"""
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user