package brainslug.flow.execution.node;
import brainslug.flow.context.ExecutionContext;
import brainslug.flow.execution.instance.FlowInstance;
import brainslug.flow.node.FlowNodeDefinition;
import brainslug.flow.path.FlowEdgeDefinition;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DefaultNodeExecutor<T extends FlowNodeDefinition> implements FlowNodeExecutor<T> {
@Override
public FlowNodeExecutionResult execute(T node, ExecutionContext execution) {
return takeAllAndRemoveFirst(node, execution.getInstance());
}
protected FlowNodeExecutionResult takeAllAndRemoveFirst(FlowNodeDefinition<?> node, FlowInstance flowInstance) {
return takeAll(node).withFirstIncomingTokensRemoved(flowInstance.getTokens());
}
protected FlowNodeExecutionResult takeAll(FlowNodeDefinition<?> node) {
List<FlowNodeDefinition> next = new ArrayList<FlowNodeDefinition>();
for (FlowEdgeDefinition edge : node.getOutgoing()) {
next.add(edge.getTarget());
}
return new FlowNodeExecutionResult(node, next);
}
protected FlowNodeExecutionResult takeNone(FlowNodeDefinition<?> node, FlowInstance flowInstance) {
return new FlowNodeExecutionResult(node, Collections.<FlowNodeDefinition>emptyList());
}
}