summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/funcdata/TransformedValueMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/funcdata/TransformedValueMap.java')
-rw-r--r--src/main/java/bjc/funcdata/TransformedValueMap.java87
1 files changed, 52 insertions, 35 deletions
diff --git a/src/main/java/bjc/funcdata/TransformedValueMap.java b/src/main/java/bjc/funcdata/TransformedValueMap.java
index 5de6fc3..643f610 100644
--- a/src/main/java/bjc/funcdata/TransformedValueMap.java
+++ b/src/main/java/bjc/funcdata/TransformedValueMap.java
@@ -1,8 +1,7 @@
package bjc.funcdata;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.*;
+import java.util.function.*;
/**
* A map that transforms values from one type to another
@@ -20,12 +19,15 @@ import java.util.function.Function;
*
*/
final class TransformedValueMap<OldKey, OldValue, NewValue>
- implements IMap<OldKey, NewValue> {
+ implements MapEx<OldKey, NewValue> {
/* Our backing map. */
- private final IMap<OldKey, OldValue> backing;
+ private final MapEx<OldKey, OldValue> backing;
/* Our transforming function. */
private final Function<OldValue, NewValue> transformer;
+ private boolean isFrozen = false;
+ private boolean thawEnabled = true;
+
/**
* Create a new transformed-value loop.
*
@@ -35,7 +37,7 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
* @param transform
* The function to use for the transform.
*/
- public TransformedValueMap(final IMap<OldKey, OldValue> backingMap,
+ public TransformedValueMap(final MapEx<OldKey, OldValue> backingMap,
final Function<OldValue, NewValue> transform) {
backing = backingMap;
transformer = transform;
@@ -43,6 +45,8 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
@Override
public void clear() {
+ if (isFrozen) throw new ObjectFrozen("Can't clear frozen map");
+
backing.clear();
}
@@ -52,11 +56,6 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
}
@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));
@@ -64,20 +63,8 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
}
@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));
+ public Optional<NewValue> get(final OldKey key) {
+ return backing.get(key).map(transformer);
}
@Override
@@ -86,23 +73,19 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
}
@Override
- public IList<OldKey> keyList() {
+ public ListEx<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) {
+ if (isFrozen) throw new ObjectFrozen("Can't remove key " + key + " from frozen map");
+
return transformer.apply(backing.remove(key));
}
@@ -110,9 +93,43 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
public String toString() {
return backing.toString();
}
+
+ @Override
+ public boolean freeze() {
+ isFrozen = true;
+
+ return true;
+ }
+
+ @Override
+ public boolean thaw() {
+ if (thawEnabled) {
+ isFrozen = false;
+ return true;
+ } else {
+ return false;
+ }
+ }
@Override
- public IList<NewValue> valueList() {
- return backing.valueList().map(transformer);
+ public boolean deepFreeze() {
+ thawEnabled = false;
+
+ return freeze();
+ }
+
+ @Override
+ public boolean canFreeze() {
+ return true;
+ }
+
+ @Override
+ public boolean canThaw() {
+ return thawEnabled;
+ }
+
+ @Override
+ public boolean isFrozen() {
+ return isFrozen;
}
-}
+} \ No newline at end of file