diffStrings static method

StringDiff diffStrings(
  1. String oldText,
  2. String newText,
  3. int cursor
)

Diff two strings under the assumption that at most one insertion and one deletion took place, and both happened at the same index, after which the cursor was at index cursor in the new string.

Implementation

static StringDiff diffStrings(String oldText, String newText, int cursor) {
  assert(cursor >= 0, 'Cursor was negative.');
  assert(cursor <= newText.length, 'Cursor was outside of newText range.');

  final maxInsertion = cursor;
  final maxDeletion =
      math.max(0, oldText.length - newText.length + maxInsertion);

  final oldLength = oldText.characters.length;

  final oldEnd = CharacterRange.at(oldText, maxDeletion, oldText.length)
      .currentCharacters
      .iteratorAtEnd;
  final newEnd = newText.characters.iteratorAtEnd;

  var end = oldLength;
  while (oldEnd.moveBack() &&
      newEnd.moveBack() &&
      oldEnd.current == newEnd.current) {
    end--;
  }

  var start = 0;
  final delta = newText.length - oldText.length;
  final strStartLimit = cursor - math.max<int>(0, delta);
  final startLimit =
      CharacterRange.at(newText, 0, strStartLimit).currentCharacters.length;
  final oldStart = oldText.characters.iterator;
  final newStart = newText.characters.iterator;
  while (start < startLimit &&
      oldStart.moveNext() &&
      newStart.moveNext() &&
      oldStart.current == newStart.current) {
    start++;
  }

  final deleted = oldText.characters.getRange(math.min(start, end), end);
  final inserted =
      newText.characters.getRange(start, math.max(end + delta, start));

  return StringDiff(
    start,
    deleted,
    inserted,
  );
}