code: function createRangeBoundaryMover(isStart, collapse) {
          /*
           Unit can be "character" or "word"
           Options:
  
           - includeTrailingSpace
           - wordRegex
           - tokenizer
           - collapseSpaceBeforeLineBreak
           */
          return createEntryPointFunction(
              function(session, unit, count, moveOptions) {
                  if (typeof count == UNDEF) {
                      count = unit;
                      unit = CHARACTER;
                  }
                  moveOptions = createNestedOptions(moveOptions, defaultMoveOptions);
                  log.debug("** moving boundary. start: " + isStart + ", unit: " + unit + ", count: " + count);
  
                  var boundaryIsStart = isStart;
                  if (collapse) {
                      boundaryIsStart = (count >= 0);
                      this.collapse(!boundaryIsStart);
                  }
                  var moveResult = movePositionBy(session.getRangeBoundaryPosition(this, boundaryIsStart), unit, count, moveOptions.characterOptions, moveOptions.wordOptions);
                  var newPos = moveResult.position;
                  this[boundaryIsStart ? "setStart" : "setEnd"](newPos.node, newPos.offset);
                  log.debug("*** MOVED " + moveResult.unitsMoved, newPos.inspect());
                  return moveResult.unitsMoved;
              }
          );
      }
docs: /*---------------------------------------------------------------------------------------------------------------- Extensions to the Rangy Range object