ChangeSet class
A representation of a change of map like object.
class ChangeSet { /** * Contains mapping between the changed children and respective changes. * * The changes are represented either by [ChangeSet] object or by [Change]. */ Map changedItems = new Map(); /** * Creates an empty [ChangeSet]. */ ChangeSet([Map changedItems = const {}]) { this.changedItems = new Map.from(changedItems); } /** * Creates [ChangeSet] from [other] */ ChangeSet.from(ChangeSet changeSet) { changeSet.changedItems.forEach((key, change) { changedItems[key] = change.clone(); }); } bool equals (dynamic other) { if (other is ChangeSet){ if (this.changedItems.keys.length != other.changedItems.keys.length) return false; for (var k in changedItems.keys){ var v = changedItems[k]; if (v is Change || v is ChangeSet) { if (!v.equals(other.changedItems[k])){ return false; } } else { return false; } } return true; } else { return false; } } /** * Clone changeSet. */ ChangeSet clone() { return new ChangeSet.from(this); } /** * Marks [key] as added with value [value]. */ void markAdded(dynamic key, dynamic value) { markChanged(key, new Change(undefined, value)); } void markRemoved(dynamic key, dynamic value) { markChanged(key, new Change(value, undefined)); } Set get addedItems { var res = new Set(); changedItems.forEach((key, dynamic change){ if(change is Change && change.oldValue == undefined){ res.add(key); } }); return res; } Set get removedItems { var res = new Set(); changedItems.forEach((key, dynamic change){ if(change is Change && change.newValue == undefined){ res.add(key); } }); return res; } get strictlyChanged { var res = {}; changedItems.forEach((key, dynamic change) { if(change is ChangeSet) res[key] = change; }); return res; } /** * Marks all the changes in [ChangeSet] or [Change] for a * given [dataObj]. */ void markChanged(dynamic key, change) { bool contains = changedItems.containsKey(key); bool oldIsChangeSet = contains && changedItems[key] is ChangeSet; bool newIsChangeSet = change is ChangeSet; bool oldIsChange = !oldIsChangeSet; bool newIsChange = !newIsChangeSet; if (!contains || oldIsChangeSet && newIsChange) { changedItems[key] = change.clone(); return; } if (oldIsChange && newIsChange || oldIsChangeSet && newIsChangeSet){ changedItems[key].mergeIn(change); return; } if (oldIsChange && newIsChangeSet) { // do nothing return; } // previous ifs should contain all possible cases assert(false); } /** * Merges two [ChangeSet]s together. */ void mergeIn(ChangeSet changeSet) { changeSet.changedItems.forEach((key, changeSet) { markChanged(key, changeSet); }); } /** * Returns true if there are no changes in the [ChangeSet]. */ bool get isEmpty => this.changedItems.isEmpty; String toString() { return 'ChangeSet(${changedItems.toString()})'; } }
Constructors
Properties
final Set addedItems #
Set get addedItems { var res = new Set(); changedItems.forEach((key, dynamic change){ if(change is Change && change.oldValue == undefined){ res.add(key); } }); return res; }
final bool isEmpty #
Returns true if there are no changes in the ChangeSet.
bool get isEmpty => this.changedItems.isEmpty;
final Set removedItems #
Set get removedItems { var res = new Set(); changedItems.forEach((key, dynamic change){ if(change is Change && change.newValue == undefined){ res.add(key); } }); return res; }
final strictlyChanged #
get strictlyChanged { var res = {}; changedItems.forEach((key, dynamic change) { if(change is ChangeSet) res[key] = change; }); return res; }
Methods
bool equals(other) #
bool equals (dynamic other) { if (other is ChangeSet){ if (this.changedItems.keys.length != other.changedItems.keys.length) return false; for (var k in changedItems.keys){ var v = changedItems[k]; if (v is Change || v is ChangeSet) { if (!v.equals(other.changedItems[k])){ return false; } } else { return false; } } return true; } else { return false; } }
void markAdded(key, value) #
Marks key as added with value value.
void markAdded(dynamic key, dynamic value) { markChanged(key, new Change(undefined, value)); }
void markChanged(key, change) #
Marks all the changes in ChangeSet or Change for a
given dataObj
.
void markChanged(dynamic key, change) { bool contains = changedItems.containsKey(key); bool oldIsChangeSet = contains && changedItems[key] is ChangeSet; bool newIsChangeSet = change is ChangeSet; bool oldIsChange = !oldIsChangeSet; bool newIsChange = !newIsChangeSet; if (!contains || oldIsChangeSet && newIsChange) { changedItems[key] = change.clone(); return; } if (oldIsChange && newIsChange || oldIsChangeSet && newIsChangeSet){ changedItems[key].mergeIn(change); return; } if (oldIsChange && newIsChangeSet) { // do nothing return; } // previous ifs should contain all possible cases assert(false); }
void markRemoved(key, value) #
void markRemoved(dynamic key, dynamic value) { markChanged(key, new Change(value, undefined)); }