@@ -939,6 +939,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
939
939
940
940
bool _check (Iterable collection) {
941
941
_reset ();
942
+
942
943
if (collection is UnmodifiableListView && identical (_iterable, collection)) {
943
944
// Short circuit and assume that the list has not been modified.
944
945
return false ;
@@ -988,11 +989,9 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
988
989
*/
989
990
void _reset () {
990
991
if (isDirty) {
991
- // Record the state of the collection for a possible _revertToPreviousState()
992
- for (ItemRecord <V > record = _previousItHead = _itHead;
993
- record != null ;
994
- record = record._next) {
995
- record._nextPrevious = record._next;
992
+ // Record the state of the collection for a possible `_revertToPreviousState()`
993
+ for (ItemRecord <V > r = _previousItHead = _itHead; r != null ; r = r._next) {
994
+ r._nextPrevious = r._next;
996
995
}
997
996
_undoDeltas ();
998
997
}
@@ -1043,33 +1042,37 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1043
1042
return record..item = item;
1044
1043
}
1045
1044
1046
- if (item is num && (item as num ).isNaN && record.item is num && (record.item as num ).isNaN){
1045
+ if (item is num && (item as num ).isNaN && record.item is num && (record.item as num ).isNaN) {
1047
1046
// we need this for JavaScript since in JS NaN !== NaN.
1048
1047
return record;
1049
1048
}
1050
1049
}
1051
1050
1052
- // find the previous record so that we know where to insert after.
1053
- ItemRecord <V > prev = record == null ? _itTail : record._prev;
1051
+ // The previous record after which we will append the current one.
1052
+ ItemRecord <V > previousRecord;
1053
+
1054
+ if (record == null ) {
1055
+ previousRecord = _itTail;
1056
+ } else {
1057
+ previousRecord = record._prev;
1058
+ // Remove the record from the collection since we know it does not match the item.
1059
+ _remove (record);
1060
+ }
1054
1061
1055
- // Remove the record from the collection since we know it does not match the
1056
- // item.
1057
- if (record != null ) _collection_remove (record);
1058
1062
// Attempt to see if we have seen the item before.
1059
1063
record = _movedItems.get (item, index);
1060
1064
if (record != null ) {
1061
1065
// We have seen this before, we need to move it forward in the collection.
1062
- _collection_moveAfter (record, prev , index);
1066
+ _moveAfter (record, previousRecord , index);
1063
1067
} else {
1064
1068
// Never seen it, check evicted list.
1065
1069
record = _removedItems.get (item);
1066
1070
if (record != null ) {
1067
- // It is an item which we have earlier evict it, reinsert it back into
1068
- // the list.
1069
- _collection_reinsertAfter (record, prev, index);
1071
+ // It is an item which we have evicted earlier: reinsert it back into the list.
1072
+ _reinsertAfter (record, previousRecord, index);
1070
1073
} else {
1071
- // It is a new item add it.
1072
- record = _collection_addAfter (new ItemRecord <V >(item), prev , index);
1074
+ // It is a new item: add it.
1075
+ record = _addAfter (new ItemRecord <V >(item), previousRecord , index);
1073
1076
}
1074
1077
}
1075
1078
return record;
@@ -1101,14 +1104,13 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1101
1104
* position. This is incorrect, since a better way to think of it is as insert
1102
1105
* of 'b' rather then switch 'a' with 'b' and then add 'a' at the end.
1103
1106
*/
1104
- ItemRecord <V > verifyReinsertion (ItemRecord record, dynamic item,
1105
- int index) {
1107
+ ItemRecord <V > verifyReinsertion (ItemRecord record, item, int index) {
1106
1108
ItemRecord <V > reinsertRecord = _removedItems.get (item);
1107
1109
if (reinsertRecord != null ) {
1108
- record = _collection_reinsertAfter (reinsertRecord, record._prev, index);
1110
+ record = _reinsertAfter (reinsertRecord, record._prev, index);
1109
1111
} else if (record.currentIndex != index) {
1110
1112
record.currentIndex = index;
1111
- _moves_add (record);
1113
+ _addToMoves (record);
1112
1114
}
1113
1115
return record;
1114
1116
}
@@ -1122,7 +1124,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1122
1124
// Anything after that needs to be removed;
1123
1125
while (record != null ) {
1124
1126
ItemRecord <V > nextRecord = record._next;
1125
- _removals_add ( _collection_unlink (record));
1127
+ _addToRemovals ( _unlink (record));
1126
1128
record = nextRecord;
1127
1129
}
1128
1130
_removedItems.clear ();
@@ -1133,9 +1135,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1133
1135
if (_removalsTail != null ) _removalsTail._nextRemoved = null ;
1134
1136
}
1135
1137
1136
- ItemRecord <V > _collection_reinsertAfter (ItemRecord <V > record,
1137
- ItemRecord <V > insertPrev,
1138
- int index) {
1138
+ ItemRecord <V > _reinsertAfter (ItemRecord <V > record, ItemRecord <V > prevRecord, int index) {
1139
1139
_removedItems.remove (record);
1140
1140
var prev = record._prevRemoved;
1141
1141
var next = record._nextRemoved;
@@ -1154,24 +1154,20 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1154
1154
next._prevRemoved = prev;
1155
1155
}
1156
1156
1157
- _collection_insertAfter (record, insertPrev , index);
1158
- _moves_add (record);
1157
+ _insertAfter (record, prevRecord , index);
1158
+ _addToMoves (record);
1159
1159
return record;
1160
1160
}
1161
1161
1162
- ItemRecord <V > _collection_moveAfter (ItemRecord <V > record,
1163
- ItemRecord <V > prev,
1164
- int index) {
1165
- _collection_unlink (record);
1166
- _collection_insertAfter (record, prev, index);
1167
- _moves_add (record);
1162
+ ItemRecord <V > _moveAfter (ItemRecord <V > record, ItemRecord <V > prevRecord, int index) {
1163
+ _unlink (record);
1164
+ _insertAfter (record, prevRecord, index);
1165
+ _addToMoves (record);
1168
1166
return record;
1169
1167
}
1170
1168
1171
- ItemRecord <V > _collection_addAfter (ItemRecord <V > record,
1172
- ItemRecord <V > prev,
1173
- int index) {
1174
- _collection_insertAfter (record, prev, index);
1169
+ ItemRecord <V > _addAfter (ItemRecord <V > record, ItemRecord <V > prevRecord, int index) {
1170
+ _insertAfter (record, prevRecord, index);
1175
1171
1176
1172
if (_additionsTail == null ) {
1177
1173
assert (_additionsHead == null );
@@ -1184,38 +1180,35 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1184
1180
return record;
1185
1181
}
1186
1182
1187
- ItemRecord <V > _collection_insertAfter (ItemRecord <V > record,
1188
- ItemRecord <V > prev,
1189
- int index) {
1190
- assert (record != prev);
1183
+ ItemRecord <V > _insertAfter (ItemRecord <V > record, ItemRecord <V > prevRecord, int index) {
1184
+ assert (record != prevRecord);
1191
1185
assert (record._next == null );
1192
1186
assert (record._prev == null );
1193
1187
1194
- ItemRecord <V > next = prev == null ? _itHead : prev ._next;
1188
+ ItemRecord <V > next = prevRecord == null ? _itHead : prevRecord ._next;
1195
1189
assert (next != record);
1196
- assert (prev != record);
1190
+ assert (prevRecord != record);
1197
1191
record._next = next;
1198
- record._prev = prev ;
1192
+ record._prev = prevRecord ;
1199
1193
if (next == null ) {
1200
1194
_itTail = record;
1201
1195
} else {
1202
1196
next._prev = record;
1203
1197
}
1204
- if (prev == null ) {
1198
+ if (prevRecord == null ) {
1205
1199
_itHead = record;
1206
1200
} else {
1207
- prev ._next = record;
1201
+ prevRecord ._next = record;
1208
1202
}
1209
1203
1210
1204
_movedItems.put (record);
1211
1205
record.currentIndex = index;
1212
1206
return record;
1213
1207
}
1214
1208
1215
- ItemRecord <V > _collection_remove (ItemRecord record) =>
1216
- _removals_add (_collection_unlink (record));
1209
+ ItemRecord <V > _remove (ItemRecord record) => _addToRemovals (_unlink (record));
1217
1210
1218
- ItemRecord <V > _collection_unlink (ItemRecord record) {
1211
+ ItemRecord <V > _unlink (ItemRecord record) {
1219
1212
_movedItems.remove (record);
1220
1213
1221
1214
var prev = record._prev;
@@ -1238,7 +1231,7 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1238
1231
return record;
1239
1232
}
1240
1233
1241
- ItemRecord <V > _moves_add (ItemRecord <V > record) {
1234
+ ItemRecord <V > _addToMoves (ItemRecord <V > record) {
1242
1235
assert (record._nextMoved == null );
1243
1236
if (_movesTail == null ) {
1244
1237
assert (_movesHead == null );
@@ -1251,9 +1244,9 @@ class _CollectionChangeRecord<V> implements CollectionChangeRecord<V> {
1251
1244
return record;
1252
1245
}
1253
1246
1254
- ItemRecord <V > _removals_add (ItemRecord <V > record) {
1255
- record.currentIndex = null ;
1247
+ ItemRecord <V > _addToRemovals (ItemRecord <V > record) {
1256
1248
_removedItems.put (record);
1249
+ record.currentIndex = null ;
1257
1250
1258
1251
if (_removalsTail == null ) {
1259
1252
assert (_removalsHead == null );
@@ -1325,35 +1318,37 @@ class ItemRecord<V> extends CollectionChangeItem<V> {
1325
1318
1326
1319
/// A linked list of [ItemRecord] s with the same [ItemRecord.item]
1327
1320
class _DuplicateItemRecordList {
1328
- ItemRecord head, tail ;
1321
+ ItemRecord _head, _tail ;
1329
1322
1330
1323
/**
1331
1324
* Add the [record] before the [insertBefore] in the list of duplicates or at the end of the list
1332
1325
* when no [insertBefore] is specified.
1333
1326
*
1334
1327
* Note: by design all records in the list of duplicates hold the save value in [record.item] .
1335
1328
*/
1336
- void add (ItemRecord record, ItemRecord previousRecord) {
1337
- assert (previousRecord == null || previousRecord.item == record.item);
1338
- if (head == null ) {
1339
- assert (previousRecord == null );
1340
- head = tail = record;
1329
+ void add (ItemRecord record, ItemRecord insertBefore) {
1330
+ assert (insertBefore == null || insertBefore.item == record.item);
1331
+ if (_head == null ) {
1332
+ /// pushing the first [ItemRecord] to the list
1333
+ assert (insertBefore == null );
1334
+ _head = _tail = record;
1341
1335
record._nextDup = null ;
1342
1336
record._prevDup = null ;
1343
1337
} else {
1344
- assert (record.item == head.item);
1345
- if (previousRecord == null ) {
1346
- tail._nextDup = record;
1347
- record._prevDup = tail;
1338
+ // adding a duplicate [ItemRecord] to the list
1339
+ assert (record.item == _head.item);
1340
+ if (insertBefore == null ) {
1341
+ _tail._nextDup = record;
1342
+ record._prevDup = _tail;
1348
1343
record._nextDup = null ;
1349
- tail = record;
1344
+ _tail = record;
1350
1345
} else {
1351
- var prev = previousRecord ._prevDup;
1352
- var next = previousRecord ;
1346
+ var prev = insertBefore ._prevDup;
1347
+ var next = insertBefore ;
1353
1348
record._prevDup = prev;
1354
1349
record._nextDup = next;
1355
1350
if (prev == null ) {
1356
- head = record;
1351
+ _head = record;
1357
1352
} else {
1358
1353
prev._nextDup = record;
1359
1354
}
@@ -1362,17 +1357,17 @@ class _DuplicateItemRecordList {
1362
1357
}
1363
1358
}
1364
1359
1365
- /// Returns an [ItemRecord] having [ItemRecord.item] == [item] and [ItemRecord.currentIndex] >=
1366
- /// [hideIndex ]
1367
- ItemRecord get (item, int hideIndex ) {
1360
+ /// Returns an [ItemRecord] having [ItemRecord.item] == [item] and
1361
+ /// [ItemRecord.currentIndex] >= [afterIndex ]
1362
+ ItemRecord get (item, int afterIndex ) {
1368
1363
ItemRecord record;
1369
- for (record = head ; record != null ; record = record._nextDup) {
1370
- if ((hideIndex == null || hideIndex < record.currentIndex) &&
1371
- identical (record.item, key )) {
1364
+ for (record = _head ; record != null ; record = record._nextDup) {
1365
+ if ((afterIndex == null || afterIndex < record.currentIndex) &&
1366
+ identical (record.item, item )) {
1372
1367
return record;
1373
1368
}
1374
1369
}
1375
- return record ;
1370
+ return null ;
1376
1371
}
1377
1372
1378
1373
/**
@@ -1382,8 +1377,8 @@ class _DuplicateItemRecordList {
1382
1377
*/
1383
1378
bool remove (ItemRecord record) {
1384
1379
assert (() {
1385
- // verify that the record being removed is someplace in the list.
1386
- for (ItemRecord cursor = head ; cursor != null ; cursor = cursor._nextDup) {
1380
+ // verify that the record being removed is in the list.
1381
+ for (ItemRecord cursor = _head ; cursor != null ; cursor = cursor._nextDup) {
1387
1382
if (identical (cursor, record)) return true ;
1388
1383
}
1389
1384
return false ;
@@ -1392,16 +1387,16 @@ class _DuplicateItemRecordList {
1392
1387
var prev = record._prevDup;
1393
1388
var next = record._nextDup;
1394
1389
if (prev == null ) {
1395
- head = next;
1390
+ _head = next;
1396
1391
} else {
1397
1392
prev._nextDup = next;
1398
1393
}
1399
1394
if (next == null ) {
1400
- tail = prev;
1395
+ _tail = prev;
1401
1396
} else {
1402
1397
next._prevDup = prev;
1403
1398
}
1404
- return head == null ;
1399
+ return _head == null ;
1405
1400
}
1406
1401
}
1407
1402
@@ -1414,21 +1409,20 @@ class _DuplicateItemRecordList {
1414
1409
class DuplicateMap {
1415
1410
final map = < dynamic , _DuplicateItemRecordList > {};
1416
1411
1417
- void put (ItemRecord record, [ItemRecord beforeRecord = null ]) {
1418
- map.putIfAbsent (record.item, () => new _DuplicateItemRecordList ())
1419
- .add (record, beforeRecord);
1412
+ void put (ItemRecord record, [ItemRecord insertBefore = null ]) {
1413
+ map.putIfAbsent (record.item, () => new _DuplicateItemRecordList ()).add (record, insertBefore);
1420
1414
}
1421
1415
1422
1416
/**
1423
1417
* Retrieve the `value` using [key] . Because the [ItemRecord] value maybe one which we have
1424
- * already iterated over, we use the [hideIndex ] to pretend it is not there.
1418
+ * already iterated over, we use the [afterIndex ] to pretend it is not there.
1425
1419
*
1426
1420
* Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
1427
1421
* have any more `a` s needs to return the last `a` not the first or second.
1428
1422
*/
1429
- ItemRecord get (key, [int hideIndex ]) {
1423
+ ItemRecord get (key, [int afterIndex ]) {
1430
1424
_DuplicateItemRecordList recordList = map[key];
1431
- return recordList == null ? null : recordList.get (key, hideIndex );
1425
+ return recordList == null ? null : recordList.get (key, afterIndex );
1432
1426
}
1433
1427
1434
1428
/**
@@ -1437,8 +1431,9 @@ class DuplicateMap {
1437
1431
* The list of duplicates also is removed from the map if it gets empty.
1438
1432
*/
1439
1433
ItemRecord remove (ItemRecord record) {
1434
+ assert (map.containsKey (record.item));
1440
1435
_DuplicateItemRecordList recordList = map[record.item];
1441
- assert (recordList != null );
1436
+ // Remove the list of duplicates when it gets empty
1442
1437
if (recordList.remove (record)) map.remove (record.item);
1443
1438
return record;
1444
1439
}
@@ -1449,5 +1444,5 @@ class DuplicateMap {
1449
1444
map.clear ();
1450
1445
}
1451
1446
1452
- String toString () => "$ runtimeType ($map )" ;
1447
+ String toString () => "DuplicateMap ($map )" ;
1453
1448
}
0 commit comments