package io.gitlab.jfronny.muscript.ast.math; import io.gitlab.jfronny.muscript.compiler.ExprWriter; import io.gitlab.jfronny.muscript.compiler.Order; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.ast.NumberExpr; import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral; import java.io.IOException; public class Minus extends NumberExpr { public final NumberExpr minuend; public final NumberExpr subtrahend; public Minus(int chStart, int chEnd, NumberExpr minuend, NumberExpr subtrahend) { super(Order.Term, chStart, chEnd); this.minuend = minuend; this.subtrahend = subtrahend; } @Override public Double get(Scope dataRoot) { return minuend.get(dataRoot) - subtrahend.get(dataRoot); } @Override public NumberExpr optimize() { NumberExpr minuend = this.minuend.optimize(); NumberExpr subtrahend = this.subtrahend.optimize(); if (minuend instanceof NumberLiteral litM && subtrahend instanceof NumberLiteral litS) return Expr.literal(chStart, chEnd, litM.value - litS.value); if (minuend instanceof Minus minus) return new Minus(chStart, chEnd, minus.minuend, new Plus(minus.chStart, minus.chEnd, minus.subtrahend, subtrahend)).optimize(); return new Minus(chStart, chEnd, minuend, subtrahend); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(minuend, writer, false); writer.append(" - "); parenthesize(subtrahend, writer, true); } @Override public boolean equals(Object obj) { return obj instanceof Minus minus && minuend.equals(minus.minuend) && subtrahend.equals(minus.subtrahend); } }