UNPKG

patience-diff

Version:
47 lines (36 loc) 1.05 kB
var assert = require('assert') var INSTRUCTION_BUFFER_SIZE = 512 var MAX_COMMAND_LENGTH = 3 module.exports = Diff function Diff (from, to, result) { this.instructions = new Uint16Array(INSTRUCTION_BUFFER_SIZE * MAX_COMMAND_LENGTH) } Diff.prototype.diff = function (current, desired) { assert.ok(Array.isArray(current), 'patience-diff: current should be an Array') assert.ok(Array.isArray(desired), 'patience-diff: desired should be an Array') var m = current.length var n = desired.length var max = n + m var v = new Array(2 * max + 1) v[1] = 0 // pretend we're starting at (x, y) = (0,−1) var d, k, x, y for (d = 0; d < max; d++) { for (k = -d; k <= d; k += 2) { if (k === -d || (k !== d && v[k - 1] < v[k + 1])) { x = v[k + 1] } else { x = v[k - 1] + 1 } y = x - k while (x < n && y < m && current[x] === desired[y]) { x = x + 1 y = y + 1 } v[k] = x if (x >= n && y >= m) { console.log(d) return d } } } }