aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
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
parent2f9374c7f32a761413da4c5484bec88a76c855d2 (diff)
Split interpreter values from primitives
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/JavaProject.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java17
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java36
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java9
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java4
-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
-rw-r--r--src/main/java/org/zwobble/couscous/values/BooleanValue.java20
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java17
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java8
-rw-r--r--src/main/java/org/zwobble/couscous/values/PrimitiveValues.java17
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java17
-rw-r--r--src/main/java/org/zwobble/couscous/values/UnitValue.java13
23 files changed, 321 insertions, 138 deletions
diff --git a/src/main/java/org/zwobble/couscous/JavaProject.java b/src/main/java/org/zwobble/couscous/JavaProject.java
index a13399c..04ed53d 100644
--- a/src/main/java/org/zwobble/couscous/JavaProject.java
+++ b/src/main/java/org/zwobble/couscous/JavaProject.java
@@ -1,10 +1,10 @@
package org.zwobble.couscous;
-import org.zwobble.couscous.interpreter.values.IntegerValue;
+import org.zwobble.couscous.interpreter.values.IntegerInterpreterValue;
public class JavaProject {
public static MapBackedProject.Builder builder() {
return MapBackedProject.builder()
- .addClass(IntegerValue.TYPE);
+ .addClass(IntegerInterpreterValue.TYPE);
}
}
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index 6bc498a..05a599c 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -1,32 +1,31 @@
package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor;
-import org.zwobble.couscous.interpreter.values.BooleanValue;
-import org.zwobble.couscous.interpreter.values.IntegerValue;
-import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.interpreter.values.StringValue;
+import org.zwobble.couscous.values.PrimitiveValue;
+
+import static org.zwobble.couscous.values.PrimitiveValues.value;
import lombok.Value;
@Value
public class LiteralNode implements ExpressionNode {
- public static LiteralNode literal(InterpreterValue value) {
+ public static LiteralNode literal(PrimitiveValue value) {
return new LiteralNode(value);
}
public static LiteralNode literal(String value) {
- return new LiteralNode(new StringValue(value));
+ return new LiteralNode(value(value));
}
public static LiteralNode literal(int value) {
- return new LiteralNode(new IntegerValue(value));
+ return new LiteralNode(value(value));
}
public static LiteralNode literal(boolean value) {
- return new LiteralNode(new BooleanValue(value));
+ return new LiteralNode(value(value));
}
- InterpreterValue value;
+ PrimitiveValue value;
@Override
public <T> T accept(ExpressionNodeVisitor<T> visitor) {
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index 4c26a0a..eae713c 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -21,8 +21,11 @@ import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonFunctionDefinitionNode;
import org.zwobble.couscous.backends.python.ast.PythonModuleNode;
import org.zwobble.couscous.backends.python.ast.PythonStatementNode;
-import org.zwobble.couscous.interpreter.values.IntegerValue;
-import org.zwobble.couscous.interpreter.values.StringValue;
+import org.zwobble.couscous.values.BooleanValue;
+import org.zwobble.couscous.values.IntegerValue;
+import org.zwobble.couscous.values.PrimitiveValueVisitor;
+import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.values.UnitValue;
import static java.util.Arrays.asList;
import static org.zwobble.couscous.backends.python.ast.PythonClassNode.pythonClass;
@@ -81,14 +84,27 @@ public class PythonCodeGenerator {
private static class ExpressionGenerator implements ExpressionNodeVisitor<PythonExpressionNode> {
@Override
public PythonExpressionNode visit(LiteralNode literal) {
- // TODO: use visitor
- if (literal.getValue() instanceof IntegerValue) {
- return pythonIntegerLiteral(((IntegerValue)literal.getValue()).getValue());
- } else if (literal.getValue() instanceof StringValue) {
- return pythonStringLiteral(((StringValue)literal.getValue()).getValue());
- } else {
- throw new UnsupportedOperationException();
- }
+ return literal.getValue().accept(new PrimitiveValueVisitor<PythonExpressionNode>() {
+ @Override
+ public PythonExpressionNode visit(IntegerValue value) {
+ return pythonIntegerLiteral(value.getValue());
+ }
+
+ @Override
+ public PythonExpressionNode visit(StringValue value) {
+ return pythonStringLiteral(value.getValue());
+ }
+
+ @Override
+ public PythonExpressionNode visit(BooleanValue value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public PythonExpressionNode visit(UnitValue unitValue) {
+ throw new UnsupportedOperationException();
+ }
+ });
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 6b61b7f..9362698 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -11,8 +11,9 @@ import org.zwobble.couscous.ast.StaticMethodCallNode;
import org.zwobble.couscous.ast.TernaryConditionalNode;
import org.zwobble.couscous.ast.VariableReferenceNode;
import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor;
-import org.zwobble.couscous.interpreter.values.BooleanValue;
+import org.zwobble.couscous.interpreter.values.BooleanInterpreterValue;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
+import org.zwobble.couscous.interpreter.values.InterpreterValues;
import lombok.val;
@@ -33,7 +34,7 @@ public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> {
@Override
public InterpreterValue visit(LiteralNode literal) {
- return literal.getValue();
+ return InterpreterValues.value(literal.getValue());
}
@Override
@@ -51,10 +52,10 @@ public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> {
@Override
public InterpreterValue visit(TernaryConditionalNode ternaryConditional) {
val condition = eval(ternaryConditional.getCondition());
- if (!(condition instanceof BooleanValue)) {
+ if (!(condition instanceof BooleanInterpreterValue)) {
throw new ConditionMustBeBoolean(condition);
}
- val branch = ((BooleanValue)condition).getValue()
+ val branch = ((BooleanInterpreterValue)condition).getValue()
? ternaryConditional.getIfTrue()
: ternaryConditional.getIfFalse();
return eval(branch);
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index 2f12e0c..4ed4a04 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -12,7 +12,7 @@ import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.ast.VariableNode;
import org.zwobble.couscous.ast.visitors.StatementNodeVisitor;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.interpreter.values.UnitValue;
+import org.zwobble.couscous.interpreter.values.UnitInterpreterValue;
import static org.zwobble.couscous.interpreter.Evaluator.eval;
@@ -28,7 +28,7 @@ public class Executor implements StatementNodeVisitor<Optional<InterpreterValue>
return result.get();
}
}
- return UnitValue.UNIT;
+ return UnitInterpreterValue.UNIT;
}
private static Environment buildEnvironment(
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index 39191ce..0c36d91 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -5,11 +5,11 @@ import java.util.stream.Collectors;
import org.zwobble.couscous.Project;
import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.LiteralNode;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
import com.google.common.collect.ImmutableMap;
+import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
import static org.zwobble.couscous.interpreter.Evaluator.eval;
@@ -25,7 +25,7 @@ public class Interpreter {
public InterpreterValue run(String className, String methodName, List<InterpreterValue> arguments) {
val argumentExpressions = arguments
.stream()
- .<ExpressionNode>map(LiteralNode::literal)
+ .<ExpressionNode>map(argument -> literal(argument.toPrimitiveValue().get()))
.collect(Collectors.toList());
return eval(new Environment(project, ImmutableMap.of()),
staticMethodCall(className, methodName, argumentExpressions));
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;
- }
-}
diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
new file mode 100644
index 0000000..e05c246
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
@@ -0,0 +1,20 @@
+package org.zwobble.couscous.values;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Value;
+
+@Value
+public class BooleanValue implements PrimitiveValue {
+ @Getter(value = AccessLevel.NONE)
+ boolean value;
+
+ public boolean getValue() {
+ return value;
+ }
+
+ @Override
+ public <T> T accept(PrimitiveValueVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
new file mode 100644
index 0000000..71c7a41
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
@@ -0,0 +1,17 @@
+package org.zwobble.couscous.values;
+
+import static org.zwobble.couscous.values.TypeReference.typeRef;
+
+import lombok.Value;
+
+@Value
+public class IntegerValue implements PrimitiveValue {
+ public static final TypeReference REF = typeRef("java.lang.Integer");
+
+ int value;
+
+ @Override
+ public <T> T accept(PrimitiveValueVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java
new file mode 100644
index 0000000..2cfe40a
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValue.java
@@ -0,0 +1,5 @@
+package org.zwobble.couscous.values;
+
+public interface PrimitiveValue {
+ <T> T accept(PrimitiveValueVisitor<T> visitor);
+}
diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java
new file mode 100644
index 0000000..07047b8
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValueVisitor.java
@@ -0,0 +1,8 @@
+package org.zwobble.couscous.values;
+
+public interface PrimitiveValueVisitor<T> {
+ T visit(IntegerValue value);
+ T visit(StringValue value);
+ T visit(BooleanValue value);
+ T visit(UnitValue unitValue);
+}
diff --git a/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java
new file mode 100644
index 0000000..f6420f0
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/PrimitiveValues.java
@@ -0,0 +1,17 @@
+package org.zwobble.couscous.values;
+
+public class PrimitiveValues {
+ public static final PrimitiveValue UNIT = UnitValue.UNIT;
+
+ public static PrimitiveValue value(String value) {
+ return new StringValue(value);
+ }
+
+ public static PrimitiveValue value(int value) {
+ return new IntegerValue(value);
+ }
+
+ public static PrimitiveValue value(boolean value) {
+ return new BooleanValue(value);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java
new file mode 100644
index 0000000..256d6d1
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/StringValue.java
@@ -0,0 +1,17 @@
+package org.zwobble.couscous.values;
+
+import static org.zwobble.couscous.values.TypeReference.typeRef;
+
+import lombok.Value;
+
+@Value
+public class StringValue implements PrimitiveValue {
+ public static final TypeReference REF = typeRef("java.lang.String");
+
+ String value;
+
+ @Override
+ public <T> T accept(PrimitiveValueVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/values/UnitValue.java b/src/main/java/org/zwobble/couscous/values/UnitValue.java
new file mode 100644
index 0000000..14bf327
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/values/UnitValue.java
@@ -0,0 +1,13 @@
+package org.zwobble.couscous.values;
+
+public class UnitValue implements PrimitiveValue {
+ static final UnitValue UNIT = new UnitValue();
+
+ private UnitValue() {
+ }
+
+ @Override
+ public <T> T accept(PrimitiveValueVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}