| @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>, java.io.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() |
| } |