docs: function(seq1, seq2, eq){
  
      var N = seq1.length,
          M = seq2.length,
          MAX = N + M,
          stepMap = Array.apply(null, {length: M+N+1}).map(function(){return [];}),
          furthestReaching = [],
          dist = -1;
  
      eq = eq || defaultEqual;
  
      furthestReaching[MAX + 1] = 0;
  
      // caculate min distance & log each step
      for(var D = 0; D <= MAX && dist === -1; D++){
          for(var k = -D, x, y, step; k <= D && dist === -1; k+=2){
              if(k === -D || (k !== D && furthestReaching[k - 1 + MAX] < furthestReaching[k + 1 + MAX])){
                  x = furthestReaching[k + 1 + MAX];
                  step = STEP_INSERT;
              }else{
                  x = furthestReaching[k - 1 + MAX] + 1;
                  step = STEP_REMOVE;
              }
  
              y = x - k;
              stepMap[x][y] = step;
  
              while(x < N && y < M && eq(seq1[x], seq2[y])){
                  x++;
                  y++;
                  stepMap[x][y] = STEP_NOCHANGE;
              }
  
              furthestReaching[k + MAX] = x;
  
              if(x >= N && y >= M){
                  dist = D;
              }
          }
      }
  
      return stepMap;
  }