| // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of observable.src.differs; |
| |
| /// Determines differences between two maps, returning [MapChangeRecord]s. |
| /// |
| /// While [MapChangeRecord] has more information and can be replayed they carry |
| /// a more significant cost to calculate and create and should only be used when |
| /// the details in the record will actually be used. |
| /// |
| /// See also [EqualityDiffer] for a simpler comparison. |
| class MapDiffer<K, V> implements Differ<Map<K, V>> { |
| const MapDiffer(); |
| |
| @override |
| List<MapChangeRecord<K, V>> diff(Map<K, V> oldValue, Map<K, V> newValue) { |
| if (identical(oldValue, newValue)) { |
| return ChangeRecord.NONE; |
| } |
| final changes = <MapChangeRecord<K, V>>[]; |
| oldValue.forEach((oldK, oldV) { |
| final newV = newValue[oldK]; |
| if (newV == null && !newValue.containsKey(oldK)) { |
| changes.add(new MapChangeRecord<K, V>.remove(oldK, oldV)); |
| } else if (newV != oldV) { |
| changes.add(new MapChangeRecord<K, V>(oldK, oldV, newV)); |
| } |
| }); |
| newValue.forEach((newK, newV) { |
| if (!oldValue.containsKey(newK)) { |
| changes.add(new MapChangeRecord<K, V>.insert(newK, newV)); |
| } |
| }); |
| return freezeInDevMode(changes); |
| } |
| } |