|
1 | 1 | package me.shedaniel.linkie.utils
|
2 | 2 |
|
3 | 3 | import com.soywiz.korio.file.VfsFile
|
4 |
| -import me.shedaniel.linkie.MappingsContainer |
5 |
| -import me.shedaniel.linkie.getClassByObfName |
6 |
| -import me.shedaniel.linkie.optimumName |
7 | 4 | import java.io.StringReader
|
8 | 5 | import kotlin.math.min
|
9 | 6 |
|
10 | 7 | fun <T> Iterable<T>.dropAndTake(drop: Int, take: Int): Sequence<T> =
|
11 | 8 | asSequence().drop(drop).take(take)
|
12 | 9 |
|
13 |
| -fun <T, R> Iterable<T>.firstMapped(filterTransform: (entry: T) -> R?): R? { |
| 10 | +inline fun <T, R> Iterable<T>.firstMapped(filterTransform: (entry: T) -> R?): R? { |
14 | 11 | for (entry in this) {
|
15 | 12 | return filterTransform(entry) ?: continue
|
16 | 13 | }
|
17 | 14 | return null
|
18 | 15 | }
|
19 | 16 |
|
20 |
| -fun <T, R> Sequence<T>.firstMapped(filterTransform: (entry: T) -> R?): R? { |
21 |
| - for (entry in this) { |
22 |
| - return filterTransform(entry) ?: continue |
| 17 | +inline fun <T, R> Sequence<T>.firstMapped(filterTransform: (entry: T) -> R?): R? = asIterable().firstMapped(filterTransform) |
| 18 | + |
| 19 | +inline fun <T, R : Comparable<R>> Iterable<T>.maxOfIgnoreNull(filterTransform: (entry: T) -> R?): R? { |
| 20 | + val iterator = iterator() |
| 21 | + if (!iterator.hasNext()) return null |
| 22 | + var maxValue = filterTransform(iterator.next()) |
| 23 | + while (iterator.hasNext()) { |
| 24 | + val v = filterTransform(iterator.next()) |
| 25 | + maxValue = when { |
| 26 | + maxValue == null -> v |
| 27 | + v == null -> maxValue |
| 28 | + else -> maxOf(maxValue, v) |
| 29 | + } |
23 | 30 | }
|
24 |
| - return null |
| 31 | + return maxValue |
| 32 | +} |
| 33 | + |
| 34 | +inline fun <T, R : Comparable<R>> Sequence<T>.maxOfIgnoreNull(filterTransform: (entry: T) -> R?): R? = asIterable().maxOfIgnoreNull(filterTransform) |
| 35 | + |
| 36 | +inline fun <T, R : Comparable<R>> Iterable<T>.maxOfIgnoreNullSelf(filterTransform: (entry: T) -> R?): T? { |
| 37 | + val iterator = iterator() |
| 38 | + if (!iterator.hasNext()) return null |
| 39 | + var max = iterator.next() |
| 40 | + var maxValue = filterTransform(max) |
| 41 | + while (iterator.hasNext()) { |
| 42 | + val next = iterator.next() |
| 43 | + val v = filterTransform(next) |
| 44 | + |
| 45 | + if (v != null && (maxValue == null || v > maxValue)) { |
| 46 | + maxValue = v |
| 47 | + max = next |
| 48 | + } |
| 49 | + } |
| 50 | + return if (maxValue == null) null else max |
25 | 51 | }
|
26 | 52 |
|
| 53 | +inline fun <T, R : Comparable<R>> Sequence<T>.maxOfIgnoreNullSelf(filterTransform: (entry: T) -> R?): R? = asIterable().maxOfIgnoreNull(filterTransform) |
| 54 | + |
27 | 55 | private fun editDistance(s11: String, s22: String): Int {
|
28 | 56 | val costs = IntArray(s22.length + 1)
|
29 | 57 | for (i in 0..s11.length) {
|
@@ -71,12 +99,22 @@ fun String.onlyClassOrNull(c: Char = '/'): String? {
|
71 | 99 | return if (indexOf < 0) null else substring(indexOf + 1)
|
72 | 100 | }
|
73 | 101 |
|
74 |
| -fun String?.doesContainsOrMatchWildcard(searchTerm: String): Boolean { |
75 |
| - if (this == null) return false |
76 |
| - return if (searchTerm.onlyClassOrNull() != null) { |
77 |
| - contains(searchTerm, true) |
| 102 | +fun String?.matchWithSimilarity(searchTerm: String): Double? { |
| 103 | + if (this == null) return null |
| 104 | + val searchOnlyClass = searchTerm.onlyClassOrNull() |
| 105 | + return if (searchOnlyClass != null) { |
| 106 | + if (contains(searchTerm, true)) { |
| 107 | + this.similarity(searchTerm) |
| 108 | + } else { |
| 109 | + null |
| 110 | + } |
78 | 111 | } else {
|
79 |
| - onlyClass().contains(searchTerm, true) |
| 112 | + val onlyClass = onlyClass() |
| 113 | + if (onlyClass.contains(searchTerm, true)) { |
| 114 | + this.similarity(searchTerm) |
| 115 | + } else { |
| 116 | + null |
| 117 | + } |
80 | 118 | }
|
81 | 119 | }
|
82 | 120 |
|
|
0 commit comments