From ea417d7c4d430d4bb6fcce14e64ffda82f475805 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 28 Feb 2016 14:45:56 +0000 Subject: Extract forEach over two iterabes --- .../org/zwobble/couscous/interpreter/Executor.java | 6 ++---- .../couscous/interpreter/PositionalArguments.java | 12 +++++++++--- src/main/java/org/zwobble/couscous/util/Action2.java | 5 +++++ .../java/org/zwobble/couscous/util/ExtraIterables.java | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/util/Action2.java create mode 100644 src/main/java/org/zwobble/couscous/util/ExtraIterables.java (limited to 'src/main/java/org') 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> { public static InterpreterValue callMethod( @@ -53,11 +54,8 @@ public class Executor implements StatementNodeMapper> Optional 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 { private List values; public PositionalArguments(List values) { @@ -14,4 +15,9 @@ public class PositionalArguments { public InterpreterValue get(int index) { return values.get(index); } + + @Override + public Iterator 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 { + 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 void forEach(Iterable first, Iterable second, Action2 action) { + Iterator firstIterator = first.iterator(); + Iterator secondIterator = second.iterator(); + while (firstIterator.hasNext()) { + action.run(firstIterator.next(), secondIterator.next()); + } + if (secondIterator.hasNext()) { + throw new RuntimeException("Iterables not of same length"); + } + } +} -- cgit v1.2.3