UNPKG

devops-diff

Version:

devops-diff

87 lines 2.94 kB
export function levenshtein(a, b) { if (a.length === 0) { return b.length; } if (b.length === 0) { return a.length; } var matrix = []; var i; for (i = 0; i <= b.length; i++) { matrix[i] = [i]; } var j; for (j = 0; j <= a.length; j++) { matrix[0][j] = j; } for (i = 1; i <= b.length; i++) { for (j = 1; j <= a.length; j++) { if (b.charAt(i - 1) === a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, Math.min(matrix[i][j - 1] + 1, matrix[i - 1][j] + 1)); } } } return matrix[b.length][a.length]; } export function newDistanceFn(str) { return function (x, y) { var xValue = str(x).trim(); var yValue = str(y).trim(); var lev = levenshtein(xValue, yValue); return lev / (xValue.length + yValue.length); }; } export function newMatcherFn(distance) { function findBestMatch(a, b, cache) { if (cache === void 0) { cache = new Map(); } var bestMatchDist = Infinity; var bestMatch; for (var i = 0; i < a.length; ++i) { for (var j = 0; j < b.length; ++j) { var cacheKey = JSON.stringify([a[i], b[j]]); var md = void 0; if (!(cache.has(cacheKey) && (md = cache.get(cacheKey)))) { md = distance(a[i], b[j]); cache.set(cacheKey, md); } if (md < bestMatchDist) { bestMatchDist = md; bestMatch = { indexA: i, indexB: j, score: bestMatchDist }; } } } return bestMatch; } function group(a, b, level, cache) { if (level === void 0) { level = 0; } if (cache === void 0) { cache = new Map(); } var bm = findBestMatch(a, b, cache); if (!bm || a.length + b.length < 3) { return [[a, b]]; } var a1 = a.slice(0, bm.indexA); var b1 = b.slice(0, bm.indexB); var aMatch = [a[bm.indexA]]; var bMatch = [b[bm.indexB]]; var tailA = bm.indexA + 1; var tailB = bm.indexB + 1; var a2 = a.slice(tailA); var b2 = b.slice(tailB); var group1 = group(a1, b1, level + 1, cache); var groupMatch = group(aMatch, bMatch, level + 1, cache); var group2 = group(a2, b2, level + 1, cache); var result = groupMatch; if (bm.indexA > 0 || bm.indexB > 0) { result = group1.concat(result); } if (a.length > tailA || b.length > tailB) { result = result.concat(group2); } return result; } return group; } //# sourceMappingURL=rematch.js.map