removeValuesWhere method
Remove, from all sets, all given values that satisfy the given test
.
If a set
becomes empty, its key
will be removed entirely.
If you want, you can pass numberOfRemovedValues
to get the number of removed values.
See also: removeValuesFromKeyWhere that lets you remove values from a single key.
Implementation
IMapOfSets<K, V> removeValuesWhere(
bool Function(K key, V value) test, {
Output<int>? numberOfRemovedValues,
}) {
int countRemoved = 0;
Map<K, ISet<V>> map = {};
for (MapEntry<K, ISet<V>> entry in _mapOfSets.entries) {
K key = entry.key;
ISet<V> set = entry.value;
int setLength = set.length;
ISet<V> newSet;
int newSetLength;
if (setLength == 0) {
newSet = set;
newSetLength = 0;
} else {
newSet = set.removeWhere((value) => test(key, value));
newSetLength = newSet.length;
}
countRemoved += setLength - newSetLength;
if (newSetLength == 0 && config.removeEmptySets) {
// Set is empty. Discard the key:set.
} else if (setLength == newSetLength) {
// Set was NOT modified.
map[key] = set;
} else {
// Set was modified.
map[key] = newSet;
}
}
if (numberOfRemovedValues != null) numberOfRemovedValues.save(countRemoved);
return (countRemoved == 0) ? this : IMapOfSets<K, V>._unsafe(map.lock, config);
}