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 Divide extends NumberExpr { public final NumberExpr dividend; public final NumberExpr divisor; public Divide(int chStart, int chEnd, NumberExpr dividend, NumberExpr divisor) { super(Order.Factor, chStart, chEnd); this.dividend = dividend; this.divisor = divisor; } @Override public Double get(Scope dataRoot) { return dividend.get(dataRoot) / divisor.get(dataRoot); } @Override public NumberExpr optimize() { NumberExpr dividend = this.dividend.optimize(); NumberExpr divisor = this.divisor.optimize(); if (dividend instanceof NumberLiteral litL && divisor instanceof NumberLiteral litR) return Expr.literal(chStart, chEnd, litL.value / litR.value); if (dividend instanceof Divide divide && divide.dividend instanceof NumberLiteral literal) return new Divide(chStart, chEnd, divide.dividend, new Multiply(divide.chStart, dividend.chEnd, divisor, literal)).optimize(); return new Divide(chStart, chEnd, dividend, divisor); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(dividend, writer, false); writer.append(" / "); parenthesize(divisor, writer, true); } @Override public boolean equals(Object obj) { return obj instanceof Divide divide && dividend.equals(divide.dividend) && divisor.equals(divide.divisor); } }