Skip to content

Commit 2500a18

Browse files
committed
Refactor: use sam-like constructor for comparators
1 parent ddf6599 commit 2500a18

File tree

1 file changed

+46
-83
lines changed

1 file changed

+46
-83
lines changed

libraries/stdlib/src/kotlin/comparisons/Comparisons.kt

Lines changed: 46 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ public fun <T : Comparable<*>> compareValues(a: T?, b: T?): Int {
8989
*/
9090
public fun <T> compareBy(vararg selectors: (T) -> Comparable<*>?): Comparator<T> {
9191
require(selectors.size > 0)
92-
return object : Comparator<T> {
93-
public override fun compare(a: T, b: T): Int = compareValuesByImpl(a, b, selectors)
94-
}
92+
return Comparator { a, b -> compareValuesByImpl(a, b, selectors) }
9593
}
9694

9795

@@ -100,32 +98,23 @@ public fun <T> compareBy(vararg selectors: (T) -> Comparable<*>?): Comparator<T>
10098
* Creates a comparator using the function to transform value to a [Comparable] instance for comparison.
10199
*/
102100
@kotlin.internal.InlineOnly
103-
public inline fun <T> compareBy(crossinline selector: (T) -> Comparable<*>?): Comparator<T> {
104-
return object : Comparator<T> {
105-
public override fun compare(a: T, b: T): Int = compareValuesBy(a, b, selector)
106-
}
107-
}
101+
public inline fun <T> compareBy(crossinline selector: (T) -> Comparable<*>?): Comparator<T> =
102+
Comparator { a, b -> compareValuesBy(a, b, selector) }
108103

109104
/**
110105
* Creates a comparator using the [selector] function to transform values being compared and then applying
111106
* the specified [comparator] to compare transformed values.
112107
*/
113108
@kotlin.internal.InlineOnly
114-
public inline fun <T, K> compareBy(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> {
115-
return object : Comparator<T> {
116-
public override fun compare(a: T, b: T): Int = compareValuesBy(a, b, comparator, selector)
117-
}
118-
}
109+
public inline fun <T, K> compareBy(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> =
110+
Comparator { a, b -> compareValuesBy(a, b, comparator, selector) }
119111

120112
/**
121113
* Creates a descending comparator using the function to transform value to a [Comparable] instance for comparison.
122114
*/
123115
@kotlin.internal.InlineOnly
124-
public inline fun <T> compareByDescending(crossinline selector: (T) -> Comparable<*>?): Comparator<T> {
125-
return object : Comparator<T> {
126-
public override fun compare(a: T, b: T): Int = compareValuesBy(b, a, selector)
127-
}
128-
}
116+
public inline fun <T> compareByDescending(crossinline selector: (T) -> Comparable<*>?): Comparator<T> =
117+
Comparator { a, b -> compareValuesBy(b, a, selector) }
129118

130119
/**
131120
* Creates a descending comparator using the [selector] function to transform values being compared and then applying
@@ -134,123 +123,98 @@ public inline fun <T> compareByDescending(crossinline selector: (T) -> Comparabl
134123
* Note that an order of [comparator] is reversed by this wrapper.
135124
*/
136125
@kotlin.internal.InlineOnly
137-
public inline fun <T, K> compareByDescending(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> {
138-
return object : Comparator<T> {
139-
public override fun compare(a: T, b: T): Int = compareValuesBy(b, a, comparator, selector)
140-
}
141-
}
126+
public inline fun <T, K> compareByDescending(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> =
127+
Comparator { a, b -> compareValuesBy(b, a, comparator, selector) }
142128

143129
/**
144130
* Creates a comparator comparing values after the primary comparator defined them equal. It uses
145131
* the function to transform value to a [Comparable] instance for comparison.
146132
*/
147133
@kotlin.internal.InlineOnly
148-
public inline fun <T> Comparator<T>.thenBy(crossinline selector: (T) -> Comparable<*>?): Comparator<T> {
149-
return object : Comparator<T> {
150-
public override fun compare(a: T, b: T): Int {
134+
public inline fun <T> Comparator<T>.thenBy(crossinline selector: (T) -> Comparable<*>?): Comparator<T> =
135+
Comparator { a, b ->
151136
val previousCompare = this@thenBy.compare(a, b)
152-
return if (previousCompare != 0) previousCompare else compareValuesBy(a, b, selector)
137+
if (previousCompare != 0) previousCompare else compareValuesBy(a, b, selector)
153138
}
154-
}
155-
}
156139

157140
/**
158141
* Creates a comparator comparing values after the primary comparator defined them equal. It uses
159142
* the [selector] function to transform values and then compares them with the given [comparator].
160143
*/
161144
@kotlin.internal.InlineOnly
162-
public inline fun <T, K> Comparator<T>.thenBy(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> {
163-
return object : Comparator<T> {
164-
public override fun compare(a: T, b: T): Int {
145+
public inline fun <T, K> Comparator<T>.thenBy(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> =
146+
Comparator { a, b ->
165147
val previousCompare = this@thenBy.compare(a, b)
166-
return if (previousCompare != 0) previousCompare else compareValuesBy(a, b, comparator, selector)
148+
if (previousCompare != 0) previousCompare else compareValuesBy(a, b, comparator, selector)
167149
}
168-
}
169-
}
170150

171151
/**
172152
* Creates a descending comparator using the primary comparator and
173153
* the function to transform value to a [Comparable] instance for comparison.
174154
*/
175155
@kotlin.internal.InlineOnly
176-
public inline fun <T> Comparator<T>.thenByDescending(crossinline selector: (T) -> Comparable<*>?): Comparator<T> {
177-
return object : Comparator<T> {
178-
public override fun compare(a: T, b: T): Int {
156+
public inline fun <T> Comparator<T>.thenByDescending(crossinline selector: (T) -> Comparable<*>?): Comparator<T> =
157+
Comparator { a, b ->
179158
val previousCompare = this@thenByDescending.compare(a, b)
180-
return if (previousCompare != 0) previousCompare else compareValuesBy(b, a, selector)
159+
if (previousCompare != 0) previousCompare else compareValuesBy(b, a, selector)
181160
}
182-
}
183-
}
184161

185162
/**
186163
* Creates a descending comparator comparing values after the primary comparator defined them equal. It uses
187164
* the [selector] function to transform values and then compares them with the given [comparator].
188165
*/
189166
@kotlin.internal.InlineOnly
190-
public inline fun <T, K> Comparator<T>.thenByDescending(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> {
191-
return object : Comparator<T> {
192-
public override fun compare(a: T, b: T): Int {
167+
public inline fun <T, K> Comparator<T>.thenByDescending(comparator: Comparator<in K>, crossinline selector: (T) -> K): Comparator<T> =
168+
Comparator { a, b ->
193169
val previousCompare = this@thenByDescending.compare(a, b)
194-
return if (previousCompare != 0) previousCompare else compareValuesBy(b, a, comparator, selector)
170+
if (previousCompare != 0) previousCompare else compareValuesBy(b, a, comparator, selector)
195171
}
196-
}
197-
}
198172

199173

200174
/**
201175
* Creates a comparator using the primary comparator and function to calculate a result of comparison.
202176
*/
203177
@kotlin.internal.InlineOnly
204-
public inline fun <T> Comparator<T>.thenComparator(crossinline comparison: (a: T, b: T) -> Int): Comparator<T> {
205-
return object : Comparator<T> {
206-
public override fun compare(a: T, b: T): Int {
178+
public inline fun <T> Comparator<T>.thenComparator(crossinline comparison: (a: T, b: T) -> Int): Comparator<T> =
179+
Comparator { a, b ->
207180
val previousCompare = this@thenComparator.compare(a, b)
208-
return if (previousCompare != 0) previousCompare else comparison(a, b)
181+
if (previousCompare != 0) previousCompare else comparison(a, b)
209182
}
210-
}
211-
}
212183

213184
/**
214185
* Combines this comparator and the given [comparator] such that the latter is applied only
215186
* when the former considered values equal.
216187
*/
217-
public infix fun <T> Comparator<T>.then(comparator: Comparator<in T>): Comparator<T> {
218-
return object : Comparator<T> {
219-
public override fun compare(a: T, b: T): Int {
188+
public infix fun <T> Comparator<T>.then(comparator: Comparator<in T>): Comparator<T> =
189+
Comparator { a, b ->
220190
val previousCompare = this@then.compare(a, b)
221-
return if (previousCompare != 0) previousCompare else comparator.compare(a, b)
191+
if (previousCompare != 0) previousCompare else comparator.compare(a, b)
222192
}
223-
}
224-
}
225193

226194
/**
227195
* Combines this comparator and the given [comparator] such that the latter is applied only
228196
* when the former considered values equal.
229197
*/
230-
public infix fun <T> Comparator<T>.thenDescending(comparator: Comparator<in T>): Comparator<T> {
231-
return object : Comparator<T> {
232-
public override fun compare(a: T, b: T): Int {
198+
public infix fun <T> Comparator<T>.thenDescending(comparator: Comparator<in T>): Comparator<T> =
199+
Comparator<T> { a, b ->
233200
val previousCompare = this@thenDescending.compare(a, b)
234-
return if (previousCompare != 0) previousCompare else comparator.compare(b, a)
201+
if (previousCompare != 0) previousCompare else comparator.compare(b, a)
235202
}
236-
}
237-
}
238203

239204
// Not so useful without type inference for receiver of expression
240205
/**
241206
* Extends the given [comparator] of non-nullable values to a comparator of nullable values
242207
* considering `null` value less than any other value.
243208
*/
244-
public fun <T: Any> nullsFirst(comparator: Comparator<in T>): Comparator<T?> {
245-
return object: Comparator<T?> {
246-
override fun compare(a: T?, b: T?): Int {
247-
if (a === b) return 0
248-
if (a == null) return -1
249-
if (b == null) return 1
250-
return comparator.compare(a, b)
209+
public fun <T: Any> nullsFirst(comparator: Comparator<in T>): Comparator<T?> =
210+
Comparator { a, b ->
211+
when {
212+
a === b -> 0
213+
a == null -> -1
214+
b == null -> 1
215+
else -> comparator.compare(a, b)
216+
}
251217
}
252-
}
253-
}
254218

255219
/**
256220
* Provides a comparator of nullable [Comparable] values
@@ -263,16 +227,15 @@ public inline fun <T: Comparable<T>> nullsFirst(): Comparator<T?> = nullsFirst(n
263227
* Extends the given [comparator] of non-nullable values to a comparator of nullable values
264228
* considering `null` value greater than any other value.
265229
*/
266-
public fun <T: Any> nullsLast(comparator: Comparator<in T>): Comparator<T?> {
267-
return object: Comparator<T?> {
268-
override fun compare(a: T?, b: T?): Int {
269-
if (a === b) return 0
270-
if (a == null) return 1
271-
if (b == null) return -1
272-
return comparator.compare(a, b)
230+
public fun <T: Any> nullsLast(comparator: Comparator<in T>): Comparator<T?> =
231+
Comparator { a, b ->
232+
when {
233+
a === b -> 0
234+
a == null -> 1
235+
b == null -> -1
236+
else -> comparator.compare(a, b)
237+
}
273238
}
274-
}
275-
}
276239

277240
/**
278241
* Provides a comparator of nullable [Comparable] values

0 commit comments

Comments
 (0)