summaryrefslogtreecommitdiff
path: root/src/main/java/bjc
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-11-21 22:53:56 -0500
committerBen Culkin <scorpress@gmail.com>2020-11-21 22:53:56 -0500
commit86ad50b4df6166c6f99b08d91d49fe59ee754619 (patch)
tree75465a1fa0a99b9c83026953b6a2ed0d736c0a93 /src/main/java/bjc
parentc3954bbe63378324762a6cdd5caf363405340973 (diff)
Change IMap to use Optional, not exceptions
IMap now returns optionals, instead of throwing an exception
Diffstat (limited to 'src/main/java/bjc')
-rw-r--r--src/main/java/bjc/esodata/PushdownMap.java24
-rw-r--r--src/main/java/bjc/esodata/SimpleDirectory.java4
-rw-r--r--src/main/java/bjc/esodata/UnifiedDirectory.java4
-rw-r--r--src/main/java/bjc/funcdata/ExtendedMap.java2
-rw-r--r--src/main/java/bjc/funcdata/FunctionalMap.java16
-rw-r--r--src/main/java/bjc/funcdata/IMap.java48
-rw-r--r--src/main/java/bjc/funcdata/TransformedValueMap.java5
7 files changed, 44 insertions, 59 deletions
diff --git a/src/main/java/bjc/esodata/PushdownMap.java b/src/main/java/bjc/esodata/PushdownMap.java
index a30161c..410eb53 100644
--- a/src/main/java/bjc/esodata/PushdownMap.java
+++ b/src/main/java/bjc/esodata/PushdownMap.java
@@ -1,7 +1,9 @@
package bjc.esodata;
+import java.util.*;
import java.util.function.*;
+import bjc.data.*;
import bjc.funcdata.*;
/**
@@ -48,8 +50,8 @@ public class PushdownMap<KeyType, ValueType> implements IMap<KeyType, ValueType>
}
@Override
- public ValueType get(final KeyType key) {
- return backing.get(key).top();
+ public Optional<ValueType> get(final KeyType key) {
+ return backing.get(key).map((stack) -> stack.top());
}
@Override
@@ -67,7 +69,7 @@ public class PushdownMap<KeyType, ValueType> implements IMap<KeyType, ValueType>
if (isFrozen) throw new ObjectFrozen("Can't insert key " + key + " into frozen map");
if (backing.containsKey(key)) {
- final Stack<ValueType> stk = backing.get(key);
+ final Stack<ValueType> stk = backing.get(key).get();
final ValueType vl = stk.top();
@@ -86,12 +88,18 @@ public class PushdownMap<KeyType, ValueType> implements IMap<KeyType, ValueType>
@Override
public ValueType remove(final KeyType key) {
if (isFrozen) throw new ObjectFrozen("Can't remove key " + key + " from frozen map");
-
- final Stack<ValueType> stk = backing.get(key);
-
- if (stk.size() > 1) return stk.pop();
- return backing.remove(key).top();
+ IHolder<ValueType> result = IHolder.of(null);
+
+ backing.get(key).ifPresent((stk) -> {
+ if (stk.size() > 1) {
+ result.replace(stk.pop());
+ } else {
+ result.replace(backing.remove(key).top());
+ }
+ });
+
+ return result.getValue();
}
@Override
diff --git a/src/main/java/bjc/esodata/SimpleDirectory.java b/src/main/java/bjc/esodata/SimpleDirectory.java
index 36f5f5a..ddc65b4 100644
--- a/src/main/java/bjc/esodata/SimpleDirectory.java
+++ b/src/main/java/bjc/esodata/SimpleDirectory.java
@@ -30,7 +30,7 @@ public class SimpleDirectory<K, V> implements Directory<K, V> {
@Override
public Directory<K, V> getSubdirectory(final K key) {
- return children.get(key);
+ return children.get(key).orElse(null);
}
@Override
@@ -50,7 +50,7 @@ public class SimpleDirectory<K, V> implements Directory<K, V> {
@Override
public V getKey(final K key) {
- return data.get(key);
+ return data.get(key).orElse(null);
}
@Override
diff --git a/src/main/java/bjc/esodata/UnifiedDirectory.java b/src/main/java/bjc/esodata/UnifiedDirectory.java
index dcbac89..abf9a4c 100644
--- a/src/main/java/bjc/esodata/UnifiedDirectory.java
+++ b/src/main/java/bjc/esodata/UnifiedDirectory.java
@@ -30,7 +30,7 @@ public class UnifiedDirectory<K, V> implements Directory<K, V> {
@Override
public Directory<K, V> getSubdirectory(final K key) {
- return children.get(key);
+ return children.get(key).orElse(null);
}
@Override
@@ -56,7 +56,7 @@ public class UnifiedDirectory<K, V> implements Directory<K, V> {
@Override
public V getKey(final K key) {
- return data.get(key);
+ return data.get(key).orElse(null);
}
@Override
diff --git a/src/main/java/bjc/funcdata/ExtendedMap.java b/src/main/java/bjc/funcdata/ExtendedMap.java
index 059181f..9638cdc 100644
--- a/src/main/java/bjc/funcdata/ExtendedMap.java
+++ b/src/main/java/bjc/funcdata/ExtendedMap.java
@@ -60,7 +60,7 @@ class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> {
}
@Override
- public ValueType get(final KeyType key) {
+ public Optional<ValueType> get(final KeyType key) {
if (store.containsKey(key)) return store.get(key);
else return delegate.get(key);
}
diff --git a/src/main/java/bjc/funcdata/FunctionalMap.java b/src/main/java/bjc/funcdata/FunctionalMap.java
index 9836c98..3ab2598 100644
--- a/src/main/java/bjc/funcdata/FunctionalMap.java
+++ b/src/main/java/bjc/funcdata/FunctionalMap.java
@@ -73,16 +73,14 @@ public class FunctionalMap<KeyType, ValueType> implements IMap<KeyType, ValueTyp
}
@Override
- public ValueType get(final KeyType key) {
+ public Optional<ValueType> get(final KeyType key) {
if (key == null) throw new NullPointerException("Key must not be null");
- if (!wrappedMap.containsKey(key)) {
- final String msg = String.format("Key %s is not present in the map", key);
-
- throw new IllegalArgumentException(msg);
+ if (wrappedMap.containsKey(key)) {
+ return Optional.of(wrappedMap.get(key));
+ } else {
+ return Optional.empty();
}
-
- return wrappedMap.get(key);
}
@Override
@@ -138,8 +136,8 @@ public class FunctionalMap<KeyType, ValueType> implements IMap<KeyType, ValueTyp
if (wrappedMap == null) {
if (other.wrappedMap != null) return false;
} else if (!wrappedMap.equals(other.wrappedMap)) {
- return false;
- }
+ return false;
+ }
return true;
}
diff --git a/src/main/java/bjc/funcdata/IMap.java b/src/main/java/bjc/funcdata/IMap.java
index 4eaa9c0..ca9ef11 100644
--- a/src/main/java/bjc/funcdata/IMap.java
+++ b/src/main/java/bjc/funcdata/IMap.java
@@ -1,5 +1,6 @@
package bjc.funcdata;
+import java.util.*;
import java.util.function.*;
/**
@@ -60,31 +61,7 @@ public interface IMap<KeyType, ValueType> extends IFreezable {
*
* @return The value of the key.
*/
- ValueType get(KeyType key);
-
- /**
- * Get a value from the map, and return a default value if the key doesn't
- * exist.
- *
- * @param key
- * The key to attempt to retrieve.
- *
- * @param defaultValue
- * The value to return if the key doesn't exist.
- *
- * @return The value associated with the key, or the default value if the key
- * doesn't exist.
- */
- default ValueType getOrDefault(final KeyType key, final ValueType defaultValue) {
- try {
- return get(key);
- } catch (final IllegalArgumentException iaex) {
- /*
- * We don't care about this, because it indicates a key is missing.
- */
- return defaultValue;
- }
- }
+ Optional<ValueType> get(KeyType key);
/**
* Add an entry to the map.
@@ -150,7 +127,7 @@ public interface IMap<KeyType, ValueType> extends IFreezable {
final IList<ValueType> returns = new FunctionalList<>();
for (final KeyType key : keyList()) {
- returns.add(get(key));
+ returns.add(get(key).orElse(null));
}
return returns;
@@ -191,17 +168,18 @@ public interface IMap<KeyType, ValueType> extends IFreezable {
return extend(new FunctionalMap<>());
};
+
/**
- * Extends this map, creating a new map that will delegate queries to this map,
- * but store any added values in the provided map.
- *
- * @param backer The map to store added values in.
- *
- * @return An extended map.
- */
+ * Extend this map, creating a new map that will delegate queries to
+ * the current map but store any added values in the provided map.
+ *
+ * @param backer The map to store values in.
+ *
+ * @return An extended map, with the specified backing map.
+ */
default IMap<KeyType, ValueType> extend(IMap<KeyType, ValueType> backer) {
- return new ExtendedMap<>(this, backer);
- };
+ return new ExtendedMap<>(this, backer);
+ };
/**
* Static method to create a basic instance of IMap.
diff --git a/src/main/java/bjc/funcdata/TransformedValueMap.java b/src/main/java/bjc/funcdata/TransformedValueMap.java
index cf4a9d8..1e0ef51 100644
--- a/src/main/java/bjc/funcdata/TransformedValueMap.java
+++ b/src/main/java/bjc/funcdata/TransformedValueMap.java
@@ -1,5 +1,6 @@
package bjc.funcdata;
+import java.util.*;
import java.util.function.*;
/**
@@ -62,8 +63,8 @@ final class TransformedValueMap<OldKey, OldValue, NewValue>
}
@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