@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 kotlin.comparisons.* /** * Returns 1st *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun List.component1(): T { return get(0) } /** * Returns 2nd *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun List.component2(): T { return get(1) } /** * Returns 3rd *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun List.component3(): T { return get(2) } /** * Returns 4th *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun List.component4(): T { return get(3) } /** * Returns 5th *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun List.component5(): T { return get(4) } /** * Returns `true` if [element] is found in the collection. */ public operator fun <@kotlin.internal.OnlyInputTypes T> Iterable.contains(element: T): Boolean { if (this is Collection) return contains(element) return indexOf(element) >= 0 } /** * Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this collection. */ public fun Iterable.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. */ @kotlin.internal.InlineOnly public inline fun List.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 Iterable.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. */ @kotlin.internal.InlineOnly public inline fun List.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 Iterable.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. */ @kotlin.internal.InlineOnly public inline fun List.elementAtOrNull(index: Int): T? { return this.getOrNull(index) } /** * Returns the first element matching the given [predicate], or `null` if no such element was found. */ @kotlin.internal.InlineOnly public inline fun Iterable.find(predicate: (T) -> Boolean): T? { return firstOrNull(predicate) } /** * Returns the last element matching the given [predicate], or `null` if no such element was found. */ @kotlin.internal.InlineOnly public inline fun Iterable.findLast(predicate: (T) -> Boolean): T? { return lastOrNull(predicate) } /** * Returns the last element matching the given [predicate], or `null` if no such element was found. */ @kotlin.internal.InlineOnly public inline fun List.findLast(predicate: (T) -> Boolean): T? { return lastOrNull(predicate) } /** * Returns first element. * @throws [NoSuchElementException] if the collection is empty. */ public fun Iterable.first(): T { when (this) { is List -> return this.first() 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 List.first(): T { if (isEmpty()) throw NoSuchElementException("List is empty.") return this[0] } /** * Returns the first element matching the given [predicate]. * @throws [NoSuchElementException] if no such element is found. */ public inline fun Iterable.first(predicate: (T) -> Boolean): T { for (element in this) if (predicate(element)) return element throw NoSuchElementException("Collection contains no element matching the predicate.") } /** * Returns the first element, or `null` if the collection is empty. */ public fun Iterable.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 List.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 Iterable.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. */ @kotlin.internal.InlineOnly public inline fun List.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 List.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.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.indexOf(element: T): Int { return indexOf(element) } /** * Returns index of the first element matching the given [predicate], or -1 if the collection does not contain such element. */ public inline fun Iterable.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 List.indexOfFirst(predicate: (T) -> Boolean): Int { var index = 0 for (item in this) { if (predicate(item)) return index 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 Iterable.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 List.indexOfLast(predicate: (T) -> Boolean): Int { val iterator = this.listIterator(size) while (iterator.hasPrevious()) { if (predicate(iterator.previous())) { return iterator.nextIndex() } } return -1 } /** * Returns the last element. * @throws [NoSuchElementException] if the collection is empty. */ public fun Iterable.last(): T { when (this) { is List -> return this.last() 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 List.last(): T { if (isEmpty()) throw NoSuchElementException("List is empty.") return this[lastIndex] } /** * Returns the last element matching the given [predicate]. * @throws [NoSuchElementException] if no such element is found. */ public inline fun Iterable.last(predicate: (T) -> Boolean): T { var last: T? = null var found = false for (element in this) { if (predicate(element)) { last = element found = true } } if (!found) throw NoSuchElementException("Collection contains no 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 List.last(predicate: (T) -> Boolean): T { val iterator = this.listIterator(size) while (iterator.hasPrevious()) { val element = iterator.previous() if (predicate(element)) return element } throw NoSuchElementException("List contains no 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.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.lastIndexOf(element: T): Int { return lastIndexOf(element) } /** * Returns the last element, or `null` if the collection is empty. */ public fun Iterable.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 List.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 Iterable.lastOrNull(predicate: (T) -> Boolean): T? { 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 List.lastOrNull(predicate: (T) -> Boolean): T? { val iterator = this.listIterator(size) while (iterator.hasPrevious()) { val element = iterator.previous() 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 Iterable.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 } } } /** * Returns the single element, or throws an exception if the list is empty or has more than one element. */ public fun List.single(): T { return when (size) { 0 -> throw NoSuchElementException("List is empty.") 1 -> this[0] else -> throw IllegalArgumentException("List 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 Iterable.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 contains no element matching the predicate.") return single as T } /** * Returns single element, or `null` if the collection is empty or has more than one element. */ public fun Iterable.singleOrNull(): T? { when (this) { is List -> return if (size == 1) this[0] else null else -> { val iterator = iterator() if (!iterator.hasNext()) return null val 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 List.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 Iterable.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 Iterable.drop(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return toList() val list: ArrayList if (this is Collection<*>) { val resultSize = size - n if (resultSize <= 0) return emptyList() if (resultSize == 1) return listOf(last()) list = ArrayList(resultSize) if (this is List) { if (this is RandomAccess) { for (index in n..size - 1) list.add(this[index]) } else { for (item in listIterator(n)) list.add(item) } return list } } else { list = ArrayList() } var count = 0 for (item in this) { if (count++ >= n) list.add(item) } return list.optimizeReadOnlyList() } /** * Returns a list containing all elements except last [n] elements. */ public fun List.dropLast(n: Int): List { 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 List.dropLastWhile(predicate: (T) -> Boolean): List { if (!isEmpty()) { val iterator = listIterator(size) while (iterator.hasPrevious()) { if (!predicate(iterator.previous())) { return take(iterator.nextIndex() + 1) } } } return emptyList() } /** * Returns a list containing all elements except first elements that satisfy the given [predicate]. */ public inline fun Iterable.dropWhile(predicate: (T) -> Boolean): List { var yielding = false val list = ArrayList() 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 Iterable.filter(predicate: (T) -> Boolean): List { return filterTo(ArrayList(), predicate) } /** * Returns a list containing only elements matching the given [predicate]. * @param [predicate] function that takes the index of an element and the element itself * and returns the result of predicate evaluation on the element. */ public inline fun Iterable.filterIndexed(predicate: (Int, T) -> Boolean): List { return filterIndexedTo(ArrayList(), predicate) } /** * Appends all elements matching the given [predicate] to the given [destination]. * @param [predicate] function that takes the index of an element and the element itself * and returns the result of predicate evaluation on the element. */ public inline fun > Iterable.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 that are instances of specified type parameter R. */ public inline fun Iterable<*>.filterIsInstance(): List<@kotlin.internal.NoInfer R> { return filterIsInstanceTo(ArrayList()) } /** * Appends all elements that are instances of specified type parameter R to the given [destination]. */ public inline fun > Iterable<*>.filterIsInstanceTo(destination: C): C { for (element in this) if (element is R) destination.add(element) return destination } /** * Returns a list containing all elements not matching the given [predicate]. */ public inline fun Iterable.filterNot(predicate: (T) -> Boolean): List { return filterNotTo(ArrayList(), predicate) } /** * Returns a list containing all elements that are not `null`. */ public fun Iterable.filterNotNull(): List { return filterNotNullTo(ArrayList()) } /** * Appends all elements that are not `null` to the given [destination]. */ public fun , T : Any> Iterable.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 > Iterable.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 > Iterable.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 List.slice(indices: IntRange): List { if (indices.isEmpty()) return listOf() return this.subList(indices.start, indices.endInclusive + 1).toList() } /** * Returns a list containing elements at specified [indices]. */ public fun List.slice(indices: Iterable): List { val size = indices.collectionSizeOrDefault(10) if (size == 0) return emptyList() val list = ArrayList(size) for (index in indices) { list.add(get(index)) } return list } /** * Returns a list containing first [n] elements. */ public fun Iterable.take(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() if (this is Collection) { if (n >= size) return toList() if (n == 1) return listOf(first()) } var count = 0 val list = ArrayList(n) for (item in this) { if (count++ == n) break list.add(item) } return list.optimizeReadOnlyList() } /** * Returns a list containing last [n] elements. */ public fun List.takeLast(n: Int): List { require(n >= 0) { "Requested element count $n is less than zero." } if (n == 0) return emptyList() val size = size if (n >= size) return toList() if (n == 1) return listOf(last()) val list = ArrayList(n) if (this is RandomAccess) { for (index in size - n .. size - 1) list.add(this[index]) } else { for (item in listIterator(n)) list.add(item) } return list } /** * Returns a list containing last elements satisfying the given [predicate]. */ public inline fun List.takeLastWhile(predicate: (T) -> Boolean): List { if (isEmpty()) return emptyList() val iterator = listIterator(size) while (iterator.hasPrevious()) { if (!predicate(iterator.previous())) { iterator.next() val expectedSize = size - iterator.nextIndex() if (expectedSize == 0) return emptyList() return ArrayList(expectedSize).apply { while (iterator.hasNext()) add(iterator.next()) } } } return toList() } /** * Returns a list containing first elements satisfying the given [predicate]. */ public inline fun Iterable.takeWhile(predicate: (T) -> Boolean): List { val list = ArrayList() for (item in this) { if (!predicate(item)) break list.add(item) } return list } /** * Reverses elements in the list in-place. */ @kotlin.jvm.JvmVersion public fun MutableList.reverse(): Unit { java.util.Collections.reverse(this) } /** * Returns a list with elements in reversed order. */ public fun Iterable.reversed(): List { if (this is Collection && size <= 1) return toList() val list = toMutableList() list.reverse() 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 > MutableList.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 > MutableList.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 > MutableList.sortDescending(): Unit { sortWith(reverseOrder()) } /** * Returns a list of all elements sorted according to their natural sort order. */ public fun > Iterable.sorted(): List { if (this is Collection) { if (size <= 1) return this.toList() @Suppress("UNCHECKED_CAST") return (toTypedArray>() as Array).apply { sort() }.asList() } return toMutableList().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 > Iterable.sortedBy(crossinline selector: (T) -> R?): List { 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 > Iterable.sortedByDescending(crossinline selector: (T) -> R?): List { return sortedWith(compareByDescending(selector)) } /** * Returns a list of all elements sorted descending according to their natural sort order. */ public fun > Iterable.sortedDescending(): List { return sortedWith(reverseOrder()) } /** * Returns a list of all elements sorted according to the specified [comparator]. */ public fun Iterable.sortedWith(comparator: Comparator): List { if (this is Collection) { if (size <= 1) return this.toList() @Suppress("UNCHECKED_CAST") return (toTypedArray() as Array).apply { sortWith(comparator) }.asList() } return toMutableList().apply { sortWith(comparator) } } /** * Returns an array of Boolean containing all of the elements of this collection. */ public fun Collection.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.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.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.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.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.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.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.toShortArray(): ShortArray { val result = ShortArray(size) var index = 0 for (element in this) result[index++] = element return result } /** * 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. * * The returned map preserves the entry iteration order of the original collection. */ public inline fun Iterable.associate(transform: (T) -> Pair): Map { @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") val capacity = mapCapacity(collectionSizeOrDefault(10)).coerceAtLeast(16) return associateTo(LinkedHashMap(capacity), transform) } /** * Returns a [Map] containing the elements from the given collection indexed by the key * returned from [keySelector] function applied to each element. * * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. * * The returned map preserves the entry iteration order of the original collection. */ public inline fun Iterable.associateBy(keySelector: (T) -> K): Map { @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") val capacity = mapCapacity(collectionSizeOrDefault(10)).coerceAtLeast(16) return associateByTo(LinkedHashMap(capacity), keySelector) } /** * Returns a [Map] containing the values provided by [valueTransform] and indexed by [keySelector] functions applied to elements of the given collection. * * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. * * The returned map preserves the entry iteration order of the original collection. */ public inline fun Iterable.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map { @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") val capacity = mapCapacity(collectionSizeOrDefault(10)).coerceAtLeast(16) return associateByTo(LinkedHashMap(capacity), keySelector, valueTransform) } /** * Populates and returns the [destination] mutable map with key-value pairs, * where key is provided by the [keySelector] function applied to each element of the given collection * and value is the element itself. * * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. */ public inline fun > Iterable.associateByTo(destination: M, keySelector: (T) -> K): M { for (element in this) { destination.put(keySelector(element), element) } return destination } /** * Populates and returns the [destination] mutable map with key-value pairs, * where key is provided by the [keySelector] function and * and value is provided by the [valueTransform] function applied to elements of the given collection. * * If any two elements would have the same key returned by [keySelector] the last one gets added to the map. */ public inline fun > Iterable.associateByTo(destination: M, keySelector: (T) -> K, valueTransform: (T) -> V): M { for (element in this) { destination.put(keySelector(element), valueTransform(element)) } return destination } /** * Populates and returns the [destination] mutable map with key-value pairs * provided by [transform] function applied to each element of the given collection. * * If any of two pairs would have the same key the last one gets added to the map. */ public inline fun > Iterable.associateTo(destination: M, transform: (T) -> Pair): M { for (element in this) { destination += transform(element) } return destination } /** * Appends all elements to the given [destination] collection. */ public fun > Iterable.toCollection(destination: C): C { for (item in this) { destination.add(item) } return destination } /** * Returns a [HashSet] of all elements. */ public fun Iterable.toHashSet(): HashSet { return toCollection(HashSet(mapCapacity(collectionSizeOrDefault(12)))) } /** * Returns a [List] containing all elements. */ public fun Iterable.toList(): List { 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() } /** * Returns a [MutableList] filled with all elements of this collection. */ public fun Iterable.toMutableList(): MutableList { if (this is Collection) return this.toMutableList() return toCollection(ArrayList()) } /** * Returns a [MutableList] filled with all elements of this collection. */ public fun Collection.toMutableList(): MutableList { return ArrayList(this) } /** * Returns a [Set] of all elements. * * The returned set preserves the element iteration order of the original collection. */ public fun Iterable.toSet(): Set { if (this is Collection) { return when (size) { 0 -> emptySet() 1 -> setOf(if (this is List) this[0] else iterator().next()) else -> toCollection(LinkedHashSet(mapCapacity(size))) } } return toCollection(LinkedHashSet()).optimizeReadOnlySet() } /** * Returns a [SortedSet] of all elements. */ @kotlin.jvm.JvmVersion public fun > Iterable.toSortedSet(): SortedSet { return toCollection(TreeSet()) } /** * Returns a [SortedSet] of all elements. * * Elements in the set returned are sorted according to the given [comparator]. */ @kotlin.jvm.JvmVersion public fun Iterable.toSortedSet(comparator: Comparator): SortedSet { return toCollection(TreeSet(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 Iterable.flatMap(transform: (T) -> Iterable): List { return flatMapTo(ArrayList(), 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 > Iterable.flatMapTo(destination: C, transform: (T) -> Iterable): C { for (element in this) { val list = transform(element) destination.addAll(list) } return destination } /** * Groups elements of the original collection by the key returned by the given [keySelector] function * applied to each element and returns a map where each group key is associated with a list of corresponding elements. * * The returned map preserves the entry iteration order of the keys produced from the original collection. * * @sample test.collections.CollectionTest.groupBy */ public inline fun Iterable.groupBy(keySelector: (T) -> K): Map> { return groupByTo(LinkedHashMap>(), keySelector) } /** * Groups values returned by the [valueTransform] function applied to each element of the original collection * by the key returned by the given [keySelector] function applied to the element * and returns a map where each group key is associated with a list of corresponding values. * * The returned map preserves the entry iteration order of the keys produced from the original collection. * * @sample test.collections.CollectionTest.groupByKeysAndValues */ public inline fun Iterable.groupBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map> { return groupByTo(LinkedHashMap>(), keySelector, valueTransform) } /** * Groups elements of the original collection by the key returned by the given [keySelector] function * applied to each element and puts to the [destination] map each group key associated with a list of corresponding elements. * * @return The [destination] map. * * @sample test.collections.CollectionTest.groupBy */ public inline fun >> Iterable.groupByTo(destination: M, keySelector: (T) -> K): M { for (element in this) { val key = keySelector(element) val list = destination.getOrPut(key) { ArrayList() } list.add(element) } return destination } /** * Groups values returned by the [valueTransform] function applied to each element of the original collection * by the key returned by the given [keySelector] function applied to the element * and puts to the [destination] map each group key associated with a list of corresponding values. * * @return The [destination] map. * * @sample test.collections.CollectionTest.groupByKeysAndValues */ public inline fun >> Iterable.groupByTo(destination: M, keySelector: (T) -> K, valueTransform: (T) -> V): M { for (element in this) { val key = keySelector(element) val list = destination.getOrPut(key) { ArrayList() } list.add(valueTransform(element)) } return destination } /** * Returns a list containing the results of applying the given [transform] function * to each element in the original collection. */ @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") public inline fun Iterable.map(transform: (T) -> R): List { return mapTo(ArrayList(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. * @param [transform] function that takes the index of an element and the element itself * and returns the result of the transform applied to the element. */ @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") public inline fun Iterable.mapIndexed(transform: (Int, T) -> R): List { return mapIndexedTo(ArrayList(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. * @param [transform] function that takes the index of an element and the element itself * and returns the result of the transform applied to the element. */ public inline fun Iterable.mapIndexedNotNull(transform: (Int, T) -> R?): List { return mapIndexedNotNullTo(ArrayList(), 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]. * @param [transform] function that takes the index of an element and the element itself * and returns the result of the transform applied to the element. */ public inline fun > Iterable.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]. * @param [transform] function that takes the index of an element and the element itself * and returns the result of the transform applied to the element. */ public inline fun > Iterable.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 Iterable.mapNotNull(transform: (T) -> R?): List { return mapNotNullTo(ArrayList(), 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 > Iterable.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 > Iterable.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 Iterable.withIndex(): Iterable> { 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 Iterable.distinct(): List { 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 Iterable.distinctBy(selector: (T) -> K): List { val set = HashSet() val list = ArrayList() 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. * * The returned set preserves the element iteration order of the original collection. */ public infix fun Iterable.intersect(other: Iterable): Set { val set = this.toMutableSet() set.retainAll(other) return set } /** * Returns a set containing all elements that are contained by this collection and not contained by the specified collection. * * The returned set preserves the element iteration order of the original collection. */ public infix fun Iterable.subtract(other: Iterable): Set { val set = this.toMutableSet() set.removeAll(other) return set } /** * Returns a mutable set containing all distinct elements from the given collection. * * The returned set preserves the element iteration order of the original collection. */ public fun Iterable.toMutableSet(): MutableSet { return when (this) { is Collection -> LinkedHashSet(this) else -> toCollection(LinkedHashSet()) } } /** * Returns a set containing all distinct elements from both collections. * * The returned set preserves the element iteration order of the original collection. * Those elements of the [other] collection that are unique are iterated in the end * in the order of the [other] collection. */ public infix fun Iterable.union(other: Iterable): Set { val set = this.toMutableSet() set.addAll(other) return set } /** * Returns `true` if all elements match the given [predicate]. */ public inline fun Iterable.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 Iterable.any(): Boolean { for (element in this) return true return false } /** * Returns `true` if at least one element matches the given [predicate]. */ public inline fun Iterable.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 Iterable.count(): Int { var count = 0 for (element in this) count++ return count } /** * Returns the number of elements in this collection. */ @kotlin.internal.InlineOnly public inline fun Collection.count(): Int { return size } /** * Returns the number of elements matching the given [predicate]. */ public inline fun Iterable.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 Iterable.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 left to right * to current accumulator value and each element with its index in the original collection. * @param [operation] function that takes the index of an element, current accumulator value * and the element itself, and calculates the next accumulator value. */ public inline fun Iterable.foldIndexed(initial: R, operation: (Int, R, T) -> R): R { var index = 0 var accumulator = initial for (element in this) accumulator = operation(index++, 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 List.foldRight(initial: R, operation: (T, R) -> R): R { var accumulator = initial if (!isEmpty()) { val iterator = listIterator(size) while (iterator.hasPrevious()) { accumulator = operation(iterator.previous(), accumulator) } } return accumulator } /** * Accumulates value starting with [initial] value and applying [operation] from right to left * to each element with its index in the original list and current accumulator value. * @param [operation] function that takes the index of an element, the element itself * and current accumulator value, and calculates the next accumulator value. */ public inline fun List.foldRightIndexed(initial: R, operation: (Int, T, R) -> R): R { var accumulator = initial if (!isEmpty()) { val iterator = listIterator(size) while (iterator.hasPrevious()) { val index = iterator.previousIndex() accumulator = operation(index, iterator.previous(), accumulator) } } return accumulator } /** * Performs the given [action] on each element. */ @kotlin.internal.HidesMembers public inline fun Iterable.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) } /** * Performs the given [action] on each element, providing sequential index with the element. * @param [action] function that takes the index of an element and the element itself * and performs the desired action on the element. */ public inline fun Iterable.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 > Iterable.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 > Iterable.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 Iterable.maxWith(comparator: Comparator): 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 > Iterable.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 > Iterable.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 Iterable.minWith(comparator: Comparator): 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 Iterable.none(): Boolean { for (element in this) return false return true } /** * Returns `true` if no elements match the given [predicate]. */ public inline fun Iterable.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 Iterable.reduce(operation: (S, T) -> S): S { val iterator = this.iterator() if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.") var accumulator: S = iterator.next() while (iterator.hasNext()) { accumulator = operation(accumulator, iterator.next()) } return accumulator } /** * Accumulates value starting with the first element and applying [operation] from left to right * to current accumulator value and each element with its index in the original collection. * @param [operation] function that takes the index of an element, current accumulator value * and the element itself and calculates the next accumulator value. */ public inline fun Iterable.reduceIndexed(operation: (Int, S, T) -> S): S { val iterator = this.iterator() if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.") var index = 1 var accumulator: S = iterator.next() while (iterator.hasNext()) { accumulator = operation(index++, 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 List.reduceRight(operation: (T, S) -> S): S { val iterator = listIterator(size) if (!iterator.hasPrevious()) throw UnsupportedOperationException("Empty list can't be reduced.") var accumulator: S = iterator.previous() while (iterator.hasPrevious()) { accumulator = operation(iterator.previous(), accumulator) } return accumulator } /** * Accumulates value starting with last element and applying [operation] from right to left * to each element with its index in the original list and current accumulator value. * @param [operation] function that takes the index of an element, the element itself * and current accumulator value, and calculates the next accumulator value. */ public inline fun List.reduceRightIndexed(operation: (Int, T, S) -> S): S { val iterator = listIterator(size) if (!iterator.hasPrevious()) throw UnsupportedOperationException("Empty list can't be reduced.") var accumulator: S = iterator.previous() while (iterator.hasPrevious()) { val index = iterator.previousIndex() accumulator = operation(index, iterator.previous(), accumulator) } return accumulator } /** * Returns the sum of all values produced by [selector] function applied to each element in the collection. */ public inline fun Iterable.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 Iterable.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 Iterable.requireNoNulls(): Iterable { for (element in this) { if (element == null) { throw IllegalArgumentException("null element found in $this.") } } @Suppress("UNCHECKED_CAST") return this as Iterable } /** * Returns an original collection containing all the non-`null` elements, throwing an [IllegalArgumentException] if there are any `null` elements. */ public fun List.requireNoNulls(): List { for (element in this) { if (element == null) { throw IllegalArgumentException("null element found in $this.") } } @Suppress("UNCHECKED_CAST") return this as List } /** * Returns a list containing all elements of the original collection without the first occurrence of the given [element]. */ public operator fun Iterable.minus(element: T): List { val result = ArrayList(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 Iterable.minus(elements: Array): List { 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 Iterable.minus(elements: Iterable): List { 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 Iterable.minus(elements: Sequence): List { val other = elements.toHashSet() if (other.isEmpty()) return this.toList() return this.filterNot { it in other } } /** * Returns a list containing all elements of the original collection without the first occurrence of the given [element]. */ @kotlin.internal.InlineOnly public inline fun Iterable.minusElement(element: T): List { return minus(element) } /** * 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 Iterable.partition(predicate: (T) -> Boolean): Pair, List> { val first = ArrayList() val second = ArrayList() 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 Iterable.plus(element: T): List { if (this is Collection) return this.plus(element) val result = ArrayList() 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 Collection.plus(element: T): List { val result = ArrayList(size + 1) 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 Iterable.plus(elements: Array): List { if (this is Collection) return this.plus(elements) val result = ArrayList() 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 Collection.plus(elements: Array): List { val result = ArrayList(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] collection. */ public operator fun Iterable.plus(elements: Iterable): List { if (this is Collection) return this.plus(elements) val result = ArrayList() 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 Collection.plus(elements: Iterable): List { if (elements is Collection) { val result = ArrayList(this.size + elements.size) result.addAll(this) result.addAll(elements) return result } else { val result = ArrayList(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 Iterable.plus(elements: Sequence): List { val result = ArrayList() 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 Collection.plus(elements: Sequence): List { val result = ArrayList(this.size + 10) result.addAll(this) result.addAll(elements) return result } /** * Returns a list containing all elements of the original collection and then the given [element]. */ @kotlin.internal.InlineOnly public inline fun Iterable.plusElement(element: T): List { return plus(element) } /** * Returns a list containing all elements of the original collection and then the given [element]. */ @kotlin.internal.InlineOnly public inline fun Collection.plusElement(element: T): List { return plus(element) } /** * Returns a list of pairs built from elements of both collections with same indexes. List has length of shortest collection. */ public infix fun Iterable.zip(other: Array): List> { 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 Iterable.zip(other: Array, transform: (T, R) -> V): List { val arraySize = other.size @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") val list = ArrayList(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 Iterable.zip(other: Iterable): List> { 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 Iterable.zip(other: Iterable, transform: (T, R) -> V): List { val first = iterator() val second = other.iterator() @Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") val list = ArrayList(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 Iterable.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 } /** * 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 Iterable.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() } /** * Returns this collection as an [Iterable]. */ @kotlin.internal.InlineOnly public inline fun Iterable.asIterable(): Iterable { return this } /** * Creates a [Sequence] instance that wraps the original collection returning its elements when being iterated. */ public fun Iterable.asSequence(): Sequence { return Sequence { this.iterator() } } /** * Returns a list containing all elements that are instances of specified class. */ @kotlin.jvm.JvmVersion public fun Iterable<*>.filterIsInstance(klass: Class): List { return filterIsInstanceTo(ArrayList(), klass) } /** * Appends all elements that are instances of specified class to the given [destination]. */ @kotlin.jvm.JvmVersion public fun , R> Iterable<*>.filterIsInstanceTo(destination: C, klass: Class): C { @Suppress("UNCHECKED_CAST") 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.average(): Double { var sum: Double = 0.0 var count: Int = 0 for (element in this) { sum += element 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.sum(): Int { var sum: Int = 0 for (element in this) { sum += element } return sum } /** * Returns the sum of all elements in the collection. */ @kotlin.jvm.JvmName("sumOfShort") public fun Iterable.sum(): Int { var sum: Int = 0 for (element in this) { sum += element } return sum } /** * Returns the sum of all elements in the collection. */ @kotlin.jvm.JvmName("sumOfInt") public fun Iterable.sum(): Int { var sum: Int = 0 for (element in this) { sum += element } return sum } /** * Returns the sum of all elements in the collection. */ @kotlin.jvm.JvmName("sumOfLong") public fun Iterable.sum(): Long { var sum: Long = 0L for (element in this) { sum += element } return sum } /** * Returns the sum of all elements in the collection. */ @kotlin.jvm.JvmName("sumOfFloat") public fun Iterable.sum(): Float { var sum: Float = 0.0f for (element in this) { sum += element } return sum } /** * Returns the sum of all elements in the collection. */ @kotlin.jvm.JvmName("sumOfDouble") public fun Iterable.sum(): Double { var sum: Double = 0.0 for (element in this) { sum += element } return sum }