package io.gitlab.jfronny.muscript.ast.math; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.ast.NumberExpr; import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral; public class Divide extends NumberExpr { public final NumberExpr dividend; public final NumberExpr divisor; public Divide(int chStart, int chEnd, NumberExpr dividend, NumberExpr divisor) { super(chStart, chEnd); this.dividend = dividend; this.divisor = divisor; } @Override public Double get(Dynamic 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 boolean equals(Object obj) { return obj instanceof Divide divide && dividend.equals(divide.dividend) && divisor.equals(divide.divisor); } }