public static @NotNull <K, V> SLRUCache<K, V> slruCache(int protectedQueueSize,
                                                          int probationalQueueSize,
                                                          @NotNull Function<@NotNull K, @NotNull V> valueProducer) {
    return new SLRUCache<K, V>(protectedQueueSize, probationalQueueSize) {
      @Override
      public @NotNull V createValue(K key) {
        return valueProducer.apply(key);
      }
    };
  }
public static @NotNull <K, V> SLRUCache<K, V> slruCache(int protectedQueueSize,
                                                          int probationalQueueSize,
                                                          @NotNull Function<@NotNull K, @NotNull V> valueProducer)