| 18 | const pathName = (entity: ApiEntity): string => entity.path.at(-1) ?? "" |
| 19 | |
| 20 | const levenshtein = (left: string, right: string): number => { |
| 21 | const row = Array.from({ length: right.length + 1 }, (_, index) => index) |
| 22 | for (let leftIndex = 1; leftIndex <= left.length; leftIndex++) { |
| 23 | let previous = row[0]! |
| 24 | row[0] = leftIndex |
| 25 | for (let rightIndex = 1; rightIndex <= right.length; rightIndex++) { |
| 26 | const above = row[rightIndex]! |
| 27 | const diagonal = previous |
| 28 | previous = above |
| 29 | row[rightIndex] = left[leftIndex - 1] === right[rightIndex - 1] |
| 30 | ? diagonal |
| 31 | : Math.min(diagonal, above, row[rightIndex - 1]!) + 1 |
| 32 | } |
| 33 | } |
| 34 | return row[right.length]! |
| 35 | } |
| 36 | |
| 37 | const nameSimilarity = (left: string, right: string): number => { |
| 38 | const length = Math.max(left.length, right.length) |