diff --git a/libraries/stdlib/src/kotlin/util/Ordering.kt b/libraries/stdlib/src/kotlin/util/Ordering.kt index b7d0ab3c2ff..1eb2443cca1 100644 --- a/libraries/stdlib/src/kotlin/util/Ordering.kt +++ b/libraries/stdlib/src/kotlin/util/Ordering.kt @@ -315,4 +315,15 @@ public fun > nullsLast(): Comparator { return a.compareTo(b) } } -} \ No newline at end of file +} + +/** Returns a comparator that imposes the reverse ordering of this comparator. */ +public fun Comparator.reversed(): Comparator = when (this) { + is ReversedComparator -> this.comparator + else -> ReversedComparator(this) +} + + +private class ReversedComparator(public val comparator: Comparator): Comparator { + override fun compare(a: T, b: T): Int = comparator.compare(b, a) +} diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt index ed7a558b3da..c6bf8ce019c 100644 --- a/libraries/stdlib/test/collections/CollectionTest.kt +++ b/libraries/stdlib/test/collections/CollectionTest.kt @@ -589,7 +589,12 @@ class CollectionTest { } test fun sortedWith() { - expect(listOf("BAD", "dad", "cat")) { listOf("cat", "dad", "BAD").sortedWith(compareBy { it.toUpperCase().reverse() }) } + val comparator = compareBy { it.toUpperCase().reverse() } + val data = listOf("cat", "dad", "BAD") + + expect(listOf("BAD", "dad", "cat")) { data.sortedWith(comparator) } + expect(listOf("cat", "dad", "BAD")) { data.sortedWith(comparator.reversed()) } + expect(listOf("BAD", "dad", "cat")) { data.sortedWith(comparator.reversed().reversed()) } } test fun decomposeFirst() {