diff options
Diffstat (limited to 'src/main/java/bjc/funcdata/ExtendedMap.java')
| -rw-r--r-- | src/main/java/bjc/funcdata/ExtendedMap.java | 157 |
1 files changed, 76 insertions, 81 deletions
diff --git a/src/main/java/bjc/funcdata/ExtendedMap.java b/src/main/java/bjc/funcdata/ExtendedMap.java index bd500f4..379ff65 100644 --- a/src/main/java/bjc/funcdata/ExtendedMap.java +++ b/src/main/java/bjc/funcdata/ExtendedMap.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.*; /** * An extended version of a map, that stores values into a map, but can look @@ -16,12 +15,15 @@ import java.util.function.Function; * @param <ValueType> * The type of the values of the map. */ -class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { +class ExtendedMap<KeyType, ValueType> implements MapEx<KeyType, ValueType> { /* The map we delegate lookups to. */ - private final IMap<KeyType, ValueType> delegate; + private final MapEx<KeyType, ValueType> delegate; /* The map we store things in. */ - private final IMap<KeyType, ValueType> store; + private final MapEx<KeyType, ValueType> store; + private boolean isFrozen = false; + private boolean thawEnabled = true; + /** * Create a new extended map. * @@ -31,28 +33,23 @@ class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { * @param store * The map to store things in. */ - public ExtendedMap(final IMap<KeyType, ValueType> delegate, - final IMap<KeyType, ValueType> store) { + public ExtendedMap(final MapEx<KeyType, ValueType> delegate, + final MapEx<KeyType, ValueType> store) { this.delegate = delegate; this.store = store; } @Override public void clear() { + if (isFrozen) return; + store.clear(); } @Override public boolean containsKey(final KeyType key) { - if (store.containsKey(key)) - return true; - - return delegate.containsKey(key); - } - - @Override - public IMap<KeyType, ValueType> extend() { - return new ExtendedMap<>(this, new FunctionalMap<>()); + if (store.containsKey(key)) return true; + else return delegate.containsKey(key); } @Override @@ -63,25 +60,9 @@ class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { } @Override - public void forEachKey(final Consumer<KeyType> action) { - store.forEachKey(action); - - delegate.forEachKey(action); - } - - @Override - public void forEachValue(final Consumer<ValueType> action) { - store.forEachValue(action); - - delegate.forEachValue(action); - } - - @Override - public ValueType get(final KeyType key) { - if (store.containsKey(key)) - return store.get(key); - - return delegate.get(key); + public Optional<ValueType> get(final KeyType key) { + if (store.containsKey(key)) return store.get(key); + else return delegate.get(key); } @Override @@ -90,8 +71,8 @@ class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { } @Override - public IList<KeyType> keyList() { - IList<KeyType> ilst = new FunctionalList<>(); + public ListEx<KeyType> keyList() { + ListEx<KeyType> ilst = new FunctionalList<>(); ilst.addAll(store.keyList()); ilst.addAll(delegate.keyList()); @@ -100,70 +81,84 @@ class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { } @Override - public <MappedValue> IMap<KeyType, MappedValue> - transform(final Function<ValueType, MappedValue> transformer) { - return new TransformedValueMap<>(this, transformer); - } - - @Override public ValueType put(final KeyType key, final ValueType val) { + if (isFrozen) + throw new ObjectFrozen("Can't insert key " + key + " into frozen map"); + return store.put(key, val); } @Override public ValueType remove(final KeyType key) { - if (!store.containsKey(key)) - return delegate.remove(key); - - return store.remove(key); + if (isFrozen) + throw new ObjectFrozen("Can't remove key " + key + " from frozen map"); + + if (!store.containsKey(key)) return delegate.remove(key); + else return store.remove(key); } @Override - public IList<ValueType> valueList() { - IList<ValueType> ilst = new FunctionalList<>(); + public int hashCode() { + // isFrozen isn't counted + return Objects.hash(delegate, store); + } - ilst.addAll(store.valueList()); - ilst.addAll(delegate.valueList()); + /* Misc. object support. */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; - return ilst; - } + ExtendedMap<?, ?> other = (ExtendedMap<?, ?>) obj; - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (delegate == null ? 0 : delegate.hashCode()); - result = prime * result + (store == null ? 0 : store.hashCode()); - return result; + // isFrozen isn't counted + return Objects.equals(delegate, other.delegate) && Objects.equals(store, other.store); + } + + @Override + public String toString() { + return String.format("ExtendedMap [delegate=%s, store=%s]", delegate, store); } + /* IFreezable support */ + @Override - public boolean equals(final Object obj) { - if (this == obj) + public boolean freeze() { + isFrozen = true; + return true; - if (obj == null) - return false; - if (!(obj instanceof ExtendedMap)) - return false; + } - final ExtendedMap<?, ?> other = (ExtendedMap<?, ?>) obj; + @Override + public boolean deepFreeze() { + thawEnabled = false; - if (delegate == null) { - if (other.delegate != null) - return false; - } else if (!delegate.equals(other.delegate)) - return false; - if (store == null) { - if (other.store != null) - return false; - } else if (!store.equals(other.store)) + return freeze(); + } + + @Override + public boolean thaw() { + if (thawEnabled) { + isFrozen = false; + return true; + } else { return false; + } + } + @Override + public boolean isFrozen() { + return isFrozen; + } + + @Override + public boolean canFreeze() { return true; } - + @Override - public String toString() { - return String.format("ExtendedMap [delegate=%s, store=%s]", delegate, store); + public boolean canThaw() { + return thawEnabled; } -} +}
\ No newline at end of file |
