code: public<V> void consolidate(Function<E,V> convertAdds, Function<K,V> convertDels) {
          if (hasDeletions() && hasAdditions()) {
              Set<V> adds = Sets.newHashSet(Iterables.transform(additions,convertAdds));
              Iterator<K> iter = deletions.iterator();
              while (iter.hasNext()) {
                  if (adds.contains(convertDels.apply(iter.next()))) iter.remove();
              }
          }
      }
docs: Consolidates this mutation by removing redundant deletions. A deletion is considered redundant if
  it is identical to some addition under the provided conversion functions since we consider additions to apply logically after deletions.
  Hence, such a deletion would be applied and immediately overwritten by an addition. To avoid this
  inefficiency, consolidation should be called.
  </p>
  The provided conversion functions map additions and deletions into some object space V for comparison.
  An addition is considered identical to a deletion if both map to the same object (i.e. equals=true) with the respective
  conversion functions.
  </p>
  It needs to be ensured that V objects have valid hashCode() and equals() implementations.
  
  @param convertAdds Function which maps additions onto comparison objects.
  @param convertDels Function which maps deletions onto comparison objects.