From 50089fa6f8f220df3b3dc7905bcbc52c10137c25 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Sat, 24 Aug 2019 13:16:00 +0100 Subject: [PATCH] small refactor --- .../worth/serialization/ValueDumper.java | 8 +++---- .../worth/serialization/json/JSONDumper.java | 22 +++++++++---------- .../java/net/woggioni/worth/utils/Tuple2.java | 11 ++++++++++ .../net/woggioni/worth/value/ArrayValue.java | 5 +++++ .../net/woggioni/worth/value/ObjectValue.java | 12 ++++------ .../java/net/woggioni/worth/xface/Value.java | 8 +++++-- 6 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 src/main/java/net/woggioni/worth/utils/Tuple2.java diff --git a/src/main/java/net/woggioni/worth/serialization/ValueDumper.java b/src/main/java/net/woggioni/worth/serialization/ValueDumper.java index 1791585..ffcb051 100644 --- a/src/main/java/net/woggioni/worth/serialization/ValueDumper.java +++ b/src/main/java/net/woggioni/worth/serialization/ValueDumper.java @@ -57,7 +57,7 @@ public abstract class ValueDumper implements Dumper { } protected static class ArrayStackLevel extends StackLevel implements Iterator { - private final Iterator iterator = ((ArrayValue) value).iterator(); + private final Iterator iterator = value.asArray().iterator(); @Override public Value next() { @@ -70,13 +70,13 @@ public abstract class ValueDumper implements Dumper { return iterator.hasNext(); } - public ArrayStackLevel(ArrayValue value) { + public ArrayStackLevel(Value value) { super(value); } } protected static class ObjectStackLevel extends StackLevel implements Iterator> { - private final Iterator> iterator = ((ObjectValue) value).iterator(); + private final Iterator> iterator = value.asObject().iterator(); @Override public Map.Entry next() { @@ -89,7 +89,7 @@ public abstract class ValueDumper implements Dumper { return iterator.hasNext(); } - public ObjectStackLevel(ObjectValue value) { + public ObjectStackLevel(Value value) { super(value); } } diff --git a/src/main/java/net/woggioni/worth/serialization/json/JSONDumper.java b/src/main/java/net/woggioni/worth/serialization/json/JSONDumper.java index e1b13f5..76207e6 100644 --- a/src/main/java/net/woggioni/worth/serialization/json/JSONDumper.java +++ b/src/main/java/net/woggioni/worth/serialization/json/JSONDumper.java @@ -106,33 +106,31 @@ public class JSONDumper extends ValueDumper { stringValue(v.asString()); break; case ARRAY: - ArrayValue arrayValue = WorthUtils.dynamicCast(v, ArrayValue.class); - if(ids != null && (id = ids.get(new ValueIdentity(arrayValue))) != null) { + if(ids != null && (id = ids.get(new ValueIdentity(v))) != null) { if(dumpedId.add(id)) { - stack.push(new ArrayStackLevel(arrayValue)); + stack.push(new ArrayStackLevel(v)); valueId(id); - beginArray(arrayValue.size()); + beginArray(v.size()); } else { valueReference(id); } } else { - stack.push(new ArrayStackLevel(arrayValue)); - beginArray(arrayValue.size()); + stack.push(new ArrayStackLevel(v)); + beginArray(v.size()); } break; case OBJECT: - ObjectValue objectValue = WorthUtils.dynamicCast(v, ObjectValue.class); - if(ids != null && (id = ids.get(new ValueIdentity(objectValue))) != null) { + if(ids != null && (id = ids.get(new ValueIdentity(v))) != null) { if(dumpedId.add(id)) { - stack.push(new ObjectStackLevel(WorthUtils.dynamicCast(v, ObjectValue.class))); + stack.push(new ObjectStackLevel(v)); valueId(id); - beginObject(objectValue.size()); + beginObject(v.size()); } else { valueReference(id); } } else { - stack.push(new ObjectStackLevel(WorthUtils.dynamicCast(v, ObjectValue.class))); - beginObject(objectValue.size()); + stack.push(new ObjectStackLevel(v)); + beginObject(v.size()); } break; } diff --git a/src/main/java/net/woggioni/worth/utils/Tuple2.java b/src/main/java/net/woggioni/worth/utils/Tuple2.java new file mode 100644 index 0000000..3fa3dc5 --- /dev/null +++ b/src/main/java/net/woggioni/worth/utils/Tuple2.java @@ -0,0 +1,11 @@ +package net.woggioni.worth.utils; + +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +@EqualsAndHashCode +@RequiredArgsConstructor +public class Tuple2 { + public final T _1; + public final U _2; +} diff --git a/src/main/java/net/woggioni/worth/value/ArrayValue.java b/src/main/java/net/woggioni/worth/value/ArrayValue.java index 13bb057..b554e18 100644 --- a/src/main/java/net/woggioni/worth/value/ArrayValue.java +++ b/src/main/java/net/woggioni/worth/value/ArrayValue.java @@ -31,6 +31,11 @@ public class ArrayValue implements Value, Iterable { this.value.add(value); } + @Override + public void set(int index, Value value) { + this.value.set(index, value); + } + @Override public Value get(int index) { int sz = size(); diff --git a/src/main/java/net/woggioni/worth/value/ObjectValue.java b/src/main/java/net/woggioni/worth/value/ObjectValue.java index e8732d2..bf497ec 100644 --- a/src/main/java/net/woggioni/worth/value/ObjectValue.java +++ b/src/main/java/net/woggioni/worth/value/ObjectValue.java @@ -85,8 +85,8 @@ abstract class MapObjectValue implements ObjectValue { } @Override - public Map asObject() { - return Collections.unmodifiableMap(value); + public Iterable> asObject() { + return () -> value.entrySet().iterator(); } @Override @@ -168,12 +168,8 @@ class ListObjectValue implements ObjectValue { } @Override - public Map asObject() { - Map result = new LinkedHashMap<>(); - for (Map.Entry entry : value) { - result.put(entry.getKey(), entry.getValue()); - } - return Collections.unmodifiableMap(result); + public Iterable> asObject() { + return value::iterator; } @Override diff --git a/src/main/java/net/woggioni/worth/xface/Value.java b/src/main/java/net/woggioni/worth/xface/Value.java index c88a49c..3fb7364 100644 --- a/src/main/java/net/woggioni/worth/xface/Value.java +++ b/src/main/java/net/woggioni/worth/xface/Value.java @@ -34,11 +34,11 @@ public interface Value { throw new TypeException("Not a String"); } - default List asArray() { + default Iterable asArray() { throw new TypeException("Not an array"); } - default Map asObject() { + default Iterable> asObject() { throw new TypeException("Not an object"); } @@ -50,6 +50,10 @@ public interface Value { throw new TypeException("Not an array"); } + default void set(int index, Value value) { + throw new TypeException("Not an array"); + } + default Value pop() { throw new TypeException("Not an array"); }