workcraft/workcraft

View on GitHub
workcraft/CircuitPlugin/src/org/workcraft/plugins/circuit/expression/Term.java

Summary

Maintainability
A
1 hr
Test Coverage
package org.workcraft.plugins.circuit.expression;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class Term implements Expression {

    public final List<Expression> expressions;

    public Term(List<Expression> expressions) {
        this.expressions = expressions;
    }

    @Override
    public boolean isAtomic() {
        return false;
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Expression expression: expressions) {
            if (!first) {
                result.append("*");
            }
            result.append(expression.toString());
            first = false;
        }
        return result.toString();
    }

    @Override
    public Collection<Literal> getLiterals() {
        Collection<Literal> result = new HashSet<>();
        for (Expression expression: expressions) {
            result.addAll(expression.getLiterals());
        }
        return result;
    }

    @Override
    public Expression eval() {
        return eval(new HashMap<>());
    }

    @Override
    public Expression eval(Map<String, Boolean> assignments) {
        List<Expression> evalExpressions = new LinkedList<>();
        for (Expression expression: expressions) {
            Expression evalExpression = expression.eval(assignments);
            if (evalExpression instanceof Constant) {
                Constant constant = (Constant) evalExpression;
                if (!constant.value) {
                    return new Constant(false);
                }
            } else {
                evalExpressions.add(evalExpression);
            }
        }
        if (evalExpressions.isEmpty()) {
            return new Constant(true);
        } else if (evalExpressions.size() == 1) {
            return evalExpressions.get(0);
        } else {
            return new Term(evalExpressions);
        }
    }

}