diff options
Diffstat (limited to 'src/main/java/bjc/funcdata/TransformedValueMap.java')
| -rw-r--r-- | src/main/java/bjc/funcdata/TransformedValueMap.java | 87 |
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 |
