@a-s8h/liblevenshtein
Version:
Various utilities regarding Levenshtein transducers.
219 lines (213 loc) • 7.06 kB
JavaScript
// Generated by CoffeeScript 1.7.1
(function() {
var distance, global;
distance = function(algorithm) {
var f;
if (algorithm !== 'standard' && algorithm !== 'transposition' && algorithm !== 'merge_and_split') {
algorithm = 'standard';
}
f = function(u, t) {
if (t < u.length) {
return u.slice(t + 1);
} else {
return '';
}
};
switch (algorithm) {
case 'standard':
return (function(distance) {
var memoized_distance;
memoized_distance = {};
return distance = function(v, w) {
var a, b, key, min, p, s, t, value;
key = v.localeCompare(w) < 0 ? v + '\0' + w : w + '\0' + v;
if ((value = memoized_distance[key]) !== undefined) {
return value;
} else {
if (v === '') {
return memoized_distance[key] = w.length;
} else if (w === '') {
return memoized_distance[key] = v.length;
} else {
a = v[0];
s = v.slice(1);
b = w[0];
t = w.slice(1);
while (a === b && s.length > 0 && t.length > 0) {
a = s[0];
v = s;
s = s.slice(1);
b = t[0];
w = t;
t = t.slice(1);
}
if (a === b) {
return memoized_distance[key] = s.length || t.length;
}
p = distance(s, w);
if (p === 0) {
return memoized_distance[key] = 1;
}
min = p;
p = distance(v, t);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
p = distance(s, t);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
return memoized_distance[key] = 1 + min;
}
}
};
})(distance);
case 'transposition':
return (function(distance) {
var memoized_distance;
memoized_distance = {};
return distance = function(v, w) {
var a, a1, b, b1, key, min, p, value, x, y;
key = v.localeCompare(w) < 0 ? v + '\0' + w : w + '\0' + v;
if ((value = memoized_distance[key]) !== undefined) {
return value;
} else {
if (v === '') {
return memoized_distance[key] = w.length;
} else if (w === '') {
return memoized_distance[key] = v.length;
} else {
a = v[0];
x = v.slice(1);
b = w[0];
y = w.slice(1);
while (a === b && x.length > 0 && y.length > 0) {
a = x[0];
v = x;
x = x.slice(1);
b = y[0];
w = y;
y = y.slice(1);
}
if (a === b) {
return memoized_distance[key] = x.length || y.length;
}
p = distance(x, w);
if (p === 0) {
return memoized_distance[key] = 1;
}
min = p;
p = distance(v, y);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
p = distance(x, y);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
a1 = x[0];
b1 = y[0];
if (a === b1 && a1 === b) {
p = distance(f(v, 1), f(w, 1));
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
}
return memoized_distance[key] = 1 + min;
}
}
};
})(distance);
case 'merge_and_split':
return (function(distance) {
var memoized_distance;
memoized_distance = {};
return distance = function(v, w) {
var a, b, key, min, p, value, x, y;
key = v.localeCompare(w) < 0 ? v + '\0' + w : w + '\0' + v;
if ((value = memoized_distance[key]) !== undefined) {
return value;
} else {
if (v === '') {
return memoized_distance[key] = w.length;
} else if (w === '') {
return memoized_distance[key] = v.length;
} else {
a = v[0];
x = v.slice(1);
b = w[0];
y = w.slice(1);
while (a === b && x.length > 0 && y.length > 0) {
a = x[0];
v = x;
x = x.slice(1);
b = y[0];
w = y;
y = y.slice(1);
}
if (a === b) {
return memoized_distance[key] = x.length || y.length;
}
p = distance(x, w);
if (p === 0) {
return memoized_distance[key] = 1;
}
min = p;
p = distance(v, y);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
p = distance(x, y);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
if (w.length > 1) {
p = distance(x, f(w, 1));
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
}
if (v.length > 1) {
p = distance(f(v, 1), y);
if (p === 0) {
return memoized_distance[key] = 1;
}
if (p < min) {
min = p;
}
}
return memoized_distance[key] = 1 + min;
}
}
};
})(distance);
}
};
global = typeof exports === 'object' ? exports : typeof window === 'object' ? window : this;
global['levenshtein'] || (global['levenshtein'] = {});
global['levenshtein']['distance'] = distance;
}).call(this);