removeValuesWhere method

IMapOfSets<K, V> removeValuesWhere(
  1. bool test(
    1. K key,
    2. V value
    ), {
  2. Output<int>? numberOfRemovedValues,
})

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