replace method

void replace(
  1. int start, [
  2. int? end
])

Replaces the existing selection with a selection range from start to end so that no changes are notified for the overlapping range.

Implementation

void replace(int start, [int? end]) {
  end ??= start;

  final newTree = IntervalTree([start, end]);
  final overlap = _tree.intersection(newTree);

  final removal = IntervalTree.of(_tree);
  removal.removeAll(newTree);
  for (final range in removal) {
    for (int i = range.start; i <= range.end; ++i) {
      if (!overlap.contains([i, i])) {
        notifyListeners(i, false);
      }
    }
  }

  final addition = IntervalTree.of(newTree);
  addition.removeAll(removal);
  for (final range in addition) {
    for (int i = range.start; i <= range.end; ++i) {
      if (!overlap.contains([i, i])) {
        notifyListeners(i, true);
      }
    }
  }

  _tree = newTree;
}