docs: private MapEntryUpdateResult<K, byte[]> removeIf(long index, K key, Predicate<MapEntryValue> predicate) {
      MapEntryValue value = entries().get(key);
  
      // If the value does not exist or doesn't match the predicate, return a PRECONDITION_FAILED error.
      if (valueIsNull(value) || !predicate.test(value)) {
        return new MapEntryUpdateResult<>(MapEntryUpdateResult.Status.PRECONDITION_FAILED, index, key, null);
      }
  
      // If the key has been locked by a transaction, return a WRITE_LOCK error.
      if (preparedKeys.contains(key)) {
        return new MapEntryUpdateResult<>(MapEntryUpdateResult.Status.WRITE_LOCK, index, key, null);
      }
  
      // If no transactions are active, remove the key. Otherwise, replace it with a tombstone.
      if (activeTransactions.isEmpty()) {
        entries().remove(key);
      } else {
        entries().put(key, new MapEntryValue(MapEntryValue.Type.TOMBSTONE, index, null, 0, 0));
      }
  
      // Cancel the timer if one is scheduled.
      cancelTtl(value);
  
      Versioned<byte[]> result = toVersioned(value);
      publish(new AtomicMapEvent<>(AtomicMapEvent.Type.REMOVE, key, null, result));
      return new MapEntryUpdateResult<>(MapEntryUpdateResult.Status.OK, index, key, result);
    }