aboutsummaryrefslogtreecommitdiff
path: root/node_modules/leven/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/leven/index.js')
-rw-r--r--node_modules/leven/index.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/node_modules/leven/index.js b/node_modules/leven/index.js
new file mode 100644
index 0000000..25f5a3d
--- /dev/null
+++ b/node_modules/leven/index.js
@@ -0,0 +1,77 @@
+'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;