docs: function(seq1, seq2, eq){
  
      var l1 = seq1.length,
          l2 = seq2.length,
          distMap = Array.apply(null, {length: l1 + 1}).map(function(){return [];}),
          stepMap = Array.apply(null, {length: l1 + 1}).map(function(){return [];}),
          i, j;
  
      eq = eq || defaultEqual;
  
      for(i = 0; i <= l1; i++){
          for(j = 0; j <= l2; j++){
  
              if(i === 0 || j === 0){
                  distMap[i][j] = i || j;
                  stepMap[i][j] = i > 0 ? STEP_REMOVE : STEP_INSERT;
  
              }else{
                  var equal = eq(seq1[i-1], seq2[j-1]),
  
                      removeDist = distMap[i-1][j] + 1,
                      insertDist = distMap[i][j-1] + 1,
                      replaceDist = distMap[i-1][j-1] + (equal ? 0 : 2),
                      dist = Math.min(replaceDist, removeDist, insertDist);
  
                  distMap[i][j] = dist;
  
                  switch(dist){
                  
                  case replaceDist:
                      stepMap[i][j] = equal ? STEP_NOCHANGE : STEP_REPLACE;
                      break;
                  
                  case removeDist:
                      stepMap[i][j] = STEP_REMOVE;
                      break;
                  
                  case insertDist:
                      stepMap[i][j] = STEP_INSERT;
  
                  }
              }
          }
      }
  
      return stepMap;
  }