code: def FilterItems(self, filterFn, key=None):
      
      with self._mutex:
        if key:
          if key in self._buckets:
            return self._buckets[key].FilterItems(filterFn)
          else:
            return 0
        else:
          return sum(bucket.FilterItems(filterFn)
                     for bucket in self._buckets.values())
docs: Filter items within a Reservoir, using a filtering function.
  
      Args:
        filterFn: A function that returns True for the items to be kept.
        key: An optional bucket key to filter. If not specified, will filter all
          all buckets.
  
      Returns:
        The number of items removed.