code: function buildEdits (Vs, a, b) {
    var edits = []
  
    var p = { x: a.length, y: b.length }
    for (var D = Vs.length - 1; p.x > 0 || p.y > 0; D -= 1) {
      var V = Vs[D]
      var k = p.x - p.y
  
      var xEnd = V[k]
  
      var down = (k === -D || (k !== D && V[k - 1] < V[k + 1]))
      var kPrev = down ? k + 1 : k - 1
  
      var xStart = V[kPrev]
      var yStart = xStart - kPrev
  
      var xMid = down ? xStart : xStart + 1
  
      while (xEnd > xMid) {
        pushEdit(edits, a[xEnd - 1], false, false)
        xEnd -= 1
      }
  
      if (yStart < 0) break
  
      if (down) {
        pushEdit(edits, b[yStart], true, false)
      } else {
        pushEdit(edits, a[xStart], false, true)
      }
  
      p.x = xStart
      p.y = yStart
    }
  
    return edits.reverse()
  }
docs: buildEdits(Vs, a, b) builds an array of edits from the edit graph,
  `Vs`, of `a` and `b`.
  
  @param {Array} Vs
  @param {Array} a
  @param {Array} b
  @return {Array}