bool check(collection)

Source

bool check(dynamic collection) {
  this._reset();
  CollectionChangeRecord record = this._itHead;
  bool mayBeDirty = false;
  int index;
  var item;
  var itemTrackBy;
  if (collection is List) {
    var list = collection;
    this._length = collection.length;
    for (index = 0; index < this._length; index++) {
      item = list[index];
      itemTrackBy = this._trackByFn(index, item);
      if (identical(record, null) ||
          !looseIdentical(record.trackById, itemTrackBy)) {
        record = this._mismatch(record, item, itemTrackBy, index);
        mayBeDirty = true;
      } else {
        if (mayBeDirty) {
          // TODO(misko): can we limit this to duplicates only?
          record = this._verifyReinsertion(record, item, itemTrackBy, index);
        }
        if (!looseIdentical(record.item, item))
          this._addIdentityChange(record, item);
      }
      record = record._next;
    }
  } else {
    index = 0;
    collection.forEach((item) {
      itemTrackBy = this._trackByFn(index, item);
      if (identical(record, null) ||
          !looseIdentical(record.trackById, itemTrackBy)) {
        record = this._mismatch(record, item, itemTrackBy, index);
        mayBeDirty = true;
      } else {
        if (mayBeDirty) {
          // TODO(misko): can we limit this to duplicates only?
          record = this._verifyReinsertion(record, item, itemTrackBy, index);
        }
        if (!looseIdentical(record.item, item))
          this._addIdentityChange(record, item);
      }
      record = record._next;
      index++;
    });
    this._length = index;
  }
  this._truncate(record);
  this._collection = collection;
  return this.isDirty;
}