Dart Documentationclean_dataChangeSet

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

new ChangeSet([Map changedItems = const{}]) #

Creates an empty ChangeSet.

ChangeSet([Map changedItems = const {}]) {
 this.changedItems = new Map.from(changedItems);
}

new ChangeSet.from(ChangeSet changeSet) #

Creates ChangeSet from other

ChangeSet.from(ChangeSet changeSet) {
 changeSet.changedItems.forEach((key, change) {
   changedItems[key] = change.clone();
 });
}

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;
}

Map changedItems #

Contains mapping between the changed children and respective changes.

The changes are represented either by ChangeSet object or by Change.

Map changedItems = new Map()

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

ChangeSet clone() #

Clone changeSet.

ChangeSet clone() {
 return new ChangeSet.from(this);
}

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));
}

void mergeIn(ChangeSet changeSet) #

Merges two ChangeSets together.

void mergeIn(ChangeSet changeSet) {
 changeSet.changedItems.forEach((key, changeSet) {
   markChanged(key, changeSet);
 });
}

String toString() #

Returns a string representation of this object.

docs inherited from Object
String toString() {
 return 'ChangeSet(${changedItems.toString()})';
}