standard library: 'maxBy' and 'minBy' functions added (#KT-4267 fixed)

This commit is contained in:
nik
2013-11-30 00:22:40 +04:00
committed by Evgeny Gerashchenko
parent 45e9211943
commit ac6dc9fa54
16 changed files with 654 additions and 0 deletions
+38
View File
@@ -239,6 +239,25 @@ public fun <T: Comparable<T>> Array<out T>.max() : T? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Array<out T>.maxBy(f: (T) -> R) : T? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -252,6 +271,25 @@ public fun <T: Comparable<T>> Array<out T>.min() : T? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Array<out T>.minBy(f: (T) -> R) : T? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -225,6 +225,44 @@ public inline fun <R, C: MutableCollection<in R>> BooleanArray.mapTo(result: C,
return result
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> BooleanArray.maxBy(f: (Boolean) -> R) : Boolean? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> BooleanArray.minBy(f: (Boolean) -> R) : Boolean? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun ByteArray.max() : Byte? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> ByteArray.maxBy(f: (Byte) -> R) : Byte? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun ByteArray.min() : Byte? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> ByteArray.minBy(f: (Byte) -> R) : Byte? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -225,6 +225,44 @@ public inline fun <R, C: MutableCollection<in R>> CharArray.mapTo(result: C, tra
return result
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> CharArray.maxBy(f: (Char) -> R) : Char? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> CharArray.minBy(f: (Char) -> R) : Char? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun DoubleArray.max() : Double? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> DoubleArray.maxBy(f: (Double) -> R) : Double? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun DoubleArray.min() : Double? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> DoubleArray.minBy(f: (Double) -> R) : Double? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun FloatArray.max() : Float? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> FloatArray.maxBy(f: (Float) -> R) : Float? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun FloatArray.min() : Float? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> FloatArray.minBy(f: (Float) -> R) : Float? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun IntArray.max() : Int? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> IntArray.maxBy(f: (Int) -> R) : Int? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun IntArray.min() : Int? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> IntArray.minBy(f: (Int) -> R) : Int? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -225,6 +225,26 @@ public fun <T: Comparable<T>> Iterable<T>.max() : T? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Iterable<T>.maxBy(f: (T) -> R) : T? {
val iterator = iterator()
if (!iterator.hasNext()) return null
var maxElem = iterator.next()
var maxValue = f(maxElem)
while (iterator.hasNext()) {
val e = iterator.next()
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -238,6 +258,26 @@ public fun <T: Comparable<T>> Iterable<T>.min() : T? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Iterable<T>.minBy(f: (T) -> R) : T? {
val iterator = iterator()
if (!iterator.hasNext()) return null
var minElem = iterator.next()
var minValue = f(minElem)
while (iterator.hasNext()) {
val e = iterator.next()
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -225,6 +225,25 @@ public fun <T: Comparable<T>> Iterator<T>.max() : T? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Iterator<T>.maxBy(f: (T) -> R) : T? {
if (!hasNext()) return null
var maxElem = next()
var maxValue = f(maxElem)
while (hasNext()) {
val e = next()
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -238,6 +257,25 @@ public fun <T: Comparable<T>> Iterator<T>.min() : T? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>, T: Any> Iterator<T>.minBy(f: (T) -> R) : T? {
if (!hasNext()) return null
var minElem = next()
var minValue = f(minElem)
while (hasNext()) {
val e = next()
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun LongArray.max() : Long? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> LongArray.maxBy(f: (Long) -> R) : Long? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun LongArray.min() : Long? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> LongArray.minBy(f: (Long) -> R) : Long? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/
@@ -238,6 +238,25 @@ public fun ShortArray.max() : Short? {
return max
}
/**
* Returns the first element yielding the largest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> ShortArray.maxBy(f: (Short) -> R) : Short? {
if (isEmpty()) return null
var maxElem = this[0]
var maxValue = f(maxElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (maxValue < v) {
maxElem = e
maxValue = v
}
}
return maxElem
}
/**
* Returns the smallest element or null if there are no elements
*/
@@ -251,6 +270,25 @@ public fun ShortArray.min() : Short? {
return min
}
/**
* Returns the first element yielding the smallest value of the given function or null if there are no elements
*/
public inline fun <R: Comparable<R>> ShortArray.minBy(f: (Short) -> R) : Short? {
if (size == 0) return null
var minElem = this[0]
var minValue = f(minElem)
for (i in 1..lastIndex) {
val e = this[i]
val v = f(e)
if (minValue > v) {
minElem = e
minValue = v
}
}
return minElem
}
/**
* Partitions this collection into a pair of collections
*/