summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java b/BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java
new file mode 100644
index 0000000..75557fa
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/funcdata/TransformedValueMap.java
@@ -0,0 +1,100 @@
+package bjc.utils.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 IFunctionalMap<OldKey, NewValue> {
+ private IFunctionalMap<OldKey, OldValue> mapToTransform;
+ private Function<OldValue, NewValue> transformer;
+
+ public TransformedValueMap(IFunctionalMap<OldKey, OldValue> destMap,
+ Function<OldValue, NewValue> transform) {
+ mapToTransform = destMap;
+ transformer = transform;
+ }
+
+ @Override
+ public NewValue get(OldKey key) {
+ return transformer.apply(mapToTransform.get(key));
+ }
+
+ @Override
+ public boolean containsKey(OldKey key) {
+ return mapToTransform.containsKey(key);
+ }
+
+ @Override
+ public String toString() {
+ return mapToTransform.toString();
+ }
+
+ @Override
+ public NewValue put(OldKey key, NewValue val) {
+ throw new UnsupportedOperationException(
+ "Can't add items to transformed map");
+ }
+
+ @Override
+ public <MappedValue> IFunctionalMap<OldKey, MappedValue> mapValues(
+ Function<NewValue, MappedValue> transform) {
+ return new TransformedValueMap<>(this, transform);
+ }
+
+ @Override
+ public IFunctionalList<OldKey> keyList() {
+ return mapToTransform.keyList();
+ }
+
+ @Override
+ public void forEach(BiConsumer<OldKey, NewValue> action) {
+ mapToTransform.forEach((key, val) -> {
+ action.accept(key, transformer.apply(val));
+ });
+ }
+
+ @Override
+ public NewValue remove(OldKey key) {
+ return transformer.apply(mapToTransform.remove(key));
+ }
+
+ @Override
+ public int getSize() {
+ return mapToTransform.getSize();
+ }
+
+ @Override
+ public void forEachKey(Consumer<OldKey> action) {
+ mapToTransform.forEachKey(action);
+ }
+
+ @Override
+ public void forEachValue(Consumer<NewValue> action) {
+ mapToTransform.forEachValue((val) -> {
+ action.accept(transformer.apply(val));
+ });
+ }
+
+ @Override
+ public IFunctionalList<NewValue> valueList() {
+ return mapToTransform.valueList().map(transformer);
+ }
+
+ @Override
+ public IFunctionalMap<OldKey, NewValue> extend() {
+ return new ExtendedMap<>(this, new FunctionalMap<>());
+ }
+} \ No newline at end of file