summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/funcdata/TransformedValueMap.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2019-07-02 18:05:22 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2019-07-02 18:05:22 -0400
commit843329de434bb334d90927c4d22345373a388530 (patch)
treeb0ad1f764bd29ff43841e1095a5b58194c20cb37 /src/main/java/bjc/funcdata/TransformedValueMap.java
parentac36f171a3cebb0993cc28548635e3f654f8e325 (diff)
Rename package root
The package root is now bjc, not io.github.bculkin2442.
Diffstat (limited to 'src/main/java/bjc/funcdata/TransformedValueMap.java')
-rw-r--r--src/main/java/bjc/funcdata/TransformedValueMap.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/main/java/bjc/funcdata/TransformedValueMap.java b/src/main/java/bjc/funcdata/TransformedValueMap.java
new file mode 100644
index 0000000..0f0b3b5
--- /dev/null
+++ b/src/main/java/bjc/funcdata/TransformedValueMap.java
@@ -0,0 +1,116 @@
+package bjc.funcdata;
+
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * A map that transforms values from one type to another
+ *
+ * @author ben
+ *
+ * @param <OldKey>
+ * The type of the map's keys
+ *
+ * @param <OldValue>
+ * The type of the map's values
+ *
+ * @param <NewValue>
+ * The type of the transformed values
+ *
+ */
+final class TransformedValueMap<OldKey, OldValue, NewValue> implements IMap<OldKey, NewValue> {
+ /* Our backing map. */
+ private final IMap<OldKey, OldValue> backing;
+ /* Our transforming function. */
+ private final Function<OldValue, NewValue> transformer;
+
+ /**
+ * Create a new transformed-value loop.
+ *
+ * @param backingMap
+ * The map to use as backing.
+ *
+ * @param transform
+ * The function to use for the transform.
+ */
+ public TransformedValueMap(final IMap<OldKey, OldValue> backingMap,
+ final Function<OldValue, NewValue> transform) {
+ backing = backingMap;
+ transformer = transform;
+ }
+
+ @Override
+ public void clear() {
+ backing.clear();
+ }
+
+ @Override
+ public boolean containsKey(final OldKey key) {
+ return backing.containsKey(key);
+ }
+
+ @Override
+ public IMap<OldKey, NewValue> extend() {
+ return new ExtendedMap<>(this, new FunctionalMap<>());
+ }
+
+ @Override
+ public void forEach(final BiConsumer<OldKey, NewValue> action) {
+ backing.forEach((key, value) -> {
+ action.accept(key, transformer.apply(value));
+ });
+ }
+
+ @Override
+ public void forEachKey(final Consumer<OldKey> action) {
+ backing.forEachKey(action);
+ }
+
+ @Override
+ public void forEachValue(final Consumer<NewValue> action) {
+ backing.forEachValue(value -> {
+ action.accept(transformer.apply(value));
+ });
+ }
+
+ @Override
+ public NewValue get(final OldKey key) {
+ return transformer.apply(backing.get(key));
+ }
+
+ @Override
+ public int size() {
+ return backing.size();
+ }
+
+ @Override
+ public IList<OldKey> keyList() {
+ return backing.keyList();
+ }
+
+ @Override
+ public <MappedValue> IMap<OldKey, MappedValue> transform(final Function<NewValue, MappedValue> transform) {
+ return new TransformedValueMap<>(this, transform);
+ }
+
+ @Override
+ public NewValue put(final OldKey key, final NewValue value) {
+ throw new UnsupportedOperationException("Can't add items to transformed map");
+ }
+
+ @Override
+ public NewValue remove(final OldKey key) {
+ return transformer.apply(backing.remove(key));
+ }
+
+ @Override
+ public String toString() {
+ return backing.toString();
+ }
+
+ @Override
+ public IList<NewValue> valueList() {
+ return backing.valueList().map(transformer);
+ }
+}