From 213171f95845ebc5efcfa73d1cab4b723ff2abf2 Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Tue, 17 Nov 2020 17:44:05 -0500 Subject: Implement IFreezable for IMap --- src/main/java/bjc/funcdata/FunctionalMap.java | 108 +++++++++++++++----------- 1 file changed, 64 insertions(+), 44 deletions(-) (limited to 'src/main/java/bjc/funcdata/FunctionalMap.java') diff --git a/src/main/java/bjc/funcdata/FunctionalMap.java b/src/main/java/bjc/funcdata/FunctionalMap.java index aba3dd1..c088ff3 100644 --- a/src/main/java/bjc/funcdata/FunctionalMap.java +++ b/src/main/java/bjc/funcdata/FunctionalMap.java @@ -1,12 +1,9 @@ package bjc.funcdata; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; +import java.util.*; +import java.util.function.*; -import bjc.data.IPair; +import bjc.data.*; /** * Basic implementation of {@link IMap} @@ -23,6 +20,9 @@ public class FunctionalMap implements IMap wrappedMap; + private boolean isFrozen = false; + private boolean thawEnabled = true; + /** Create a new blank functional map */ public FunctionalMap() { wrappedMap = new HashMap<>(); @@ -39,9 +39,7 @@ public class FunctionalMap implements IMap entry : entries) { - entry.doWith((key, val) -> { - wrappedMap.put(key, val); - }); + entry.doWith(wrappedMap::put); } } @@ -52,14 +50,15 @@ public class FunctionalMap implements IMap wrap) { - if (wrap == null) - throw new NullPointerException("Map to wrap must not be null"); + if (wrap == null) throw new NullPointerException("Map to wrap must not be null"); wrappedMap = wrap; } @Override public void clear() { + if (isFrozen) throw new ObjectFrozen("Can't clear frozen map"); + wrappedMap.clear(); } @@ -68,11 +67,6 @@ public class FunctionalMap implements IMap extend() { - return new ExtendedMap<>(this, new FunctionalMap<>()); - } - @Override public void forEach(final BiConsumer action) { wrappedMap.forEach(action); @@ -90,8 +84,7 @@ public class FunctionalMap implements IMap implements IMap keyList() { final FunctionalList keys = new FunctionalList<>(); - wrappedMap.keySet().forEach(key -> { - keys.add(key); - }); + wrappedMap.keySet().forEach(keys::add); return keys; } - @Override - public IMap - transform(final Function transformer) { - if (transformer == null) - throw new NullPointerException("Transformer must not be null"); - - return new TransformedValueMap<>(this, transformer); - } - @Override public ValueType put(final KeyType key, final ValueType val) { - if (key == null) - throw new NullPointerException("Key must not be null"); + if (isFrozen) throw new ObjectFrozen("Can't put key " + key + " into frozen map"); + if (key == null) throw new NullPointerException("Key must not be null"); return wrappedMap.put(key, val); } @Override public ValueType remove(final KeyType key) { + if (isFrozen) throw new ObjectFrozen("Can't remove key " + key + " from frozen map"); + return wrappedMap.remove(key); } @@ -149,9 +133,7 @@ public class FunctionalMap implements IMap valueList() { final FunctionalList values = new FunctionalList<>(); - wrappedMap.values().forEach(value -> { - values.add(value); - }); + wrappedMap.values().forEach(values::add); return values; } @@ -166,20 +148,58 @@ public class FunctionalMap implements IMap other = (FunctionalMap) obj; if (wrappedMap == null) { - if (other.wrappedMap != null) - return false; - } else if (!wrappedMap.equals(other.wrappedMap)) + if (other.wrappedMap != null) return false; + } else if (!wrappedMap.equals(other.wrappedMap)) { + return false; + } + + return true; + } + + // IFreezable support + @Override + public boolean freeze() { + isFrozen = true; + + return true; + } + + @Override + public boolean thaw() { + if (thawEnabled) { + isFrozen = false; + return true; + } else { return false; + } + } + + @Override + 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; + } } -- cgit v1.2.3