aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-28 14:45:56 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-28 14:45:56 +0000
commitea417d7c4d430d4bb6fcce14e64ffda82f475805 (patch)
treeeddfd9b3374610a7b1b1f0af86d7a1e9374e8eb8 /src
parent9600fba4a61e2e42da2221c1ec15e2a20072afa8 (diff)
Extract forEach over two iterabes
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/PositionalArguments.java12
-rw-r--r--src/main/java/org/zwobble/couscous/util/Action2.java5
-rw-r--r--src/main/java/org/zwobble/couscous/util/ExtraIterables.java18
4 files changed, 34 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index fcdca98..d85013e 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -13,6 +13,7 @@ import java.util.stream.Stream;
import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf;
import static org.zwobble.couscous.interpreter.Evaluator.eval;
import static org.zwobble.couscous.interpreter.Evaluator.evalCondition;
+import static org.zwobble.couscous.util.ExtraIterables.forEach;
public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> {
public static InterpreterValue callMethod(
@@ -53,11 +54,8 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
Optional<InterpreterValue> thisValue,
PositionalArguments arguments)
{
- // TODO use map with multiple iterables
StackFrameBuilder stackFrame = new StackFrameBuilder();
- for (int index = 0; index < formalArguments.size(); index++) {
- stackFrame.declare(formalArguments.get(index), arguments.get(index));
- }
+ forEach(formalArguments, arguments, stackFrame::declare);
findDeclarations(statements).forEach(declaration -> stackFrame.declare(declaration));
return environment.withStackFrame(thisValue, stackFrame.build());
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/PositionalArguments.java b/src/main/java/org/zwobble/couscous/interpreter/PositionalArguments.java
index 429b529..2ceb986 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/PositionalArguments.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/PositionalArguments.java
@@ -1,10 +1,11 @@
package org.zwobble.couscous.interpreter;
-import java.util.List;
-
import org.zwobble.couscous.interpreter.values.InterpreterValue;
-public class PositionalArguments {
+import java.util.Iterator;
+import java.util.List;
+
+public class PositionalArguments implements Iterable<InterpreterValue> {
private List<InterpreterValue> values;
public PositionalArguments(List<InterpreterValue> values) {
@@ -14,4 +15,9 @@ public class PositionalArguments {
public InterpreterValue get(int index) {
return values.get(index);
}
+
+ @Override
+ public Iterator<InterpreterValue> iterator() {
+ return values.iterator();
+ }
}
diff --git a/src/main/java/org/zwobble/couscous/util/Action2.java b/src/main/java/org/zwobble/couscous/util/Action2.java
new file mode 100644
index 0000000..4086f1d
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/util/Action2.java
@@ -0,0 +1,5 @@
+package org.zwobble.couscous.util;
+
+public interface Action2<T, U> {
+ void run(T first, U second);
+}
diff --git a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java
new file mode 100644
index 0000000..9cdb0f0
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java
@@ -0,0 +1,18 @@
+package org.zwobble.couscous.util;
+
+import java.util.Iterator;
+
+public class ExtraIterables {
+ private ExtraIterables() {}
+
+ public static <T, U> void forEach(Iterable<? extends T> first, Iterable<? extends U> second, Action2<T, U> action) {
+ Iterator<? extends T> firstIterator = first.iterator();
+ Iterator<? extends U> secondIterator = second.iterator();
+ while (firstIterator.hasNext()) {
+ action.run(firstIterator.next(), secondIterator.next());
+ }
+ if (secondIterator.hasNext()) {
+ throw new RuntimeException("Iterables not of same length");
+ }
+ }
+}