| 298 | |
| 299 | |
| 300 | var OND = function OND(futureNodes, futureStart, rows, currentNodes, currentStart, cols, compare) { |
| 301 | var length = rows + cols; |
| 302 | var v = []; |
| 303 | var d, k, r, c, pv, cv, pd; |
| 304 | |
| 305 | outer: for (d = 0; d <= length; d++) { |
| 306 | /* istanbul ignore if */ |
| 307 | if (d > SKIP_OND) return null; |
| 308 | pd = d - 1; |
| 309 | /* istanbul ignore next */ |
| 310 | |
| 311 | pv = d ? v[d - 1] : [0, 0]; |
| 312 | cv = v[d] = []; |
| 313 | |
| 314 | for (k = -d; k <= d; k += 2) { |
| 315 | if (k === -d || k !== d && pv[pd + k - 1] < pv[pd + k + 1]) { |
| 316 | c = pv[pd + k + 1]; |
| 317 | } else { |
| 318 | c = pv[pd + k - 1] + 1; |
| 319 | } |
| 320 | |
| 321 | r = c - k; |
| 322 | |
| 323 | while (c < cols && r < rows && compare(currentNodes[currentStart + c], futureNodes[futureStart + r])) { |
| 324 | c++; |
| 325 | r++; |
| 326 | } |
| 327 | |
| 328 | if (c === cols && r === rows) { |
| 329 | break outer; |
| 330 | } |
| 331 | |
| 332 | cv[d + k] = c; |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | var diff = Array(d / 2 + length / 2); |
| 337 | var diffIdx = diff.length - 1; |
| 338 | |
| 339 | for (d = v.length - 1; d >= 0; d--) { |
| 340 | while (c > 0 && r > 0 && compare(currentNodes[currentStart + c - 1], futureNodes[futureStart + r - 1])) { |
| 341 | // diagonal edge = equality |
| 342 | diff[diffIdx--] = SKIP; |
| 343 | c--; |
| 344 | r--; |
| 345 | } |
| 346 | |
| 347 | if (!d) break; |
| 348 | pd = d - 1; |
| 349 | /* istanbul ignore next */ |
| 350 | |
| 351 | pv = d ? v[d - 1] : [0, 0]; |
| 352 | k = c - r; |
| 353 | |
| 354 | if (k === -d || k !== d && pv[pd + k - 1] < pv[pd + k + 1]) { |
| 355 | // vertical edge = insertion |
| 356 | r--; |
| 357 | diff[diffIdx--] = INSERTION; |