186 lines
6.6 KiB
Kotlin
Vendored
186 lines
6.6 KiB
Kotlin
Vendored
@file:kotlin.jvm.JvmMultifileClass
|
|
@file:kotlin.jvm.JvmName("CollectionsKt")
|
|
|
|
package kotlin.collections
|
|
|
|
internal object EmptyIterator : ListIterator<Nothing> {
|
|
override fun hasNext(): Boolean = false
|
|
override fun hasPrevious(): Boolean = false
|
|
override fun nextIndex(): Int = 0
|
|
override fun previousIndex(): Int = -1
|
|
override fun next(): Nothing = throw NoSuchElementException()
|
|
override fun previous(): Nothing = throw NoSuchElementException()
|
|
}
|
|
|
|
internal object EmptyList : List<Nothing>, Serializable, RandomAccess {
|
|
private const val serialVersionUID: Long = -7390468764508069838L
|
|
|
|
override fun equals(other: Any?): Boolean = other is List<*> && other.isEmpty()
|
|
override fun hashCode(): Int = 1
|
|
override fun toString(): String = "[]"
|
|
|
|
override val size: Int get() = 0
|
|
override fun isEmpty(): Boolean = true
|
|
override fun contains(element: Nothing): Boolean = false
|
|
override fun containsAll(elements: Collection<Nothing>): Boolean = elements.isEmpty()
|
|
|
|
override fun get(index: Int): Nothing = throw IndexOutOfBoundsException("Empty list doesn't contain element at index $index.")
|
|
override fun indexOf(element: Nothing): Int = -1
|
|
override fun lastIndexOf(element: Nothing): Int = -1
|
|
|
|
override fun iterator(): Iterator<Nothing> = EmptyIterator
|
|
override fun listIterator(): ListIterator<Nothing> = EmptyIterator
|
|
override fun listIterator(index: Int): ListIterator<Nothing> {
|
|
if (index != 0) throw IndexOutOfBoundsException("Index: $index")
|
|
return EmptyIterator
|
|
}
|
|
|
|
override fun subList(fromIndex: Int, toIndex: Int): List<Nothing> {
|
|
if (fromIndex == 0 && toIndex == 0) return this
|
|
throw IndexOutOfBoundsException("fromIndex: $fromIndex, toIndex: $toIndex")
|
|
}
|
|
|
|
private fun readResolve(): Any = EmptyList
|
|
}
|
|
|
|
public fun <T> emptyList(): List<T> = EmptyList
|
|
|
|
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
|
|
|
|
public inline fun <T> listOf(): List<T> = emptyList()
|
|
|
|
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
|
|
|
|
public inline fun <T> arrayListOf(): ArrayList<T> = ArrayList()
|
|
|
|
public fun <T> mutableListOf(vararg elements: T): MutableList<T> = kotlin.UnsupportedOperationException("This is intrinsic")
|
|
|
|
public fun <T> arrayListOf(vararg elements: T): ArrayList<T> = kotlin.UnsupportedOperationException("This is intrinsic")
|
|
|
|
public fun <T : Any> listOfNotNull(element: T?): List<T> = if (element != null) listOf(element) else emptyList()
|
|
|
|
public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T> = MutableList(size, init)
|
|
|
|
public inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T> {
|
|
val list = ArrayList<T>(size)
|
|
repeat(size) { index -> list.add(init(index)) }
|
|
return list
|
|
}
|
|
|
|
public val Collection<*>.indices: IntRange
|
|
get() = 0..size - 1
|
|
|
|
public val <T> List<T>.lastIndex: Int
|
|
get() = this.size - 1
|
|
|
|
public inline fun <T> Collection<T>.isNotEmpty(): Boolean = !isEmpty()
|
|
|
|
public inline fun <T> List<T>.elementAtOrElse(index: Int, defaultValue: (Int) -> T): T {
|
|
return if (index >= 0 && index <= lastIndex) get(index) else defaultValue(index)
|
|
}
|
|
|
|
public fun <T> List<T>.first(): T {
|
|
if (isEmpty())
|
|
throw NoSuchElementException("List is empty.")
|
|
return this[0]
|
|
}
|
|
|
|
public fun <T> Iterable<T>.single(): T {
|
|
when (this) {
|
|
is List -> return this.single()
|
|
else -> {
|
|
val iterator = iterator()
|
|
if (!iterator.hasNext())
|
|
throw NoSuchElementException("Collection is empty.")
|
|
val single = iterator.next()
|
|
if (iterator.hasNext())
|
|
throw IllegalArgumentException("Collection has more than one element.")
|
|
return single
|
|
}
|
|
}
|
|
}
|
|
|
|
public fun <T> List<T>.single(): T {
|
|
return when (size) {
|
|
0 -> throw NoSuchElementException("List is empty.")
|
|
1 -> this[0]
|
|
else -> throw IllegalArgumentException("List has more than one element.")
|
|
}
|
|
}
|
|
|
|
public fun <T> Iterable<T>.toList(): List<T> {
|
|
if (this is Collection) {
|
|
return when (size) {
|
|
0 -> emptyList()
|
|
1 -> listOf(if (this is List) get(0) else iterator().next())
|
|
else -> this.toMutableList()
|
|
}
|
|
}
|
|
return this.toMutableList().optimizeReadOnlyList()
|
|
}
|
|
|
|
public fun <T> Iterable<T>.toMutableList(): MutableList<T> {
|
|
if (this is Collection<T>)
|
|
return this.toMutableList()
|
|
return toCollection(ArrayList<T>())
|
|
}
|
|
|
|
public fun <T> Collection<T>.toMutableList(): MutableList<T> {
|
|
return ArrayList(this)
|
|
}
|
|
|
|
public fun <T, C : MutableCollection<in T>> Iterable<T>.toCollection(destination: C): C {
|
|
for (item in this) {
|
|
destination.add(item)
|
|
}
|
|
return destination
|
|
}
|
|
|
|
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
|
|
return mapTo(ArrayList<R>(if (this is Collection<*>) this.size else 10), transform)
|
|
}
|
|
|
|
public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(destination: C, transform: (T) -> R): C {
|
|
for (item in this)
|
|
destination.add(transform(item))
|
|
return destination
|
|
}
|
|
|
|
internal fun <T> List<T>.optimizeReadOnlyList() = when (size) {
|
|
0 -> emptyList()
|
|
1 -> listOf(this[0])
|
|
else -> this
|
|
}
|
|
|
|
public inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean {
|
|
if (this is Collection && isEmpty()) return true
|
|
for (element in this) if (!predicate(element)) return false
|
|
return true
|
|
}
|
|
|
|
public fun <T, A : Appendable> Iterable<T>.joinTo(buffer: A, separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): A {
|
|
buffer.append(prefix)
|
|
var count = 0
|
|
for (element in this) {
|
|
if (++count > 1) buffer.append(separator)
|
|
if (limit < 0 || count <= limit) {
|
|
buffer.appendElement(element, transform)
|
|
} else break
|
|
}
|
|
if (limit >= 0 && count > limit) buffer.append(truncated)
|
|
buffer.append(postfix)
|
|
return buffer
|
|
}
|
|
|
|
private fun <T> Appendable.appendElement(element: T, transform: ((T) -> CharSequence)?) {
|
|
when {
|
|
transform != null -> append(transform(element))
|
|
element is CharSequence? -> append(element)
|
|
element is Char -> append(element)
|
|
else -> append(element.toString())
|
|
}
|
|
}
|
|
|
|
public fun <T> Iterable<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String {
|
|
return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString()
|
|
} |