All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.nowina.cadmelia.script.expression.InlineForExpression Maven / Gradle / Ivy

The newest version!
package net.nowina.cadmelia.script.expression;

import net.nowina.cadmelia.script.Expression;
import net.nowina.cadmelia.script.IterableDef;
import net.nowina.cadmelia.script.ScriptContext;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class InlineForExpression extends IterableDef {

    private final String variableName;

    private final IterableDef iterableDef;

    private final Expression expression;

    public InlineForExpression(String variableName, IterableDef iterableDef, Expression expression) {
        this.variableName = variableName;
        this.iterableDef = iterableDef;
        this.expression = expression;
    }

    @Override
    protected List doEvaluation(ScriptContext context) {

        List list = new ArrayList<>();
        for(Expression var : iterableDef.iterable(context)) {
            Object value = var._evaluate(context);
            ScriptContext childContext = new ScriptContext(context);
            childContext.defineVariableValue(variableName, value);
            list.add(expression.evaluate(childContext));
        }
        return list;
    }

    @Override
    public Iterable iterable(ScriptContext ctx) {
        return new IterableFor(doEvaluation(ctx));
    }

    class IterableFor implements Iterable {

        List list;

        IterableFor(List list) {
            this.list = list;
        }

        @Override
        public Iterator iterator() {
            return new Iterator() {

                int index = 0;

                @Override
                public boolean hasNext() {
                    return index < list.size();
                }

                @Override
                public Expression next() {
                    return new ExpressionElement(list.get(index++));
                }
            };
        }

    }

}