replaceRange method

void replaceRange (int start, int end, Iterable<E> newContents)
override

Removes the objects in the range start inclusive to end exclusive and inserts the contents of replacement in its place.

List<int> list = [1, 2, 3, 4, 5];
list.replaceRange(1, 4, [6, 7]);
list.join(', '); // '1, 6, 7, 5'

The provide range, given by start and end, must be valid. A range from start to end is valid if 0 <= start <= end <= len, where len is this list's length. The range starts at start and has length end - start. An empty range (with end == start) is valid.

This method does not work on fixed-length lists, even when replacement has the same number of elements as the replaced range. In that case use setRange instead.

Implementation

void replaceRange(int start, int end, Iterable<E> newContents) {
  RangeError.checkValidRange(start, end, this.length);
  if (newContents is! EfficientLengthIterable) {
    newContents = newContents.toList();
  }
  int removeLength = end - start;
  int insertLength = newContents.length;
  if (removeLength >= insertLength) {
    int insertEnd = start + insertLength;
    this.setRange(start, insertEnd, newContents);
    if (removeLength > insertLength) {
      _closeGap(insertEnd, end);
    }
  } else {
    int delta = insertLength - removeLength;
    int newLength = this.length + delta;
    int insertEnd = start + insertLength; // aka. end + delta.
    this.length = newLength;
    this.setRange(insertEnd, newLength, this, end);
    this.setRange(start, insertEnd, newContents);
  }
}