Introduce minOrNull and maxOrNull extension functions #KT-39064

This commit is contained in:
Abduqodiri Qurbonzoda
2020-05-20 04:56:52 +03:00
parent a8cd8ad8f8
commit 846a7823ad
14 changed files with 928 additions and 612 deletions
@@ -1393,6 +1393,16 @@ public final class kotlin/collections/ArraysKt {
public static final fun maxBy ([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun maxBy ([SLkotlin/jvm/functions/Function1;)Ljava/lang/Short;
public static final fun maxBy ([ZLkotlin/jvm/functions/Function1;)Ljava/lang/Boolean;
public static final fun maxOrNull ([B)Ljava/lang/Byte;
public static final fun maxOrNull ([C)Ljava/lang/Character;
public static final fun maxOrNull ([D)Ljava/lang/Double;
public static final fun maxOrNull ([F)Ljava/lang/Float;
public static final fun maxOrNull ([I)Ljava/lang/Integer;
public static final fun maxOrNull ([J)Ljava/lang/Long;
public static final fun maxOrNull ([Ljava/lang/Comparable;)Ljava/lang/Comparable;
public static final fun maxOrNull ([Ljava/lang/Double;)Ljava/lang/Double;
public static final fun maxOrNull ([Ljava/lang/Float;)Ljava/lang/Float;
public static final fun maxOrNull ([S)Ljava/lang/Short;
public static final fun maxWith ([BLjava/util/Comparator;)Ljava/lang/Byte;
public static final fun maxWith ([CLjava/util/Comparator;)Ljava/lang/Character;
public static final fun maxWith ([DLjava/util/Comparator;)Ljava/lang/Double;
@@ -1421,6 +1431,16 @@ public final class kotlin/collections/ArraysKt {
public static final fun minBy ([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun minBy ([SLkotlin/jvm/functions/Function1;)Ljava/lang/Short;
public static final fun minBy ([ZLkotlin/jvm/functions/Function1;)Ljava/lang/Boolean;
public static final fun minOrNull ([B)Ljava/lang/Byte;
public static final fun minOrNull ([C)Ljava/lang/Character;
public static final fun minOrNull ([D)Ljava/lang/Double;
public static final fun minOrNull ([F)Ljava/lang/Float;
public static final fun minOrNull ([I)Ljava/lang/Integer;
public static final fun minOrNull ([J)Ljava/lang/Long;
public static final fun minOrNull ([Ljava/lang/Comparable;)Ljava/lang/Comparable;
public static final fun minOrNull ([Ljava/lang/Double;)Ljava/lang/Double;
public static final fun minOrNull ([Ljava/lang/Float;)Ljava/lang/Float;
public static final fun minOrNull ([S)Ljava/lang/Short;
public static final fun minWith ([BLjava/util/Comparator;)Ljava/lang/Byte;
public static final fun minWith ([CLjava/util/Comparator;)Ljava/lang/Character;
public static final fun minWith ([DLjava/util/Comparator;)Ljava/lang/Double;
@@ -2195,11 +2215,17 @@ public final class kotlin/collections/CollectionsKt {
public static final fun max (Ljava/lang/Iterable;)Ljava/lang/Double;
public static final fun max (Ljava/lang/Iterable;)Ljava/lang/Float;
public static final fun maxBy (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun maxOrNull (Ljava/lang/Iterable;)Ljava/lang/Comparable;
public static final fun maxOrNull (Ljava/lang/Iterable;)Ljava/lang/Double;
public static final fun maxOrNull (Ljava/lang/Iterable;)Ljava/lang/Float;
public static final fun maxWith (Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/lang/Object;
public static final fun min (Ljava/lang/Iterable;)Ljava/lang/Comparable;
public static final fun min (Ljava/lang/Iterable;)Ljava/lang/Double;
public static final fun min (Ljava/lang/Iterable;)Ljava/lang/Float;
public static final fun minBy (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun minOrNull (Ljava/lang/Iterable;)Ljava/lang/Comparable;
public static final fun minOrNull (Ljava/lang/Iterable;)Ljava/lang/Double;
public static final fun minOrNull (Ljava/lang/Iterable;)Ljava/lang/Float;
public static final fun minWith (Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/lang/Object;
public static final fun minus (Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/List;
public static final fun minus (Ljava/lang/Iterable;Ljava/lang/Object;)Ljava/util/List;
@@ -2615,6 +2641,10 @@ public final class kotlin/collections/unsigned/UArraysKt {
public static final fun max-GBYM_sE ([B)Lkotlin/UByte;
public static final fun max-QwZRm1k ([J)Lkotlin/ULong;
public static final fun max-rL5Bavg ([S)Lkotlin/UShort;
public static final fun maxOrNull--ajY-9A ([I)Lkotlin/UInt;
public static final fun maxOrNull-GBYM_sE ([B)Lkotlin/UByte;
public static final fun maxOrNull-QwZRm1k ([J)Lkotlin/ULong;
public static final fun maxOrNull-rL5Bavg ([S)Lkotlin/UShort;
public static final fun maxWith-XMRcp5o ([BLjava/util/Comparator;)Lkotlin/UByte;
public static final fun maxWith-YmdZ_VM ([ILjava/util/Comparator;)Lkotlin/UInt;
public static final fun maxWith-eOHTfZs ([SLjava/util/Comparator;)Lkotlin/UShort;
@@ -2623,6 +2653,10 @@ public final class kotlin/collections/unsigned/UArraysKt {
public static final fun min-GBYM_sE ([B)Lkotlin/UByte;
public static final fun min-QwZRm1k ([J)Lkotlin/ULong;
public static final fun min-rL5Bavg ([S)Lkotlin/UShort;
public static final fun minOrNull--ajY-9A ([I)Lkotlin/UInt;
public static final fun minOrNull-GBYM_sE ([B)Lkotlin/UByte;
public static final fun minOrNull-QwZRm1k ([J)Lkotlin/ULong;
public static final fun minOrNull-rL5Bavg ([S)Lkotlin/UShort;
public static final fun minWith-XMRcp5o ([BLjava/util/Comparator;)Lkotlin/UByte;
public static final fun minWith-YmdZ_VM ([ILjava/util/Comparator;)Lkotlin/UInt;
public static final fun minWith-eOHTfZs ([SLjava/util/Comparator;)Lkotlin/UShort;
@@ -4838,11 +4872,17 @@ public final class kotlin/sequences/SequencesKt {
public static final fun max (Lkotlin/sequences/Sequence;)Ljava/lang/Double;
public static final fun max (Lkotlin/sequences/Sequence;)Ljava/lang/Float;
public static final fun maxBy (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun maxOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Comparable;
public static final fun maxOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Double;
public static final fun maxOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Float;
public static final fun maxWith (Lkotlin/sequences/Sequence;Ljava/util/Comparator;)Ljava/lang/Object;
public static final fun min (Lkotlin/sequences/Sequence;)Ljava/lang/Comparable;
public static final fun min (Lkotlin/sequences/Sequence;)Ljava/lang/Double;
public static final fun min (Lkotlin/sequences/Sequence;)Ljava/lang/Float;
public static final fun minBy (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun minOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Comparable;
public static final fun minOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Double;
public static final fun minOrNull (Lkotlin/sequences/Sequence;)Ljava/lang/Float;
public static final fun minWith (Lkotlin/sequences/Sequence;Ljava/util/Comparator;)Ljava/lang/Object;
public static final fun minus (Lkotlin/sequences/Sequence;Ljava/lang/Iterable;)Lkotlin/sequences/Sequence;
public static final fun minus (Lkotlin/sequences/Sequence;Ljava/lang/Object;)Lkotlin/sequences/Sequence;
@@ -5241,9 +5281,11 @@ public final class kotlin/text/StringsKt {
public static final fun mapTo (Ljava/lang/CharSequence;Ljava/util/Collection;Lkotlin/jvm/functions/Function1;)Ljava/util/Collection;
public static final fun max (Ljava/lang/CharSequence;)Ljava/lang/Character;
public static final fun maxBy (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Character;
public static final fun maxOrNull (Ljava/lang/CharSequence;)Ljava/lang/Character;
public static final fun maxWith (Ljava/lang/CharSequence;Ljava/util/Comparator;)Ljava/lang/Character;
public static final fun min (Ljava/lang/CharSequence;)Ljava/lang/Character;
public static final fun minBy (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Character;
public static final fun minOrNull (Ljava/lang/CharSequence;)Ljava/lang/Character;
public static final fun minWith (Ljava/lang/CharSequence;Ljava/util/Comparator;)Ljava/lang/Character;
public static final fun none (Ljava/lang/CharSequence;)Z
public static final fun none (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Z
@@ -306,11 +306,11 @@ object Aggregates : TemplateGroupBase() {
}
val f_minMax = run {
val f_minMax = sequence {
val genericSpecializations = PrimitiveType.floatingPointPrimitives + setOf(null)
listOf("min", "max").map { op ->
fn("$op()") {
fun def(op: String, nullable: Boolean, orNull: String = "OrNull".ifOrEmpty(nullable)) =
fn("$op$orNull()") {
include(Iterables, genericSpecializations)
include(Sequences, genericSpecializations)
include(ArraysOfObjects, genericSpecializations)
@@ -318,19 +318,30 @@ object Aggregates : TemplateGroupBase() {
include(ArraysOfUnsigned)
include(CharSequences)
} builder {
val isFloat = primitive?.isFloatingPoint() == true
val isGeneric = f in listOf(Iterables, Sequences, ArraysOfObjects)
typeParam("T : Comparable<T>")
if (primitive != null) {
if (isFloat && isGeneric)
returns("T?")
val isFloat = primitive?.isFloatingPoint() == true
if (!nullable) {
deprecate(Deprecation("Use ${op}OrNull instead.", "${op}OrNull()", DeprecationLevel.WARNING))
val isGeneric = f in listOf(Iterables, Sequences, ArraysOfObjects)
if (isFloat && isGeneric) {
since("1.1")
}
body { "return ${op}OrNull()" }
return@builder
}
since("1.4")
doc {
"Returns the ${if (op == "max") "largest" else "smallest"} ${f.element} or `null` if there are no ${f.element.pluralize()}." +
if (isFloat) "\n\n" + "If any of ${f.element.pluralize()} is `NaN` returns `NaN`." else ""
}
returns("T?")
val acc = op
val cmpBlock = if (isFloat)
@@ -361,7 +372,10 @@ object Aggregates : TemplateGroupBase() {
"""
}
}
}
for (op in listOf("min", "max"))
for (nullable in listOf(false, true))
yield(def(op, nullable))
}
val f_minBy = fn("minBy(selector: (T) -> R)") {