Provide infix compareTo extension for Comparable<T> #KT-46423

This commit is contained in:
Ilya Gorbunov
2021-09-15 05:40:48 +03:00
committed by Space
parent 44e0efc23c
commit 40b5a7d449
7 changed files with 38 additions and 8 deletions
+4
View File
@@ -193,6 +193,10 @@ public inline fun <T> T.also(block: (T) -> kotlin.Unit): T
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> kotlin.Unit): T
@kotlin.internal.InlineOnly
@kotlin.SinceKotlin(version = "1.6")
public inline infix fun <T> kotlin.Comparable<T>.compareTo(other: T): kotlin.Int
@kotlin.SinceKotlin(version = "1.4")
@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class})
@kotlin.internal.InlineOnly
+4
View File
@@ -156,6 +156,10 @@ public inline fun <T> T.also(block: (T) -> kotlin.Unit): T
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> kotlin.Unit): T
@kotlin.internal.InlineOnly
@kotlin.SinceKotlin(version = "1.6")
public inline infix fun <T> kotlin.Comparable<T>.compareTo(other: T): kotlin.Int
@kotlin.SinceKotlin(version = "1.4")
@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class})
@kotlin.internal.InlineOnly
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlin
import kotlin.internal.InlineOnly
/**
* Compares this object with the specified object for order. Returns zero if this object is equal
* to the specified [other] object, a negative number if it's less than [other], or a positive number
* if it's greater than [other].
*
* This function delegates to [Comparable.compareTo] and allows to call it in infix form.
*/
@InlineOnly
@SinceKotlin("1.6")
public inline infix fun <T> Comparable<T>.compareTo(other: T): Int =
this.compareTo(other)
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -2129,7 +2129,7 @@ class ArraysTest {
}
private data class Text(val data: String) : Comparable<Text> {
override fun compareTo(other: Text): Int = data.compareTo(other.data)
override fun compareTo(other: Text): Int = data compareTo other.data
}
private fun testStableSort(stableSort: Array<Text>.() -> Unit, intSort: Array<Int>.() -> Unit) {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -578,13 +578,13 @@ fun <T> Iterator<T>.assertSorted(isInOrder: (T, T) -> Boolean) {
}
data class Sortable<K : Comparable<K>>(val key: K, val index: Int) : Comparable<Sortable<K>> {
override fun compareTo(other: Sortable<K>): Int = this.key.compareTo(other.key)
override fun compareTo(other: Sortable<K>): Int = this.key compareTo other.key
}
fun <K : Comparable<K>> Iterator<Sortable<K>>.assertStableSorted(descending: Boolean = false) {
assertSorted { a, b ->
val relation = a.key.compareTo(b.key)
val relation = a.key compareTo b.key
(if (descending) relation > 0 else relation < 0) || relation == 0 && a.index < b.index
}
}
@@ -28,6 +28,8 @@ class OrderingTest {
fun compareByCompareTo() {
val diff = v1.compareTo(v2)
assertTrue(diff < 0)
val infixDiff = v1 compareTo v2
assertEquals(diff, infixDiff)
}
@Test
@@ -60,7 +62,7 @@ class OrderingTest {
@Test
fun sortComparatorThenComparator() {
val comparator = Comparator<Item> { a, b -> a.name.compareTo(b.name) }.thenComparator { a, b -> a.rating.compareTo(b.rating) }
val comparator = Comparator<Item> { a, b -> a.name compareTo b.name }.thenComparator { a, b -> a.rating compareTo b.rating }
val diff = comparator.compare(v1, v2)
assertTrue(diff > 0)
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -20,7 +20,7 @@ class KotlinVersionTest {
val anotherCurrent = KotlinVersion.CURRENT.run { KotlinVersion(major, minor, patch) }
assertEquals(KotlinVersion.CURRENT, anotherCurrent)
assertEquals(KotlinVersion.CURRENT.hashCode(), anotherCurrent.hashCode())
assertEquals(0, KotlinVersion.CURRENT.compareTo(anotherCurrent))
assertEquals(0, KotlinVersion.CURRENT compareTo anotherCurrent)
}
@Test fun componentValidation() {