code: private function _processGranularity($from_segment, $to_segment)
      {
          $delimiters = $this->granularityStack[$this->stackpointer++];
          $has_next_stage = $this->stackpointer < count($this->granularityStack);
          foreach (FineDiff::doFragmentDiff($from_segment, $to_segment, $delimiters) as $fragment_edit) {
              // increase granularity
              if ($fragment_edit instanceof FineDiffReplaceOp && $has_next_stage) {
                  $this->_processGranularity(substr($this->from_text, $this->from_offset, $fragment_edit->getFromLen()), $fragment_edit->getText());
              } // fuse copy ops whenever possible
              else if ($fragment_edit instanceof FineDiffCopyOp && $this->last_edit instanceof FineDiffCopyOp) {
                  $this->edits[count($this->edits) - 1]->increase($fragment_edit->getFromLen());
                  $this->from_offset += $fragment_edit->getFromLen();
              } else {
                  /* $fragment_edit instanceof FineDiffCopyOp */
                  /* $fragment_edit instanceof FineDiffDeleteOp */
                  /* $fragment_edit instanceof FineDiffInsertOp */
                  $this->edits[] = $this->last_edit = $fragment_edit;
                  $this->from_offset += $fragment_edit->getFromLen();
              }
          }
          $this->stackpointer--;
      }
docs: This is the recursive function which is responsible for
  handling/increasing granularity.
  
  Incrementally increasing the granularity is key to compute the
  overall diff in a very efficient way.