More efficient way to get LTR diffLerp editing.
[string-lerp.git] / string-lerp.js
index 8d5a879..3a30488 100644 (file)
@@ -31,7 +31,7 @@
 
     function editPath(d, t) {
         /** Given a Levenshtein matrix and target, create an edit list */
-        var path = []
+        var path = [];
         var j = t.length;
         var n = j + 1;
         var i = d.length / n - 1;
             compute the edits. It is not recommended for strings
             longer than a few hundred characters.
          */
-        var edits = diff(a, b);
-        var partial = edits.slice(0, Math.round(p * edits.length));
-        return patch(partial, a);
+
+        // The edit path works from the string end, forwards, because
+        // that's how Levenshtein edits work. To match LTR reading
+        // direction (and the behavior of fastLerp), swap the strings
+        // and invert the parameter when editing.
+        var edits = diff(b, a);
+        var partial = edits.slice(0, Math.round((1 - p) * edits.length));
+        return patch(partial, b);
     }
 
-    var NUMBERS = /(-?\d+(?:\.\d+)?)/g
+    var NUMBERS = /(-?\d+(?:\.\d+)?)/g;
 
     function areNumericTwins(a, b) {
         /** Check if a and b differ only in numerals
         var aParts = a.split(NUMBERS);
         var bParts = b.split(NUMBERS);
         for (var i = 1; i < aParts.length; i += 2) {
-            var part = nlerp(+aParts[i], +bParts[i], p)
+            var part = nlerp(+aParts[i], +bParts[i], p);
             if (aParts[i].indexOf(".") === -1 && bParts[i].indexOf(".") === -1)
                 part = Math.round(part);
             aParts[i] = part.toString();
         if (p === 1) return b;
 
         if (areNumericTwins(a, b))
-            return numericLerp(a, b, p)
+            return numericLerp(a, b, p);
 
         // Numeric lerps should over- and under-shoot when fed numbers
         // outside 0 to 1, but other types cannot.
         if (p > 1) return b;
 
         var n = a.length * b.length;
-        return (n && n < MAX_MATRIX_SIZE)
-            ? diffLerp(a, b, p)
-            : fastLerp(a, b, p);
+        return ((n && n < MAX_MATRIX_SIZE) ? diffLerp : fastLerp)(a, b, p);
     }
 
     exports.levenshteinMatrix = levenshteinMatrix;