|
24 | 24 | package org.incendo.cloud.processors.cache; |
25 | 25 |
|
26 | 26 | import java.util.Optional; |
| 27 | +import java.util.function.Function; |
27 | 28 | import org.apiguardian.api.API; |
28 | 29 | import org.checkerframework.checker.nullness.qual.NonNull; |
29 | 30 | import org.checkerframework.checker.nullness.qual.Nullable; |
30 | 31 |
|
| 32 | +import static java.util.Objects.requireNonNull; |
| 33 | + |
31 | 34 | /** |
32 | 35 | * Something that caches values. |
33 | 36 | * |
@@ -89,4 +92,41 @@ public interface CloudCache<K, V> { |
89 | 92 | default @NonNull Optional<V> get(final @NonNull K key) { |
90 | 93 | return Optional.ofNullable(this.getIfPresent(key)); |
91 | 94 | } |
| 95 | + |
| 96 | + /** |
| 97 | + * Returns a view of this cache with an adapted key type. |
| 98 | + * |
| 99 | + * @param keyExtractor key extractor |
| 100 | + * @param <K1> key type for the view |
| 101 | + * @return new view |
| 102 | + */ |
| 103 | + default <K1> @NonNull CloudCache<K1, V> keyExtractingView(final @NonNull Function<K1, K> keyExtractor) { |
| 104 | + requireNonNull(keyExtractor, "keyExtractor"); |
| 105 | + return new CloudCache<>() { |
| 106 | + @Override |
| 107 | + public void delete(final @NonNull K1 key) { |
| 108 | + CloudCache.this.delete(keyExtractor.apply(key)); |
| 109 | + } |
| 110 | + |
| 111 | + @Override |
| 112 | + public void put(final @NonNull K1 key, final @NonNull V value) { |
| 113 | + CloudCache.this.put(keyExtractor.apply(key), value); |
| 114 | + } |
| 115 | + |
| 116 | + @Override |
| 117 | + public @Nullable V getIfPresent(final @NonNull K1 key) { |
| 118 | + return CloudCache.this.getIfPresent(keyExtractor.apply(key)); |
| 119 | + } |
| 120 | + |
| 121 | + @Override |
| 122 | + public @Nullable V popIfPresent(final @NonNull K1 key) { |
| 123 | + return CloudCache.this.popIfPresent(keyExtractor.apply(key)); |
| 124 | + } |
| 125 | + |
| 126 | + @Override |
| 127 | + public @NonNull Optional<V> get(final @NonNull K1 key) { |
| 128 | + return CloudCache.this.get(keyExtractor.apply(key)); |
| 129 | + } |
| 130 | + }; |
| 131 | + } |
92 | 132 | } |
0 commit comments