UNPKG

@a-s8h/liblevenshtein

Version:

Various utilities regarding Levenshtein transducers.

219 lines (213 loc) 7.06 kB
// 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);