| @file:kotlin.jvm.JvmMultifileClass |
| @file:kotlin.jvm.JvmName("CollectionsKt") |
| |
| package kotlin.collections |
| |
| // |
| // NOTE THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt |
| // See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib |
| // |
| |
| import java.util.* |
| |
| import java.util.Collections // TODO: it's temporary while we have java.util.Collections in js |
| |
| /** |
| * Returns 1st *element* from the collection. |
| */ |
| @Suppress("NOTHING_TO_INLINE") |
| public inline operator fun <T> List<T>.component1(): T { |
| return get(0) |
| } |
| |
| /** |
| * Returns 2nd *element* from the collection. |
| */ |
| @Suppress("NOTHING_TO_INLINE") |
| public inline operator fun <T> List<T>.component2(): T { |
| return get(1) |
| } |
| |
| /** |
| * Returns 3rd *element* from the collection. |
| */ |
| @Suppress("NOTHING_TO_INLINE") |
| public inline operator fun <T> List<T>.component3(): T { |
| return get(2) |
| } |
| |
| /** |
| * Returns 4th *element* from the collection. |
| */ |
| @Suppress("NOTHING_TO_INLINE") |
| public inline operator fun <T> List<T>.component4(): T { |
| return get(3) |
| } |
| |
| /** |
| * Returns 5th *element* from the collection. |
| */ |
| @Suppress("NOTHING_TO_INLINE") |
| public inline operator fun <T> List<T>.component5(): T { |
| return get(4) |
| } |
| |
| /** |
| * Returns `true` if [element] is found in the collection. |
| */ |
| public operator fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.contains(element: T): Boolean { |
| if (this is Collection) |
| return contains(element) |
| return indexOf(element) >= 0 |
| } |
| |
| /** |
| * Returns `true` if [element] is found in the collection. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("contains(element as T)")) |
| @kotlin.jvm.JvmName("containsAny") |
| @kotlin.internal.LowPriorityInOverloadResolution |
| public operator fun <T> Iterable<T>.contains(element: T): Boolean { |
| return contains(element as T) |
| } |
| |
| /** |
| * Returns `true` if [element] is found in the collection. |
| * Allows to overcome type-safety restriction of `contains` that requires to pass an element of type `T`. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("contains(element as Any?)")) |
| @Suppress("NOTHING_TO_INLINE") |
| public inline fun Iterable<*>.containsRaw(element: Any?): Boolean { |
| return contains(element as Any?) |
| } |
| |
| /** |
| * Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this collection. |
| */ |
| public fun <T> Iterable<T>.elementAt(index: Int): T { |
| if (this is List) |
| return get(index) |
| return elementAtOrElse(index) { throw IndexOutOfBoundsException("Collection doesn't contain element at index $index.") } |
| } |
| |
| /** |
| * Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this list. |
| */ |
| public fun <T> List<T>.elementAt(index: Int): T { |
| return get(index) |
| } |
| |
| /** |
| * Returns an element at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this collection. |
| */ |
| public fun <T> Iterable<T>.elementAtOrElse(index: Int, defaultValue: (Int) -> T): T { |
| if (this is List) |
| return this.getOrElse(index, defaultValue) |
| if (index < 0) |
| return defaultValue(index) |
| val iterator = iterator() |
| var count = 0 |
| while (iterator.hasNext()) { |
| val element = iterator.next() |
| if (index == count++) |
| return element |
| } |
| return defaultValue(index) |
| } |
| |
| /** |
| * Returns an element at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this list. |
| */ |
| public inline fun <T> List<T>.elementAtOrElse(index: Int, defaultValue: (Int) -> T): T { |
| return if (index >= 0 && index <= lastIndex) get(index) else defaultValue(index) |
| } |
| |
| /** |
| * Returns an element at the given [index] or `null` if the [index] is out of bounds of this collection. |
| */ |
| public fun <T> Iterable<T>.elementAtOrNull(index: Int): T? { |
| if (this is List) |
| return this.getOrNull(index) |
| if (index < 0) |
| return null |
| val iterator = iterator() |
| var count = 0 |
| while (iterator.hasNext()) { |
| val element = iterator.next() |
| if (index == count++) |
| return element |
| } |
| return null |
| } |
| |
| /** |
| * Returns an element at the given [index] or `null` if the [index] is out of bounds of this list. |
| */ |
| public fun <T> List<T>.elementAtOrNull(index: Int): T? { |
| return if (index >= 0 && index <= lastIndex) get(index) else null |
| } |
| |
| /** |
| * Returns the first element matching the given [predicate], or `null` if no such element was found. |
| */ |
| public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? { |
| return firstOrNull(predicate) |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate], or `null` if no such element was found. |
| */ |
| public inline fun <T> Iterable<T>.findLast(predicate: (T) -> Boolean): T? { |
| return lastOrNull(predicate) |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate], or `null` if no such element was found. |
| */ |
| public inline fun <T> List<T>.findLast(predicate: (T) -> Boolean): T? { |
| return lastOrNull(predicate) |
| } |
| |
| /** |
| * Returns first element. |
| * @throws [NoSuchElementException] if the collection is empty. |
| */ |
| public fun <T> Iterable<T>.first(): T { |
| when (this) { |
| is List -> { |
| if (isEmpty()) |
| throw NoSuchElementException("Collection is empty.") |
| else |
| return this[0] |
| } |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| throw NoSuchElementException("Collection is empty.") |
| return iterator.next() |
| } |
| } |
| } |
| |
| /** |
| * Returns first element. |
| * @throws [NoSuchElementException] if the list is empty. |
| */ |
| public fun <T> List<T>.first(): T { |
| if (isEmpty()) |
| throw NoSuchElementException("Collection is empty.") |
| return this[0] |
| } |
| |
| /** |
| * Returns the first element matching the given [predicate]. |
| * @throws [NoSuchElementException] if no such element is found. |
| */ |
| public inline fun <T> Iterable<T>.first(predicate: (T) -> Boolean): T { |
| for (element in this) if (predicate(element)) return element |
| throw NoSuchElementException("No element matching predicate was found.") |
| } |
| |
| /** |
| * Returns the first element, or `null` if the collection is empty. |
| */ |
| public fun <T> Iterable<T>.firstOrNull(): T? { |
| when (this) { |
| is List -> { |
| if (isEmpty()) |
| return null |
| else |
| return this[0] |
| } |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| return null |
| return iterator.next() |
| } |
| } |
| } |
| |
| /** |
| * Returns the first element, or `null` if the list is empty. |
| */ |
| public fun <T> List<T>.firstOrNull(): T? { |
| return if (isEmpty()) null else this[0] |
| } |
| |
| /** |
| * Returns the first element matching the given [predicate], or `null` if element was not found. |
| */ |
| public inline fun <T> Iterable<T>.firstOrNull(predicate: (T) -> Boolean): T? { |
| for (element in this) if (predicate(element)) return element |
| return null |
| } |
| |
| /** |
| * Returns an element at the given [index] or the result of calling the [defaultValue] function if the [index] is out of bounds of this list. |
| */ |
| public inline fun <T> List<T>.getOrElse(index: Int, defaultValue: (Int) -> T): T { |
| return if (index >= 0 && index <= lastIndex) get(index) else defaultValue(index) |
| } |
| |
| /** |
| * Returns an element at the given [index] or `null` if the [index] is out of bounds of this list. |
| */ |
| public fun <T> List<T>.getOrNull(index: Int): T? { |
| return if (index >= 0 && index <= lastIndex) get(index) else null |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the collection does not contain element. |
| */ |
| public fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.indexOf(element: T): Int { |
| if (this is List) return this.indexOf(element) |
| var index = 0 |
| for (item in this) { |
| if (element == item) |
| return index |
| index++ |
| } |
| return -1 |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the list does not contain element. |
| */ |
| public fun <@kotlin.internal.OnlyInputTypes T> List<T>.indexOf(element: T): Int { |
| return indexOf(element) |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the collection does not contain element. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("indexOf(element as T)")) |
| @kotlin.jvm.JvmName("indexOfAny") |
| @kotlin.internal.LowPriorityInOverloadResolution |
| @Suppress("NOTHING_TO_INLINE") |
| public fun <T> Iterable<T>.indexOf(element: T): Int { |
| return indexOf(element as T) |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the collection does not contain element. |
| */ |
| @Deprecated("List and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("indexOf(element as T)")) |
| @kotlin.jvm.JvmName("indexOfAny") |
| @kotlin.internal.LowPriorityInOverloadResolution |
| @Suppress("NOTHING_TO_INLINE") |
| public fun <T> List<T>.indexOf(element: T): Int { |
| return indexOf(element as T) |
| } |
| |
| /** |
| * Returns index of the first element matching the given [predicate], or -1 if the collection does not contain such element. |
| */ |
| public inline fun <T> Iterable<T>.indexOfFirst(predicate: (T) -> Boolean): Int { |
| var index = 0 |
| for (item in this) { |
| if (predicate(item)) |
| return index |
| index++ |
| } |
| return -1 |
| } |
| |
| /** |
| * Returns index of the first element matching the given [predicate], or -1 if the list does not contain such element. |
| */ |
| public inline fun <T> List<T>.indexOfFirst(predicate: (T) -> Boolean): Int { |
| for (index in indices) { |
| if (predicate(this[index])) { |
| return index |
| } |
| } |
| return -1 |
| } |
| |
| /** |
| * Returns index of the last element matching the given [predicate], or -1 if the collection does not contain such element. |
| */ |
| public inline fun <T> Iterable<T>.indexOfLast(predicate: (T) -> Boolean): Int { |
| var lastIndex = -1 |
| var index = 0 |
| for (item in this) { |
| if (predicate(item)) |
| lastIndex = index |
| index++ |
| } |
| return lastIndex |
| } |
| |
| /** |
| * Returns index of the last element matching the given [predicate], or -1 if the list does not contain such element. |
| */ |
| public inline fun <T> List<T>.indexOfLast(predicate: (T) -> Boolean): Int { |
| for (index in indices.reversed()) { |
| if (predicate(this[index])) { |
| return index |
| } |
| } |
| return -1 |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the collection does not contain element. |
| * Allows to overcome type-safety restriction of `indexOf` that requires to pass an element of type `T`. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("indexOf(element as Any?)")) |
| @Suppress("NOTHING_TO_INLINE") |
| public inline fun Iterable<*>.indexOfRaw(element: Any?): Int { |
| return indexOf(element as Any?) |
| } |
| |
| /** |
| * Returns first index of [element], or -1 if the list does not contain element. |
| * Allows to overcome type-safety restriction of `indexOf` that requires to pass an element of type `T`. |
| */ |
| @Deprecated("List and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("indexOf(element as Any?)")) |
| @Suppress("NOTHING_TO_INLINE") |
| public inline fun <T> List<T>.indexOfRaw(element: Any?): Int { |
| return (this as List<Any?>).indexOf(element) |
| } |
| |
| /** |
| * Returns the last element. |
| * @throws [NoSuchElementException] if the collection is empty. |
| */ |
| public fun <T> Iterable<T>.last(): T { |
| when (this) { |
| is List -> { |
| if (isEmpty()) |
| throw NoSuchElementException("Collection is empty.") |
| else |
| return this[this.lastIndex] |
| } |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| throw NoSuchElementException("Collection is empty.") |
| var last = iterator.next() |
| while (iterator.hasNext()) |
| last = iterator.next() |
| return last |
| } |
| } |
| } |
| |
| /** |
| * Returns the last element. |
| * @throws [NoSuchElementException] if the list is empty. |
| */ |
| public fun <T> List<T>.last(): T { |
| if (isEmpty()) |
| throw NoSuchElementException("Collection is empty.") |
| return this[lastIndex] |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate]. |
| * @throws [NoSuchElementException] if no such element is found. |
| */ |
| public inline fun <T> Iterable<T>.last(predicate: (T) -> Boolean): T { |
| if (this is List) |
| return this.last(predicate) |
| var last: T? = null |
| var found = false |
| for (element in this) { |
| if (predicate(element)) { |
| last = element |
| found = true |
| } |
| } |
| if (!found) throw NoSuchElementException("Collection doesn't contain any element matching the predicate.") |
| return last as T |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate]. |
| * @throws [NoSuchElementException] if no such element is found. |
| */ |
| public inline fun <T> List<T>.last(predicate: (T) -> Boolean): T { |
| for (index in this.indices.reversed()) { |
| val element = this[index] |
| if (predicate(element)) return element |
| } |
| throw NoSuchElementException("Collection doesn't contain any element matching the predicate.") |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the collection does not contain element. |
| */ |
| public fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.lastIndexOf(element: T): Int { |
| if (this is List) return this.lastIndexOf(element) |
| var lastIndex = -1 |
| var index = 0 |
| for (item in this) { |
| if (element == item) |
| lastIndex = index |
| index++ |
| } |
| return lastIndex |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the list does not contain element. |
| */ |
| public fun <@kotlin.internal.OnlyInputTypes T> List<T>.lastIndexOf(element: T): Int { |
| return lastIndexOf(element) |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the collection does not contain element. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("lastIndexOf(element as T)")) |
| @kotlin.jvm.JvmName("lastIndexOfAny") |
| @kotlin.internal.LowPriorityInOverloadResolution |
| @Suppress("NOTHING_TO_INLINE") |
| public fun <T> Iterable<T>.lastIndexOf(element: T): Int { |
| return lastIndexOf(element as T) |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the collection does not contain element. |
| */ |
| @Deprecated("List and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("lastIndexOf(element as T)")) |
| @kotlin.jvm.JvmName("lastIndexOfAny") |
| @kotlin.internal.LowPriorityInOverloadResolution |
| @Suppress("NOTHING_TO_INLINE") |
| public fun <T> List<T>.lastIndexOf(element: T): Int { |
| return lastIndexOf(element as T) |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the collection does not contain element. |
| * Allows to overcome type-safety restriction of `lastIndexOf` that requires to pass an element of type `T`. |
| */ |
| @Deprecated("Collection and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("lastIndexOf(element as Any?)")) |
| @Suppress("NOTHING_TO_INLINE") |
| public inline fun Iterable<*>.lastIndexOfRaw(element: Any?): Int { |
| return lastIndexOf(element as Any?) |
| } |
| |
| /** |
| * Returns last index of [element], or -1 if the list does not contain element. |
| * Allows to overcome type-safety restriction of `lastIndexOf` that requires to pass an element of type `T`. |
| */ |
| @Deprecated("List and element have incompatible types. Upcast element to Any? if you're sure.", ReplaceWith("lastIndexOf(element as Any?)")) |
| @Suppress("NOTHING_TO_INLINE") |
| public inline fun <T> List<T>.lastIndexOfRaw(element: Any?): Int { |
| return (this as List<Any?>).lastIndexOf(element) |
| } |
| |
| /** |
| * Returns the last element, or `null` if the collection is empty. |
| */ |
| public fun <T> Iterable<T>.lastOrNull(): T? { |
| when (this) { |
| is List -> return if (isEmpty()) null else this[size - 1] |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| return null |
| var last = iterator.next() |
| while (iterator.hasNext()) |
| last = iterator.next() |
| return last |
| } |
| } |
| } |
| |
| /** |
| * Returns the last element, or `null` if the list is empty. |
| */ |
| public fun <T> List<T>.lastOrNull(): T? { |
| return if (isEmpty()) null else this[size - 1] |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate], or `null` if no such element was found. |
| */ |
| public inline fun <T> Iterable<T>.lastOrNull(predicate: (T) -> Boolean): T? { |
| if (this is List) |
| return this.lastOrNull(predicate) |
| var last: T? = null |
| for (element in this) { |
| if (predicate(element)) { |
| last = element |
| } |
| } |
| return last |
| } |
| |
| /** |
| * Returns the last element matching the given [predicate], or `null` if no such element was found. |
| */ |
| public inline fun <T> List<T>.lastOrNull(predicate: (T) -> Boolean): T? { |
| for (index in this.indices.reversed()) { |
| val element = this[index] |
| if (predicate(element)) return element |
| } |
| return null |
| } |
| |
| /** |
| * Returns the single element, or throws an exception if the collection is empty or has more than one element. |
| */ |
| public fun <T> Iterable<T>.single(): T { |
| when (this) { |
| is List -> return when (size) { |
| 0 -> throw NoSuchElementException("Collection is empty.") |
| 1 -> this[0] |
| else -> throw IllegalArgumentException("Collection has more than one element.") |
| } |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| throw NoSuchElementException("Collection is empty.") |
| var single = iterator.next() |
| if (iterator.hasNext()) |
| throw IllegalArgumentException("Collection has more than one element.") |
| return single |
| } |
| } |
| } |
| |
| /** |
| * Returns the single element, or throws an exception if the list is empty or has more than one element. |
| */ |
| public fun <T> List<T>.single(): T { |
| return when (size) { |
| 0 -> throw NoSuchElementException("Collection is empty.") |
| 1 -> this[0] |
| else -> throw IllegalArgumentException("Collection has more than one element.") |
| } |
| } |
| |
| /** |
| * Returns the single element matching the given [predicate], or throws exception if there is no or more than one matching element. |
| */ |
| public inline fun <T> Iterable<T>.single(predicate: (T) -> Boolean): T { |
| var single: T? = null |
| var found = false |
| for (element in this) { |
| if (predicate(element)) { |
| if (found) throw IllegalArgumentException("Collection contains more than one matching element.") |
| single = element |
| found = true |
| } |
| } |
| if (!found) throw NoSuchElementException("Collection doesn't contain any element matching predicate.") |
| return single as T |
| } |
| |
| /** |
| * Returns single element, or `null` if the collection is empty or has more than one element. |
| */ |
| public fun <T> Iterable<T>.singleOrNull(): T? { |
| when (this) { |
| is List -> return if (size == 1) this[0] else null |
| else -> { |
| val iterator = iterator() |
| if (!iterator.hasNext()) |
| return null |
| var single = iterator.next() |
| if (iterator.hasNext()) |
| return null |
| return single |
| } |
| } |
| } |
| |
| /** |
| * Returns single element, or `null` if the list is empty or has more than one element. |
| */ |
| public fun <T> List<T>.singleOrNull(): T? { |
| return if (size == 1) this[0] else null |
| } |
| |
| /** |
| * Returns the single element matching the given [predicate], or `null` if element was not found or more than one element was found. |
| */ |
| public inline fun <T> Iterable<T>.singleOrNull(predicate: (T) -> Boolean): T? { |
| var single: T? = null |
| var found = false |
| for (element in this) { |
| if (predicate(element)) { |
| if (found) return null |
| single = element |
| found = true |
| } |
| } |
| if (!found) return null |
| return single |
| } |
| |
| /** |
| * Returns a list containing all elements except first [n] elements. |
| */ |
| public fun <T> Iterable<T>.drop(n: Int): List<T> { |
| require(n >= 0, { "Requested element count $n is less than zero." }) |
| if (n == 0) return toList() |
| val list: ArrayList<T> |
| if (this is Collection<*>) { |
| val resultSize = size - n |
| if (resultSize <= 0) |
| return emptyList() |
| list = ArrayList<T>(resultSize) |
| if (this is List<T>) { |
| for (index in n..size - 1) { |
| list.add(this[index]) |
| } |
| return list |
| } |
| } |
| else { |
| list = ArrayList<T>() |
| } |
| var count = 0 |
| for (item in this) { |
| if (count++ >= n) list.add(item) |
| } |
| return list |
| } |
| |
| /** |
| * Returns a list containing all elements except last [n] elements. |
| */ |
| public fun <T> List<T>.dropLast(n: Int): List<T> { |
| require(n >= 0, { "Requested element count $n is less than zero." }) |
| return take((size - n).coerceAtLeast(0)) |
| } |
| |
| /** |
| * Returns a list containing all elements except last elements that satisfy the given [predicate]. |
| */ |
| public inline fun <T> List<T>.dropLastWhile(predicate: (T) -> Boolean): List<T> { |
| for (index in lastIndex downTo 0) { |
| if (!predicate(this[index])) { |
| return take(index + 1) |
| } |
| } |
| return emptyList() |
| } |
| |
| /** |
| * Returns a list containing all elements except first elements that satisfy the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.dropWhile(predicate: (T) -> Boolean): List<T> { |
| var yielding = false |
| val list = ArrayList<T>() |
| for (item in this) |
| if (yielding) |
| list.add(item) |
| else if (!predicate(item)) { |
| list.add(item) |
| yielding = true |
| } |
| return list |
| } |
| |
| /** |
| * Returns a list containing only elements matching the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { |
| return filterTo(ArrayList<T>(), predicate) |
| } |
| |
| /** |
| * Returns a list containing only elements matching the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.filterIndexed(predicate: (Int, T) -> Boolean): List<T> { |
| return filterIndexedTo(ArrayList<T>(), predicate) |
| } |
| |
| /** |
| * Appends all elements matching the given [predicate] to the given [destination]. |
| */ |
| public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterIndexedTo(destination: C, predicate: (Int, T) -> Boolean): C { |
| forEachIndexed { index, element -> |
| if (predicate(index, element)) destination.add(element) |
| } |
| return destination |
| } |
| |
| /** |
| * Returns a list containing all elements not matching the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.filterNot(predicate: (T) -> Boolean): List<T> { |
| return filterNotTo(ArrayList<T>(), predicate) |
| } |
| |
| /** |
| * Returns a list containing all elements that are not `null`. |
| */ |
| public fun <T : Any> Iterable<T?>.filterNotNull(): List<T> { |
| return filterNotNullTo(ArrayList<T>()) |
| } |
| |
| /** |
| * Appends all elements that are not `null` to the given [destination]. |
| */ |
| public fun <C : MutableCollection<in T>, T : Any> Iterable<T?>.filterNotNullTo(destination: C): C { |
| for (element in this) if (element != null) destination.add(element) |
| return destination |
| } |
| |
| /** |
| * Appends all elements not matching the given [predicate] to the given [destination]. |
| */ |
| public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterNotTo(destination: C, predicate: (T) -> Boolean): C { |
| for (element in this) if (!predicate(element)) destination.add(element) |
| return destination |
| } |
| |
| /** |
| * Appends all elements matching the given [predicate] to the given [destination]. |
| */ |
| public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo(destination: C, predicate: (T) -> Boolean): C { |
| for (element in this) if (predicate(element)) destination.add(element) |
| return destination |
| } |
| |
| /** |
| * Returns a list containing elements at indices in the specified [indices] range. |
| */ |
| public fun <T> List<T>.slice(indices: IntRange): List<T> { |
| if (indices.isEmpty()) return listOf() |
| return this.subList(indices.start, indices.endInclusive + 1).toList() |
| } |
| |
| /** |
| * Returns a list containing elements at specified [indices]. |
| */ |
| public fun <T> List<T>.slice(indices: Iterable<Int>): List<T> { |
| val size = indices.collectionSizeOrDefault(10) |
| if (size == 0) return listOf() |
| val list = ArrayList<T>(size) |
| for (index in indices) { |
| list.add(get(index)) |
| } |
| return list |
| } |
| |
| /** |
| * Returns a list containing first [n] elements. |
| */ |
| public fun <T> Iterable<T>.take(n: Int): List<T> { |
| require(n >= 0, { "Requested element count $n is less than zero." }) |
| if (n == 0) return emptyList() |
| if (this is Collection<T> && n >= size) return toList() |
| var count = 0 |
| val list = ArrayList<T>(n) |
| for (item in this) { |
| if (count++ == n) |
| break |
| list.add(item) |
| } |
| return list |
| } |
| |
| /** |
| * Returns a list containing last [n] elements. |
| */ |
| public fun <T> List<T>.takeLast(n: Int): List<T> { |
| require(n >= 0, { "Requested element count $n is less than zero." }) |
| if (n == 0) return emptyList() |
| val size = size |
| if (n >= size) return toList() |
| val list = ArrayList<T>(n) |
| for (index in size - n .. size - 1) |
| list.add(this[index]) |
| return list |
| } |
| |
| /** |
| * Returns a list containing last elements satisfying the given [predicate]. |
| */ |
| public inline fun <T> List<T>.takeLastWhile(predicate: (T) -> Boolean): List<T> { |
| for (index in lastIndex downTo 0) { |
| if (!predicate(this[index])) { |
| return drop(index + 1) |
| } |
| } |
| return toList() |
| } |
| |
| /** |
| * Returns a list containing first elements satisfying the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.takeWhile(predicate: (T) -> Boolean): List<T> { |
| val list = ArrayList<T>() |
| for (item in this) { |
| if (!predicate(item)) |
| break; |
| list.add(item) |
| } |
| return list |
| } |
| |
| /** |
| * Reverses elements in the list in-place. |
| */ |
| public fun <T> MutableList<T>.reverse(): Unit { |
| java.util.Collections.reverse(this) |
| } |
| |
| /** |
| * Returns a list with elements in reversed order. |
| */ |
| public fun <T> Iterable<T>.reversed(): List<T> { |
| if (this is Collection && isEmpty()) return emptyList() |
| val list = toArrayList() |
| Collections.reverse(list) |
| return list |
| } |
| |
| /** |
| * Sorts elements in the list in-place according to natural sort order of the value returned by specified [selector] function. |
| */ |
| public inline fun <T, R : Comparable<R>> MutableList<T>.sortBy(crossinline selector: (T) -> R?): Unit { |
| if (size > 1) sortWith(compareBy(selector)) |
| } |
| |
| /** |
| * Sorts elements in the list in-place descending according to natural sort order of the value returned by specified [selector] function. |
| */ |
| public inline fun <T, R : Comparable<R>> MutableList<T>.sortByDescending(crossinline selector: (T) -> R?): Unit { |
| if (size > 1) sortWith(compareByDescending(selector)) |
| } |
| |
| /** |
| * Sorts elements in the list in-place descending according to their natural sort order. |
| */ |
| public fun <T : Comparable<T>> MutableList<T>.sortDescending(): Unit { |
| sortWith(reverseOrder()) |
| } |
| |
| /** |
| * Returns a list of all elements sorted according to their natural sort order. |
| */ |
| public fun <T : Comparable<T>> Iterable<T>.sorted(): List<T> { |
| if (this is Collection) { |
| if (size <= 1) return this.toArrayList() |
| return (toTypedArray<Comparable<T>>() as Array<T>).apply { sort() }.asList() |
| } |
| return toArrayList().apply { sort() } |
| } |
| |
| /** |
| * Returns a list of all elements sorted according to natural sort order of the value returned by specified [selector] function. |
| */ |
| public inline fun <T, R : Comparable<R>> Iterable<T>.sortedBy(crossinline selector: (T) -> R?): List<T> { |
| return sortedWith(compareBy(selector)) |
| } |
| |
| /** |
| * Returns a list of all elements sorted descending according to natural sort order of the value returned by specified [selector] function. |
| */ |
| public inline fun <T, R : Comparable<R>> Iterable<T>.sortedByDescending(crossinline selector: (T) -> R?): List<T> { |
| return sortedWith(compareByDescending(selector)) |
| } |
| |
| /** |
| * Returns a list of all elements sorted descending according to their natural sort order. |
| */ |
| public fun <T : Comparable<T>> Iterable<T>.sortedDescending(): List<T> { |
| return sortedWith(reverseOrder()) |
| } |
| |
| /** |
| * Returns a list of all elements sorted according to the specified [comparator]. |
| */ |
| public fun <T> Iterable<T>.sortedWith(comparator: Comparator<in T>): List<T> { |
| if (this is Collection) { |
| if (size <= 1) return this.toArrayList() |
| return (toTypedArray<Any?>() as Array<T>).apply { sortWith(comparator) }.asList() |
| } |
| return toArrayList().apply { sortWith(comparator) } |
| } |
| |
| /** |
| * Returns an array of Boolean containing all of the elements of this collection. |
| */ |
| public fun Collection<Boolean>.toBooleanArray(): BooleanArray { |
| val result = BooleanArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Byte containing all of the elements of this collection. |
| */ |
| public fun Collection<Byte>.toByteArray(): ByteArray { |
| val result = ByteArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Char containing all of the elements of this collection. |
| */ |
| public fun Collection<Char>.toCharArray(): CharArray { |
| val result = CharArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Double containing all of the elements of this collection. |
| */ |
| public fun Collection<Double>.toDoubleArray(): DoubleArray { |
| val result = DoubleArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Float containing all of the elements of this collection. |
| */ |
| public fun Collection<Float>.toFloatArray(): FloatArray { |
| val result = FloatArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Int containing all of the elements of this collection. |
| */ |
| public fun Collection<Int>.toIntArray(): IntArray { |
| val result = IntArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Long containing all of the elements of this collection. |
| */ |
| public fun Collection<Long>.toLongArray(): LongArray { |
| val result = LongArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an array of Short containing all of the elements of this collection. |
| */ |
| public fun Collection<Short>.toShortArray(): ShortArray { |
| val result = ShortArray(size) |
| var index = 0 |
| for (element in this) |
| result[index++] = element |
| return result |
| } |
| |
| /** |
| * Returns an [ArrayList] of all elements. |
| */ |
| public fun <T> Collection<T>.toArrayList(): ArrayList<T> { |
| return ArrayList(this) |
| } |
| |
| /** |
| * Returns an [ArrayList] of all elements. |
| */ |
| public fun <T> Iterable<T>.toArrayList(): ArrayList<T> { |
| if (this is Collection<T>) |
| return this.toArrayList() |
| return toCollection(ArrayList<T>()) |
| } |
| |
| /** |
| * Appends all elements to the given [destination] collection. |
| */ |
| public fun <T, C : MutableCollection<in T>> Iterable<T>.toCollection(destination: C): C { |
| for (item in this) { |
| destination.add(item) |
| } |
| return destination |
| } |
| |
| /** |
| * Returns a [HashSet] of all elements. |
| */ |
| public fun <T> Iterable<T>.toHashSet(): HashSet<T> { |
| return toCollection(HashSet<T>(mapCapacity(collectionSizeOrDefault(12)))) |
| } |
| |
| /** |
| * Returns a [LinkedList] containing all elements. |
| */ |
| @Deprecated("Use toCollection(LinkedList()) instead.", ReplaceWith("toCollection(LinkedList())")) |
| public fun <T> Iterable<T>.toLinkedList(): LinkedList<T> { |
| return toCollection(LinkedList()) |
| } |
| |
| /** |
| * Returns a [List] containing all elements. |
| */ |
| public fun <T> Iterable<T>.toList(): List<T> { |
| return this.toArrayList() |
| } |
| |
| @Deprecated("Use toMapBy instead.", ReplaceWith("toMapBy(selector)"), level = DeprecationLevel.HIDDEN) |
| public inline fun <T, K> Iterable<T>.toMap(selector: (T) -> K): Map<K, T> { |
| return toMapBy(selector) |
| } |
| |
| /** |
| * Returns a [Map] containing the values provided by [transform] and indexed by [selector] functions applied to elements of the given collection. |
| * If any two elements would have the same key returned by [selector] the last one gets added to the map. |
| */ |
| @Deprecated("Use toMapBy instead.", ReplaceWith("toMapBy(selector, transform)")) |
| public inline fun <T, K, V> Iterable<T>.toMap(selector: (T) -> K, transform: (T) -> V): Map<K, V> { |
| return toMapBy(selector, transform) |
| } |
| |
| /** |
| * Returns a [Map] containing key-value pairs provided by [transform] function applied to elements of the given collection. |
| * If any of two pairs would have the same key the last one gets added to the map. |
| */ |
| @kotlin.jvm.JvmName("toMapOfPairs") |
| public inline fun <T, K, V> Iterable<T>.toMap(transform: (T) -> Pair<K, V>): Map<K, V> { |
| val capacity = (collectionSizeOrDefault(10)/.75f) + 1 |
| val result = LinkedHashMap<K, V>(Math.max(capacity.toInt(), 16)) |
| for (element in this) { |
| result += transform(element) |
| } |
| return result |
| } |
| |
| /** |
| * Returns a [Map] containing the elements from the given collection indexed by the key |
| * returned from [selector] function applied to each element. |
| * If any two elements would have the same key returned by [selector] the last one gets added to the map. |
| */ |
| public inline fun <T, K> Iterable<T>.toMapBy(selector: (T) -> K): Map<K, T> { |
| val capacity = (collectionSizeOrDefault(10)/.75f) + 1 |
| val result = LinkedHashMap<K, T>(Math.max(capacity.toInt(), 16)) |
| for (element in this) { |
| result.put(selector(element), element) |
| } |
| return result |
| } |
| |
| /** |
| * Returns a [Map] containing the values provided by [transform] and indexed by [selector] functions applied to elements of the given collection. |
| * If any two elements would have the same key returned by [selector] the last one gets added to the map. |
| */ |
| public inline fun <T, K, V> Iterable<T>.toMapBy(selector: (T) -> K, transform: (T) -> V): Map<K, V> { |
| val capacity = (collectionSizeOrDefault(10)/.75f) + 1 |
| val result = LinkedHashMap<K, V>(Math.max(capacity.toInt(), 16)) |
| for (element in this) { |
| result.put(selector(element), transform(element)) |
| } |
| return result |
| } |
| |
| /** |
| * Returns a [Set] of all elements. |
| */ |
| public fun <T> Iterable<T>.toSet(): Set<T> { |
| return toCollection(LinkedHashSet<T>(mapCapacity(collectionSizeOrDefault(12)))) |
| } |
| |
| /** |
| * Returns a [SortedSet] of all elements. |
| */ |
| public fun <T: Comparable<T>> Iterable<T>.toSortedSet(): SortedSet<T> { |
| return toCollection(TreeSet<T>()) |
| } |
| |
| /** |
| * Returns a [SortedSet] of all elements. |
| * Elements in the set returned are sorted according to the given [comparator]. |
| */ |
| @kotlin.jvm.JvmVersion |
| public fun <T> Iterable<T>.toSortedSet(comparator: Comparator<in T>): SortedSet<T> { |
| return toCollection(TreeSet<T>(comparator)) |
| } |
| |
| /** |
| * Returns a single list of all elements yielded from results of [transform] function being invoked on each element of original collection. |
| */ |
| public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R> { |
| return flatMapTo(ArrayList<R>(), transform) |
| } |
| |
| /** |
| * Appends all elements yielded from results of [transform] function being invoked on each element of original collection, to the given [destination]. |
| */ |
| public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.flatMapTo(destination: C, transform: (T) -> Iterable<R>): C { |
| for (element in this) { |
| val list = transform(element) |
| destination.addAll(list) |
| } |
| return destination |
| } |
| |
| /** |
| * Returns a map of the elements in original collection grouped by the key returned by the given [selector] function. |
| */ |
| public inline fun <T, K> Iterable<T>.groupBy(selector: (T) -> K): Map<K, List<T>> { |
| return groupByTo(LinkedHashMap<K, MutableList<T>>(), selector) |
| } |
| |
| /** |
| * Appends elements from original collection grouped by the key returned by the given [selector] function to the given [map]. |
| */ |
| public inline fun <T, K> Iterable<T>.groupByTo(map: MutableMap<K, MutableList<T>>, selector: (T) -> K): Map<K, MutableList<T>> { |
| for (element in this) { |
| val key = selector(element) |
| val list = map.getOrPut(key) { ArrayList<T>() } |
| list.add(element) |
| } |
| return map |
| } |
| |
| /** |
| * Returns a list containing the results of applying the given [transform] function |
| * to each element in the original collection. |
| */ |
| public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { |
| return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform) |
| } |
| |
| /** |
| * Returns a list containing the results of applying the given [transform] function |
| * to each element and its index in the original collection. |
| */ |
| public inline fun <T, R> Iterable<T>.mapIndexed(transform: (Int, T) -> R): List<R> { |
| return mapIndexedTo(ArrayList<R>(collectionSizeOrDefault(10)), transform) |
| } |
| |
| /** |
| * Returns a list containing only the non-null results of applying the given [transform] function |
| * to each element and its index in the original collection. |
| */ |
| public inline fun <T, R : Any> Iterable<T>.mapIndexedNotNull(transform: (Int, T) -> R?): List<R> { |
| return mapIndexedNotNullTo(ArrayList<R>(), transform) |
| } |
| |
| /** |
| * Applies the given [transform] function to each element and its index in the original collection |
| * and appends only the non-null results to the given [destination]. |
| */ |
| public inline fun <T, R : Any, C : MutableCollection<in R>> Iterable<T>.mapIndexedNotNullTo(destination: C, transform: (Int, T) -> R?): C { |
| forEachIndexed { index, element -> transform(index, element)?.let { destination.add(it) } } |
| return destination |
| } |
| |
| /** |
| * Applies the given [transform] function to each element and its index in the original collection |
| * and appends the results to the given [destination]. |
| */ |
| public inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapIndexedTo(destination: C, transform: (Int, T) -> R): C { |
| var index = 0 |
| for (item in this) |
| destination.add(transform(index++, item)) |
| return destination |
| } |
| |
| /** |
| * Returns a list containing only the non-null results of applying the given [transform] function |
| * to each element in the original collection. |
| */ |
| public inline fun <T, R : Any> Iterable<T>.mapNotNull(transform: (T) -> R?): List<R> { |
| return mapNotNullTo(ArrayList<R>(), transform) |
| } |
| |
| /** |
| * Applies the given [transform] function to each element in the original collection |
| * and appends only the non-null results to the given [destination]. |
| */ |
| public inline fun <T, R : Any, C : MutableCollection<in R>> Iterable<T>.mapNotNullTo(destination: C, transform: (T) -> R?): C { |
| forEach { element -> transform(element)?.let { destination.add(it) } } |
| return destination |
| } |
| |
| /** |
| * Applies the given [transform] function to each element of the original collection |
| * and appends the results to the given [destination]. |
| */ |
| 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 |
| } |
| |
| /** |
| * Returns a lazy [Iterable] of [IndexedValue] for each element of the original collection. |
| */ |
| public fun <T> Iterable<T>.withIndex(): Iterable<IndexedValue<T>> { |
| return IndexingIterable { iterator() } |
| } |
| |
| /** |
| * Returns a list containing only distinct elements from the given collection. |
| * The elements in the resulting list are in the same order as they were in the source collection. |
| */ |
| public fun <T> Iterable<T>.distinct(): List<T> { |
| return this.toMutableSet().toList() |
| } |
| |
| /** |
| * Returns a list containing only elements from the given collection |
| * having distinct keys returned by the given [selector] function. |
| * The elements in the resulting list are in the same order as they were in the source collection. |
| */ |
| public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T> { |
| val set = HashSet<K>() |
| val list = ArrayList<T>() |
| for (e in this) { |
| val key = selector(e) |
| if (set.add(key)) |
| list.add(e) |
| } |
| return list |
| } |
| |
| /** |
| * Returns a set containing all elements that are contained by both this set and the specified collection. |
| */ |
| public infix fun <T> Iterable<T>.intersect(other: Iterable<T>): Set<T> { |
| val set = this.toMutableSet() |
| set.retainAll(other) |
| return set |
| } |
| |
| /** |
| * Returns a set containing all elements that are contained by this set and not contained by the specified collection. |
| */ |
| public infix fun <T> Iterable<T>.subtract(other: Iterable<T>): Set<T> { |
| val set = this.toMutableSet() |
| set.removeAll(other) |
| return set |
| } |
| |
| /** |
| * Returns a mutable set containing all distinct elements from the given collection. |
| */ |
| public fun <T> Iterable<T>.toMutableSet(): MutableSet<T> { |
| return when (this) { |
| is Collection<T> -> LinkedHashSet(this) |
| else -> toCollection(LinkedHashSet<T>()) |
| } |
| } |
| |
| /** |
| * Returns a set containing all distinct elements from both collections. |
| */ |
| public infix fun <T> Iterable<T>.union(other: Iterable<T>): Set<T> { |
| val set = this.toMutableSet() |
| set.addAll(other) |
| return set |
| } |
| |
| /** |
| * Returns `true` if all elements match the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean { |
| for (element in this) if (!predicate(element)) return false |
| return true |
| } |
| |
| /** |
| * Returns `true` if collection has at least one element. |
| */ |
| public fun <T> Iterable<T>.any(): Boolean { |
| for (element in this) return true |
| return false |
| } |
| |
| /** |
| * Returns `true` if at least one element matches the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean { |
| for (element in this) if (predicate(element)) return true |
| return false |
| } |
| |
| /** |
| * Returns the number of elements in this collection. |
| */ |
| public fun <T> Collection<T>.count(): Int { |
| return size |
| } |
| |
| /** |
| * Returns the number of elements in this collection. |
| */ |
| public fun <T> Iterable<T>.count(): Int { |
| var count = 0 |
| for (element in this) count++ |
| return count |
| } |
| |
| /** |
| * Returns the number of elements matching the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.count(predicate: (T) -> Boolean): Int { |
| var count = 0 |
| for (element in this) if (predicate(element)) count++ |
| return count |
| } |
| |
| /** |
| * Accumulates value starting with [initial] value and applying [operation] from left to right to current accumulator value and each element. |
| */ |
| public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (R, T) -> R): R { |
| var accumulator = initial |
| for (element in this) accumulator = operation(accumulator, element) |
| return accumulator |
| } |
| |
| /** |
| * Accumulates value starting with [initial] value and applying [operation] from right to left to each element and current accumulator value. |
| */ |
| public inline fun <T, R> List<T>.foldRight(initial: R, operation: (T, R) -> R): R { |
| var index = lastIndex |
| var accumulator = initial |
| while (index >= 0) { |
| accumulator = operation(get(index--), accumulator) |
| } |
| return accumulator |
| } |
| |
| /** |
| * Performs the given [action] on each element. |
| */ |
| public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { |
| for (element in this) action(element) |
| } |
| |
| /** |
| * Performs the given [action] on each element, providing sequential index with the element. |
| */ |
| public inline fun <T> Iterable<T>.forEachIndexed(action: (Int, T) -> Unit): Unit { |
| var index = 0 |
| for (item in this) action(index++, item) |
| } |
| |
| /** |
| * Returns the largest element or `null` if there are no elements. |
| */ |
| public fun <T : Comparable<T>> Iterable<T>.max(): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var max = iterator.next() |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| if (max < e) max = e |
| } |
| return max |
| } |
| |
| /** |
| * Returns the first element yielding the largest value of the given function or `null` if there are no elements. |
| */ |
| public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var maxElem = iterator.next() |
| var maxValue = selector(maxElem) |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| val v = selector(e) |
| if (maxValue < v) { |
| maxElem = e |
| maxValue = v |
| } |
| } |
| return maxElem |
| } |
| |
| /** |
| * Returns the first element having the largest value according to the provided [comparator] or `null` if there are no elements. |
| */ |
| public fun <T> Iterable<T>.maxWith(comparator: Comparator<in T>): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var max = iterator.next() |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| if (comparator.compare(max, e) < 0) max = e |
| } |
| return max |
| } |
| |
| /** |
| * Returns the smallest element or `null` if there are no elements. |
| */ |
| public fun <T : Comparable<T>> Iterable<T>.min(): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var min = iterator.next() |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| if (min > e) min = e |
| } |
| return min |
| } |
| |
| /** |
| * Returns the first element yielding the smallest value of the given function or `null` if there are no elements. |
| */ |
| public inline fun <T, R : Comparable<R>> Iterable<T>.minBy(selector: (T) -> R): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var minElem = iterator.next() |
| var minValue = selector(minElem) |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| val v = selector(e) |
| if (minValue > v) { |
| minElem = e |
| minValue = v |
| } |
| } |
| return minElem |
| } |
| |
| /** |
| * Returns the first element having the smallest value according to the provided [comparator] or `null` if there are no elements. |
| */ |
| public fun <T> Iterable<T>.minWith(comparator: Comparator<in T>): T? { |
| val iterator = iterator() |
| if (!iterator.hasNext()) return null |
| var min = iterator.next() |
| while (iterator.hasNext()) { |
| val e = iterator.next() |
| if (comparator.compare(min, e) > 0) min = e |
| } |
| return min |
| } |
| |
| /** |
| * Returns `true` if the collection has no elements. |
| */ |
| public fun <T> Iterable<T>.none(): Boolean { |
| for (element in this) return false |
| return true |
| } |
| |
| /** |
| * Returns `true` if no elements match the given [predicate]. |
| */ |
| public inline fun <T> Iterable<T>.none(predicate: (T) -> Boolean): Boolean { |
| for (element in this) if (predicate(element)) return false |
| return true |
| } |
| |
| /** |
| * Accumulates value starting with the first element and applying [operation] from left to right to current accumulator value and each element. |
| */ |
| public inline fun <S, T: S> Iterable<T>.reduce(operation: (S, T) -> S): S { |
| val iterator = this.iterator() |
| if (!iterator.hasNext()) throw UnsupportedOperationException("Empty iterable can't be reduced.") |
| var accumulator: S = iterator.next() |
| while (iterator.hasNext()) { |
| accumulator = operation(accumulator, iterator.next()) |
| } |
| return accumulator |
| } |
| |
| /** |
| * Accumulates value starting with last element and applying [operation] from right to left to each element and current accumulator value. |
| */ |
| public inline fun <S, T: S> List<T>.reduceRight(operation: (T, S) -> S): S { |
| var index = lastIndex |
| if (index < 0) throw UnsupportedOperationException("Empty iterable can't be reduced.") |
| var accumulator: S = get(index--) |
| while (index >= 0) { |
| accumulator = operation(get(index--), accumulator) |
| } |
| return accumulator |
| } |
| |
| /** |
| * Returns the sum of all values produced by [selector] function applied to each element in the collection. |
| */ |
| public inline fun <T> Iterable<T>.sumBy(selector: (T) -> Int): Int { |
| var sum: Int = 0 |
| for (element in this) { |
| sum += selector(element) |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all values produced by [selector] function applied to each element in the collection. |
| */ |
| public inline fun <T> Iterable<T>.sumByDouble(selector: (T) -> Double): Double { |
| var sum: Double = 0.0 |
| for (element in this) { |
| sum += selector(element) |
| } |
| return sum |
| } |
| |
| /** |
| * Returns an original collection containing all the non-`null` elements, throwing an [IllegalArgumentException] if there are any `null` elements. |
| */ |
| public fun <T : Any> Iterable<T?>.requireNoNulls(): Iterable<T> { |
| for (element in this) { |
| if (element == null) { |
| throw IllegalArgumentException("null element found in $this.") |
| } |
| } |
| return this as Iterable<T> |
| } |
| |
| /** |
| * Returns an original collection containing all the non-`null` elements, throwing an [IllegalArgumentException] if there are any `null` elements. |
| */ |
| public fun <T : Any> List<T?>.requireNoNulls(): List<T> { |
| for (element in this) { |
| if (element == null) { |
| throw IllegalArgumentException("null element found in $this.") |
| } |
| } |
| return this as List<T> |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection without the first occurrence of the given [element]. |
| */ |
| public operator fun <T> Iterable<T>.minus(element: T): List<T> { |
| val result = ArrayList<T>(collectionSizeOrDefault(10)) |
| var removed = false |
| return this.filterTo(result) { if (!removed && it == element) { removed = true; false } else true } |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection except the elements contained in the given [elements] array. |
| */ |
| public operator fun <T> Iterable<T>.minus(elements: Array<out T>): List<T> { |
| if (elements.isEmpty()) return this.toList() |
| val other = elements.toHashSet() |
| return this.filterNot { it in other } |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection except the elements contained in the given [elements] collection. |
| */ |
| public operator fun <T> Iterable<T>.minus(elements: Iterable<T>): List<T> { |
| val other = elements.convertToSetForSetOperationWith(this) |
| if (other.isEmpty()) |
| return this.toList() |
| return this.filterNot { it in other } |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection except the elements contained in the given [elements] sequence. |
| */ |
| public operator fun <T> Iterable<T>.minus(elements: Sequence<T>): List<T> { |
| val other = elements.toHashSet() |
| if (other.isEmpty()) |
| return this.toList() |
| return this.filterNot { it in other } |
| } |
| |
| /** |
| * Splits the original collection into pair of lists, |
| * where *first* list contains elements for which [predicate] yielded `true`, |
| * while *second* list contains elements for which [predicate] yielded `false`. |
| */ |
| public inline fun <T> Iterable<T>.partition(predicate: (T) -> Boolean): Pair<List<T>, List<T>> { |
| val first = ArrayList<T>() |
| val second = ArrayList<T>() |
| for (element in this) { |
| if (predicate(element)) { |
| first.add(element) |
| } else { |
| second.add(element) |
| } |
| } |
| return Pair(first, second) |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then the given [element]. |
| */ |
| public operator fun <T> Collection<T>.plus(element: T): List<T> { |
| val result = ArrayList<T>(size + 1) |
| result.addAll(this) |
| result.add(element) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then the given [element]. |
| */ |
| public operator fun <T> Iterable<T>.plus(element: T): List<T> { |
| if (this is Collection) return this.plus(element) |
| val result = ArrayList<T>() |
| result.addAll(this) |
| result.add(element) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] array. |
| */ |
| public operator fun <T> Collection<T>.plus(elements: Array<out T>): List<T> { |
| val result = ArrayList<T>(this.size + elements.size) |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] array. |
| */ |
| public operator fun <T> Iterable<T>.plus(elements: Array<out T>): List<T> { |
| if (this is Collection) return this.plus(elements) |
| val result = ArrayList<T>() |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] collection. |
| */ |
| public operator fun <T> Collection<T>.plus(elements: Iterable<T>): List<T> { |
| if (elements is Collection) { |
| val result = ArrayList<T>(this.size + elements.size) |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } else { |
| val result = ArrayList<T>(this) |
| result.addAll(elements) |
| return result |
| } |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] collection. |
| */ |
| public operator fun <T> Iterable<T>.plus(elements: Iterable<T>): List<T> { |
| if (this is Collection) return this.plus(elements) |
| val result = ArrayList<T>() |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] sequence. |
| */ |
| public operator fun <T> Collection<T>.plus(elements: Sequence<T>): List<T> { |
| val result = ArrayList<T>(this.size + 10) |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } |
| |
| /** |
| * Returns a list containing all elements of the original collection and then all elements of the given [elements] sequence. |
| */ |
| public operator fun <T> Iterable<T>.plus(elements: Sequence<T>): List<T> { |
| val result = ArrayList<T>() |
| result.addAll(this) |
| result.addAll(elements) |
| return result |
| } |
| |
| /** |
| * Returns a list of pairs built from elements of both collections with same indexes. List has length of shortest collection. |
| */ |
| public infix fun <T, R> Iterable<T>.zip(other: Array<out R>): List<Pair<T, R>> { |
| return zip(other) { t1, t2 -> t1 to t2 } |
| } |
| |
| /** |
| * Returns a list of values built from elements of both collections with same indexes using provided [transform]. List has length of shortest collection. |
| */ |
| public inline fun <T, R, V> Iterable<T>.zip(other: Array<out R>, transform: (T, R) -> V): List<V> { |
| val arraySize = other.size |
| val list = ArrayList<V>(Math.min(collectionSizeOrDefault(10), arraySize)) |
| var i = 0 |
| for (element in this) { |
| if (i >= arraySize) break |
| list.add(transform(element, other[i++])) |
| } |
| return list |
| } |
| |
| /** |
| * Returns a list of pairs built from elements of both collections with same indexes. List has length of shortest collection. |
| */ |
| public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>> { |
| return zip(other) { t1, t2 -> t1 to t2 } |
| } |
| |
| /** |
| * Returns a list of values built from elements of both collections with same indexes using provided [transform]. List has length of shortest collection. |
| */ |
| public inline fun <T, R, V> Iterable<T>.zip(other: Iterable<R>, transform: (T, R) -> V): List<V> { |
| val first = iterator() |
| val second = other.iterator() |
| val list = ArrayList<V>(Math.min(collectionSizeOrDefault(10), other.collectionSizeOrDefault(10))) |
| while (first.hasNext() && second.hasNext()) { |
| list.add(transform(first.next(), second.next())) |
| } |
| return list |
| } |
| |
| /** |
| * Appends the string from all the elements separated using [separator] and using the given [prefix] and [postfix] if supplied. |
| * If the collection could be huge, you can specify a non-negative value of [limit], in which case only the first [limit] |
| * elements will be appended, followed by the [truncated] string (which defaults to "..."). |
| */ |
| 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) { |
| if (transform != null) |
| buffer.append(transform(element)) |
| else |
| buffer.append(if (element == null) "null" else element.toString()) |
| } else break |
| } |
| if (limit >= 0 && count > limit) buffer.append(truncated) |
| buffer.append(postfix) |
| return buffer |
| } |
| |
| @Deprecated("Provided for binary compatibility", level = DeprecationLevel.HIDDEN) |
| public fun <T, A : Appendable> Iterable<T>.joinTo(buffer: A, separator: String = ", ", prefix: String = "", postfix: String = "", limit: Int = -1, truncated: String = "...", transform: ((T) -> String)? = null): A { |
| return joinTo(buffer, separator, prefix, postfix, limit, truncated, transform) |
| } |
| |
| /** |
| * Creates a string from all the elements separated using [separator] and using the given [prefix] and [postfix] if supplied. |
| * If the collection could be huge, you can specify a non-negative value of [limit], in which case only the first [limit] |
| * elements will be appended, followed by the [truncated] string (which defaults to "..."). |
| */ |
| 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() |
| } |
| |
| @Deprecated("Provided for binary compatibility", level = DeprecationLevel.HIDDEN) |
| public fun <T> Iterable<T>.joinToString(separator: String = ", ", prefix: String = "", postfix: String = "", limit: Int = -1, truncated: String = "...", transform: ((T) -> String)? = null): String { |
| return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString() |
| } |
| |
| /** |
| * Returns this collection as an [Iterable]. |
| */ |
| public fun <T> Iterable<T>.asIterable(): Iterable<T> { |
| return this |
| } |
| |
| /** |
| * 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() |
| } |
| } |
| } |
| |
| /** |
| * Returns a list containing all elements that are instances of specified type parameter R. |
| */ |
| @kotlin.jvm.JvmVersion |
| public inline fun <reified R> Iterable<*>.filterIsInstance(): List<@kotlin.internal.NoInfer R> { |
| return filterIsInstanceTo(ArrayList<R>()) |
| } |
| |
| /** |
| * Returns a list containing all elements that are instances of specified class. |
| */ |
| @kotlin.jvm.JvmVersion |
| public fun <R> Iterable<*>.filterIsInstance(klass: Class<R>): List<R> { |
| return filterIsInstanceTo(ArrayList<R>(), klass) |
| } |
| |
| /** |
| * Appends all elements that are instances of specified type parameter R to the given [destination]. |
| */ |
| @kotlin.jvm.JvmVersion |
| public inline fun <reified R, C : MutableCollection<in R>> Iterable<*>.filterIsInstanceTo(destination: C): C { |
| for (element in this) if (element is R) destination.add(element) |
| return destination |
| } |
| |
| /** |
| * Appends all elements that are instances of specified class to the given [destination]. |
| */ |
| @kotlin.jvm.JvmVersion |
| public fun <C : MutableCollection<in R>, R> Iterable<*>.filterIsInstanceTo(destination: C, klass: Class<R>): C { |
| for (element in this) if (klass.isInstance(element)) destination.add(element as R) |
| return destination |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfByte") |
| public fun Iterable<Byte>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfDouble") |
| public fun Iterable<Double>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfFloat") |
| public fun Iterable<Float>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfInt") |
| public fun Iterable<Int>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfLong") |
| public fun Iterable<Long>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns an average value of elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("averageOfShort") |
| public fun Iterable<Short>.average(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| var count: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| count += 1 |
| } |
| return if (count == 0) 0.0 else sum / count |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfByte") |
| public fun Iterable<Byte>.sum(): Int { |
| val iterator = iterator() |
| var sum: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfDouble") |
| public fun Iterable<Double>.sum(): Double { |
| val iterator = iterator() |
| var sum: Double = 0.0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfFloat") |
| public fun Iterable<Float>.sum(): Float { |
| val iterator = iterator() |
| var sum: Float = 0.0f |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfInt") |
| public fun Iterable<Int>.sum(): Int { |
| val iterator = iterator() |
| var sum: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfLong") |
| public fun Iterable<Long>.sum(): Long { |
| val iterator = iterator() |
| var sum: Long = 0L |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |
| /** |
| * Returns the sum of all elements in the collection. |
| */ |
| @kotlin.jvm.JvmName("sumOfShort") |
| public fun Iterable<Short>.sum(): Int { |
| val iterator = iterator() |
| var sum: Int = 0 |
| while (iterator.hasNext()) { |
| sum += iterator.next() |
| } |
| return sum |
| } |
| |