diff --git a/libraries/stdlib/src/generated/_Numeric.kt b/libraries/stdlib/src/generated/_Numeric.kt index be4631c6a35..40bd9d35c4f 100644 --- a/libraries/stdlib/src/generated/_Numeric.kt +++ b/libraries/stdlib/src/generated/_Numeric.kt @@ -10,6 +10,462 @@ import java.util.* import java.util.Collections // TODO: it's temporary while we have java.util.Collections in js +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfInt") +public fun Iterable.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 + */ +platformName("averageOfInt") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfInt") +public fun Stream.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 + */ +platformName("averageOfInt") +public fun Array.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 + */ +public fun IntArray.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 + */ +platformName("averageOfLong") +public fun Iterable.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 + */ +platformName("averageOfLong") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfLong") +public fun Stream.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 + */ +platformName("averageOfLong") +public fun Array.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 + */ +public fun LongArray.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 + */ +platformName("averageOfByte") +public fun Iterable.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 + */ +platformName("averageOfByte") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfByte") +public fun Stream.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 + */ +platformName("averageOfByte") +public fun Array.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 + */ +public fun ByteArray.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 + */ +platformName("averageOfShort") +public fun Iterable.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 + */ +platformName("averageOfShort") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfShort") +public fun Stream.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 + */ +platformName("averageOfShort") +public fun Array.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 + */ +public fun ShortArray.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 + */ +platformName("averageOfDouble") +public fun Iterable.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 + */ +platformName("averageOfDouble") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfDouble") +public fun Stream.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 + */ +platformName("averageOfDouble") +public fun Array.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 + */ +public fun DoubleArray.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 + */ +platformName("averageOfFloat") +public fun Iterable.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 + */ +platformName("averageOfFloat") +public fun Sequence.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 +} + + +deprecated("Migrate to using Sequence and respective functions") +/** + * Returns an average value of elements in the collection + */ +platformName("averageOfFloat") +public fun Stream.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 + */ +platformName("averageOfFloat") +public fun Array.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 + */ +public fun FloatArray.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. */ diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt index f0b6b0ad360..f9a13f53784 100644 --- a/libraries/stdlib/test/collections/ArraysTest.kt +++ b/libraries/stdlib/test/collections/ArraysTest.kt @@ -160,6 +160,17 @@ class ArraysTest { expect(3.0.toFloat()) { arrayOf(1.0.toFloat(), 2.0.toFloat()).sum() } } + test fun average() { + expect(0.0) { array().average() } + expect(3.8) { array(1, 2, 5, 8, 3).average() } + expect(2.1) { array(1.6, 2.6, 3.6, 0.6).average() } + expect(100.0) { array(100, 100, 100, 100, 100, 100).average() } + expect(0) { array(1, -1, 2, -2, 3, -3).average().toShort() } + // TODO: Property based tests + // for each arr with size 1 arr.average() == arr[0] + // for each arr with size > 0 arr.average() = arr.sum().toDouble() / arr.size() + } + test fun indexOf() { expect(-1) { arrayOf("cat", "dog", "bird").indexOf("mouse") } expect(0) { arrayOf("cat", "dog", "bird").indexOf("cat") } diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt index cc81d2b1cd8..cbbbf17a814 100644 --- a/libraries/stdlib/test/collections/CollectionTest.kt +++ b/libraries/stdlib/test/collections/CollectionTest.kt @@ -438,6 +438,16 @@ class CollectionTest { expect(3.0.toFloat()) { sequenceOf(1.0.toFloat(), 2.0.toFloat()).sum() } } + test fun average() { + expect(0.0) { arrayListOf().average() } + expect(3.8) { listOf(1, 2, 5, 8, 3).average() } + expect(2.1) { sequenceOf(1.6, 2.6, 3.6, 0.6).average() } + expect(100.0) { arrayListOf(100, 100, 100, 100, 100, 100).average() } + val n = 100 + val range = 0..n + expect(n.toDouble()/2) { range.average() } + } + test fun takeReturnsFirstNElements() { expect(listOf(1, 2, 3, 4, 5)) { (1..10) take 5 } expect(listOf(1, 2, 3, 4, 5)) { (1..10).toList().take(5) } diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Numeric.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Numeric.kt index 4b6dc6ceec2..f3e33e23f6f 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Numeric.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Numeric.kt @@ -21,5 +21,23 @@ fun numeric(): List { } } + templates add f("average()") { + exclude(Strings) + doc { "Returns an average value of elements in the collection"} + returns("Double") + body { + """ + 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 + """ + } + } + return templates }