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 Modulo extends NumberExpr { private final NumberExpr dividend; private final NumberExpr divisor; public Modulo(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 litD && divisor instanceof NumberLiteral litS) return Expr.literal(chStart, chEnd, litD.value % litS.value); return new Modulo(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 Modulo modulo && dividend.equals(modulo.dividend) && divisor.equals(modulo.divisor); } }