001package org.clafer.ast;
002
003import java.util.Arrays;
004import org.clafer.common.Check;
005import org.clafer.common.Util;
006
007/**
008 * foldl1 op operands.
009 *
010 * @author jimmy
011 */
012public class AstArithm implements AstSetExpr {
013
014    private final Op op;
015    private final AstSetExpr[] operands;
016
017    AstArithm(Op op, AstSetExpr[] operands) {
018        this.op = Check.notNull(op);
019        this.operands = Check.noNullsNotEmpty(operands);
020    }
021
022    public Op getOp() {
023        return op;
024    }
025
026    public AstSetExpr[] getOperands() {
027        return operands;
028    }
029
030    @Override
031    public <A, B> B accept(AstExprVisitor<A, B> visitor, A a) {
032        return visitor.visit(this, a);
033    }
034
035    @Override
036    public boolean equals(Object obj) {
037        if (obj instanceof AstArithm) {
038            AstArithm other = (AstArithm) obj;
039            return op.equals(other.op) && Arrays.equals(operands, other.operands);
040        }
041        return false;
042    }
043
044    @Override
045    public int hashCode() {
046        // op.hashCode() can change between runs which makes the output change
047        // every time.
048        return op.ordinal() ^ Arrays.hashCode(operands);
049    }
050
051    @Override
052    public String toString() {
053        return "(" + Util.intercalate(") " + op.getSyntax() + " (", operands) + ")";
054    }
055
056    public static enum Op {
057
058        Add("+"),
059        Sub("-"),
060        Mul("*"),
061        Div("/");
062        private final String syntax;
063
064        private Op(String syntax) {
065            this.syntax = syntax;
066        }
067
068        public String getSyntax() {
069            return syntax;
070        }
071    }
072}