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 Invert extends NumberExpr { public final NumberExpr inner; public Invert(int chStart, int chEnd, NumberExpr inner) { super(Order.Unary, chStart, chEnd); this.inner = inner; } @Override public Double get(Scope dataRoot) { return -inner.get(dataRoot); } @Override public NumberExpr optimize() { NumberExpr inner = this.inner.optimize(); if (inner instanceof Invert invert) return invert.inner; if (inner instanceof NumberLiteral literal) return Expr.literal(chStart, chEnd, -literal.value); if (inner instanceof Minus minus) return new Minus(chStart, chEnd, minus.subtrahend, minus.minuend).optimize(); return new Invert(chStart, chEnd, inner); } @Override public void decompile(ExprWriter writer) throws IOException { writer.append('-'); parenthesize(inner, writer, false); } @Override public boolean equals(Object obj) { return obj instanceof Invert invert && inner.equals(invert.inner); } }