applyUpdate static method
apply update to single entry (internal)
Implementation
static Map<dynamic, dynamic> applyUpdate(
Map<dynamic, dynamic> entry, Map<dynamic, dynamic> changes,
[bool replace = false]) {
// clear entry if replace is true
if (replace) entry = <dynamic, dynamic>{};
// apply changes one after another
for (var keyOfChanges in changes.keys) {
if (keyOfChanges is Op) {
for (String p in changes[keyOfChanges].keys) {
var keyPath = p.split('.');
switch (keyOfChanges) {
// set value in entry
case Op.set:
{
entry = updateDeeply(
keyPath, entry, (value) => changes[keyOfChanges][p]);
break;
}
// remove path from entry
case Op.unset:
{
if (changes[keyOfChanges][p] == true) {
entry = removeDeeply(keyPath, entry);
}
break;
}
// set max int value
case Op.max:
{
entry = updateDeeply(
keyPath,
entry,
ifNum((value) => value > changes[keyOfChanges][p]
? changes[keyOfChanges][p]
: value),
0);
break;
}
// set min int value
case Op.min:
{
entry = updateDeeply(
keyPath,
entry,
ifNum((value) => value < changes[keyOfChanges][p]
? changes[keyOfChanges][p]
: value),
0);
break;
}
// increment value at path by x
case Op.increment:
{
entry = updateDeeply(keyPath, entry,
ifNum((value) => value += changes[keyOfChanges][p]), 0);
break;
}
// multiply value at path by x
case Op.multiply:
{
entry = updateDeeply(keyPath, entry,
ifNum((value) => value *= changes[keyOfChanges][p]), 0);
break;
}
// rename path to new path
case Op.rename:
{
entry = renameDeeply(keyPath, changes[keyOfChanges][p], entry);
break;
}
default:
{
throw 'invalid';
}
}
}
} else {
// set new value
entry[keyOfChanges] = changes[keyOfChanges];
}
}
return entry;
}