aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/values
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-05 12:55:11 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-05 12:55:11 +0100
commitcc1543421aafac336be05ac0b75cecc2da4b6818 (patch)
tree584570ddd0af5ec866173354aa442ce215de0fab /src/main/java/org/zwobble/couscous/interpreter/values
parent2f9374c7f32a761413da4c5484bec88a76c855d2 (diff)
Split interpreter values from primitives
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/values')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java33
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BooleanValue.java23
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java37
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerValue.java30
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java37
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java41
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StringValue.java34
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java29
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/UnitValue.java19
10 files changed, 179 insertions, 109 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
new file mode 100644
index 0000000..4ab2d18
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
@@ -0,0 +1,33 @@
+package org.zwobble.couscous.interpreter.values;
+
+import java.util.Optional;
+
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValues;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Value;
+
+@Value
+public class BooleanInterpreterValue implements InterpreterValue {
+ private static final ConcreteType<BooleanInterpreterValue> TYPE = ConcreteType.<BooleanInterpreterValue>builder("Boolean")
+ .build();
+
+ @Getter(value = AccessLevel.NONE)
+ boolean value;
+
+ public boolean getValue() {
+ return value;
+ }
+
+ @Override
+ public ConcreteType<?> getType() {
+ return TYPE;
+ }
+
+ @Override
+ public Optional<PrimitiveValue> toPrimitiveValue() {
+ return Optional.of(PrimitiveValues.value(value));
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanValue.java
deleted file mode 100644
index 1837d6f..0000000
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanValue.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.zwobble.couscous.interpreter.values;
-
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.Value;
-
-@Value
-public class BooleanValue implements InterpreterValue {
- private static final ConcreteType<BooleanValue> TYPE = ConcreteType.<BooleanValue>builder("Boolean")
- .build();
-
- @Getter(value = AccessLevel.NONE)
- boolean value;
-
- public boolean getValue() {
- return value;
- }
-
- @Override
- public ConcreteType<?> getType() {
- return TYPE;
- }
-}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
new file mode 100644
index 0000000..c7d7be3
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
@@ -0,0 +1,37 @@
+package org.zwobble.couscous.interpreter.values;
+
+import java.util.Optional;
+
+import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValues;
+import org.zwobble.couscous.values.StringValue;
+
+import static java.util.Arrays.asList;
+
+import lombok.Value;
+import lombok.val;
+
+@Value
+public class IntegerInterpreterValue implements InterpreterValue {
+ public static final ConcreteType<?> TYPE = ConcreteType.<IntegerInterpreterValue>builder(IntegerValue.REF)
+ .staticMethod("parseInt", asList(StringValue.REF),
+ (environment, arguments) -> {
+ val value = (StringInterpreterValue)arguments.get(0);
+ return new IntegerInterpreterValue(Integer.parseInt(value.getValue()));
+ })
+
+ .build();
+
+ int value;
+
+ @Override
+ public ConcreteType<?> getType() {
+ return TYPE;
+ }
+
+ @Override
+ public Optional<PrimitiveValue> toPrimitiveValue() {
+ return Optional.of(PrimitiveValues.value(value));
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerValue.java
deleted file mode 100644
index 89fd056..0000000
--- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerValue.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.zwobble.couscous.interpreter.values;
-
-import org.zwobble.couscous.values.TypeReference;
-
-import static java.util.Arrays.asList;
-import static org.zwobble.couscous.values.TypeReference.typeRef;
-
-import lombok.Value;
-import lombok.val;
-
-@Value
-public class IntegerValue implements InterpreterValue {
- public static final TypeReference REF = typeRef("java.lang.Integer");
-
- public static final ConcreteType<?> TYPE = ConcreteType.<IntegerValue>builder(REF)
- .staticMethod("parseInt", asList(StringValue.REF),
- (environment, arguments) -> {
- val value = (StringValue)arguments.get(0);
- return new IntegerValue(Integer.parseInt(value.getValue()));
- })
-
- .build();
-
- int value;
-
- @Override
- public ConcreteType<?> getType() {
- return TYPE;
- }
-}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
index cf2aa5b..7696ff2 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
@@ -1,5 +1,10 @@
package org.zwobble.couscous.interpreter.values;
+import java.util.Optional;
+
+import org.zwobble.couscous.values.PrimitiveValue;
+
public interface InterpreterValue {
ConcreteType<?> getType();
+ Optional<PrimitiveValue> toPrimitiveValue();
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java
index ec2d97f..37a0669 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java
@@ -1,13 +1,44 @@
package org.zwobble.couscous.interpreter.values;
+import org.zwobble.couscous.values.BooleanValue;
+import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValueVisitor;
+import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.values.UnitValue;
+
public class InterpreterValues {
- public static final UnitValue UNIT = UnitValue.UNIT;
+ public static final UnitInterpreterValue UNIT = UnitInterpreterValue.UNIT;
public static InterpreterValue value(int value) {
- return new IntegerValue(value);
+ return new IntegerInterpreterValue(value);
}
public static InterpreterValue value(String value) {
- return new StringValue(value);
+ return new StringInterpreterValue(value);
+ }
+
+ public static InterpreterValue value(PrimitiveValue value) {
+ return value.accept(new PrimitiveValueVisitor<InterpreterValue>() {
+ @Override
+ public InterpreterValue visit(IntegerValue value) {
+ return new IntegerInterpreterValue(value.getValue());
+ }
+
+ @Override
+ public InterpreterValue visit(StringValue value) {
+ return new StringInterpreterValue(value.getValue());
+ }
+
+ @Override
+ public InterpreterValue visit(BooleanValue value) {
+ return new BooleanInterpreterValue(value.getValue());
+ }
+
+ @Override
+ public InterpreterValue visit(UnitValue unitValue) {
+ return UNIT;
+ }
+ });
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
new file mode 100644
index 0000000..f17cdd5
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
@@ -0,0 +1,41 @@
+package org.zwobble.couscous.interpreter.values;
+
+import java.util.Optional;
+
+import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValues;
+import org.zwobble.couscous.values.StringValue;
+
+import static java.util.Arrays.asList;
+
+import lombok.Value;
+import lombok.val;
+
+@Value
+public class StringInterpreterValue implements InterpreterValue {
+ public static final ConcreteType<?> TYPE = ConcreteType.<StringInterpreterValue>builder(StringValue.REF)
+ .method("length", asList(),
+ (receiver, arguments) -> new IntegerInterpreterValue(receiver.value.length()))
+
+ .method("substring", asList(IntegerValue.REF, IntegerValue.REF),
+ (receiver, arguments) -> {
+ val startIndex = (IntegerInterpreterValue)arguments.get(0);
+ val endIndex = (IntegerInterpreterValue)arguments.get(1);
+ return new StringInterpreterValue(receiver.value.substring(startIndex.getValue(), endIndex.getValue()));
+ })
+
+ .build();
+
+ String value;
+
+ @Override
+ public ConcreteType<?> getType() {
+ return TYPE;
+ }
+
+ @Override
+ public Optional<PrimitiveValue> toPrimitiveValue() {
+ return Optional.of(PrimitiveValues.value(value));
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringValue.java
deleted file mode 100644
index 43a4bde..0000000
--- a/src/main/java/org/zwobble/couscous/interpreter/values/StringValue.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.zwobble.couscous.interpreter.values;
-
-import org.zwobble.couscous.values.TypeReference;
-
-import static java.util.Arrays.asList;
-import static org.zwobble.couscous.values.TypeReference.typeRef;
-
-import lombok.Value;
-import lombok.val;
-
-@Value
-public class StringValue implements InterpreterValue {
- public static final TypeReference REF = typeRef("java.lang.String");
-
- public static final ConcreteType<?> TYPE = ConcreteType.<StringValue>builder(REF)
- .method("length", asList(),
- (receiver, arguments) -> new IntegerValue(receiver.value.length()))
-
- .method("substring", asList(IntegerValue.REF, IntegerValue.REF),
- (receiver, arguments) -> {
- val startIndex = (IntegerValue)arguments.get(0);
- val endIndex = (IntegerValue)arguments.get(1);
- return new StringValue(receiver.value.substring(startIndex.getValue(), endIndex.getValue()));
- })
-
- .build();
-
- String value;
-
- @Override
- public ConcreteType<?> getType() {
- return TYPE;
- }
-}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java
new file mode 100644
index 0000000..e34882b
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java
@@ -0,0 +1,29 @@
+package org.zwobble.couscous.interpreter.values;
+
+import java.util.Optional;
+
+import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValues;
+
+import lombok.ToString;
+
+@ToString
+public class UnitInterpreterValue implements InterpreterValue {
+ private static final ConcreteType<?> TYPE = ConcreteType.<UnitInterpreterValue>builder("Unit")
+ .build();
+
+ public static final UnitInterpreterValue UNIT = new UnitInterpreterValue();
+
+ private UnitInterpreterValue() {
+ }
+
+ @Override
+ public ConcreteType<?> getType() {
+ return TYPE;
+ }
+
+ @Override
+ public Optional<PrimitiveValue> toPrimitiveValue() {
+ return Optional.of(PrimitiveValues.UNIT);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/UnitValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/UnitValue.java
deleted file mode 100644
index 4e2eb2c..0000000
--- a/src/main/java/org/zwobble/couscous/interpreter/values/UnitValue.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.zwobble.couscous.interpreter.values;
-
-import lombok.ToString;
-
-@ToString
-public class UnitValue implements InterpreterValue {
- private static final ConcreteType<?> TYPE = ConcreteType.<UnitValue>builder("Unit")
- .build();
-
- public static final UnitValue UNIT = new UnitValue();
-
- private UnitValue() {
- }
-
- @Override
- public ConcreteType<?> getType() {
- return TYPE;
- }
-}