1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 'use strict';
- const array = [];
- const charCodeCache = [];
- const leven = (left, right) => {
- if (left === right) {
- return 0;
- }
- const swap = left;
- // Swapping the strings if `a` is longer than `b` so we know which one is the
- // shortest & which one is the longest
- if (left.length > right.length) {
- left = right;
- right = swap;
- }
- let leftLength = left.length;
- let rightLength = right.length;
- // Performing suffix trimming:
- // We can linearly drop suffix common to both strings since they
- // don't increase distance at all
- // Note: `~-` is the bitwise way to perform a `- 1` operation
- while (leftLength > 0 && (left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength))) {
- leftLength--;
- rightLength--;
- }
- // Performing prefix trimming
- // We can linearly drop prefix common to both strings since they
- // don't increase distance at all
- let start = 0;
- while (start < leftLength && (left.charCodeAt(start) === right.charCodeAt(start))) {
- start++;
- }
- leftLength -= start;
- rightLength -= start;
- if (leftLength === 0) {
- return rightLength;
- }
- let bCharCode;
- let result;
- let temp;
- let temp2;
- let i = 0;
- let j = 0;
- while (i < leftLength) {
- charCodeCache[i] = left.charCodeAt(start + i);
- array[i] = ++i;
- }
- while (j < rightLength) {
- bCharCode = right.charCodeAt(start + j);
- temp = j++;
- result = j;
- for (i = 0; i < leftLength; i++) {
- temp2 = bCharCode === charCodeCache[i] ? temp : temp + 1;
- temp = array[i];
- // eslint-disable-next-line no-multi-assign
- result = array[i] = temp > result ? temp2 > result ? result + 1 : temp2 : temp2 > temp ? temp + 1 : temp2;
- }
- }
- return result;
- };
- module.exports = leven;
- // TODO: Remove this for the next major release
- module.exports.default = leven;
|