package io.gitlab.jfronny.muscript.ast.conditional; 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.BoolExpr; import io.gitlab.jfronny.muscript.ast.NumberExpr; import io.gitlab.jfronny.muscript.ast.literal.BoolLiteral; import java.io.IOException; public class NumberConditional extends NumberExpr { public final BoolExpr condition; public final NumberExpr trueExpr; public final NumberExpr falseExpr; public NumberConditional(int chStart, int chEnd, BoolExpr condition, NumberExpr trueExpr, NumberExpr falseExpr) { super(Order.Conditional, chStart, chEnd); this.condition = condition; this.trueExpr = trueExpr; this.falseExpr = falseExpr; } @Override public Double get(Scope dataRoot) { return condition.get(dataRoot) ? trueExpr.get(dataRoot) : falseExpr.get(dataRoot); } @Override public NumberExpr optimize() { BoolExpr condition = this.condition.optimize(); NumberExpr trueExpr = this.trueExpr.optimize(); NumberExpr falseExpr = this.falseExpr.optimize(); if (condition instanceof BoolLiteral literal) return literal.value ? trueExpr : falseExpr; if (trueExpr.equals(falseExpr)) return trueExpr; return new NumberConditional(chStart, chEnd, condition, trueExpr, falseExpr); } @Override public void decompile(ExprWriter writer) throws IOException { parenthesize(condition, writer, true); writer.append(" ? "); trueExpr.decompile(writer); writer.append(" : "); falseExpr.decompile(writer); } @Override public boolean equals(Object obj) { return obj instanceof NumberConditional conditional && condition.equals(conditional.condition) && trueExpr.equals(conditional.trueExpr) && falseExpr.equals(conditional.falseExpr); } }