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.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/node_modules/leven/index.js b/node_modules/leven/index.js
new file mode 100644
index 000000000..bb44b7919
--- /dev/null
+++ b/node_modules/leven/index.js
@@ -0,0 +1,85 @@
+/* eslint-disable no-nested-ternary */
+'use strict';
+var arr = [];
+var charCodeCache = [];
+
+module.exports = function (a, b) {
+ if (a === b) {
+ return 0;
+ }
+
+ var swap = a;
+
+ // Swapping the strings if `a` is longer than `b` so we know which one is the
+ // shortest & which one is the longest
+ if (a.length > b.length) {
+ a = b;
+ b = swap;
+ }
+
+ var aLen = a.length;
+ var bLen = b.length;
+
+ if (aLen === 0) {
+ return bLen;
+ }
+
+ if (bLen === 0) {
+ return aLen;
+ }
+
+ // 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 (aLen > 0 && (a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen))) {
+ aLen--;
+ bLen--;
+ }
+
+ if (aLen === 0) {
+ return bLen;
+ }
+
+ // Performing prefix trimming
+ // We can linearly drop prefix common to both strings since they
+ // don't increase distance at all
+ var start = 0;
+
+ while (start < aLen && (a.charCodeAt(start) === b.charCodeAt(start))) {
+ start++;
+ }
+
+ aLen -= start;
+ bLen -= start;
+
+ if (aLen === 0) {
+ return bLen;
+ }
+
+ var bCharCode;
+ var ret;
+ var tmp;
+ var tmp2;
+ var i = 0;
+ var j = 0;
+
+ while (i < aLen) {
+ charCodeCache[start + i] = a.charCodeAt(start + i);
+ arr[i] = ++i;
+ }
+
+ while (j < bLen) {
+ bCharCode = b.charCodeAt(start + j);
+ tmp = j++;
+ ret = j;
+
+ for (i = 0; i < aLen; i++) {
+ tmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1;
+ tmp = arr[i];
+ ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2;
+ }
+ }
+
+ return ret;
+};