patience-diff
Version:
Linear Diff algorithm for Arrays.
47 lines (36 loc) • 1.05 kB
JavaScript
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
}
}
}
}