ifc-expressions
Version:
Parsing and evaluation of IFC expressions
36 lines (35 loc) • 1.61 kB
JavaScript
import { Func } from "../Func.js";
import { FuncArgAny } from "../arg/FuncArgAny.js";
import { ExprEvalSuccessObj, ExprEvalTypeErrorObj, } from "../../ExprEvalResult.js";
import { isComparable } from "../../../value/Comparable.js";
import { ExprKind } from "../../ExprKind.js";
import { BooleanValue } from "../../../value/BooleanValue.js";
import { Type } from "../../../type/Types.js";
export class CompareMagnitudes extends Func {
constructor(name, cmp) {
super(name, [
new FuncArgAny(true, CompareMagnitudes.KEY_LEFT),
new FuncArgAny(true, CompareMagnitudes.KEY_RIGHT),
]);
this.comparisonFunction = cmp;
}
calculateResult(callingExpr, evaluatedArguments) {
const left = evaluatedArguments.get(CompareMagnitudes.KEY_LEFT);
const right = evaluatedArguments.get(CompareMagnitudes.KEY_RIGHT);
if (!isComparable(left)) {
return new ExprEvalTypeErrorObj(ExprKind.FUNCTION, "Cannot compare: left value is not comparable", left, callingExpr.getTextSpan());
}
if (!isComparable(right)) {
return new ExprEvalTypeErrorObj(ExprKind.FUNCTION, "Cannot compare: right value is not comparable", right, callingExpr.getTextSpan());
}
// @ts-ignore
const cmpValue = this.comparisonFunction(left.compareTo(right));
return new ExprEvalSuccessObj(BooleanValue.of(cmpValue));
}
getReturnType(argumentTypes) {
return Type.BOOLEAN;
}
}
CompareMagnitudes.KEY_LEFT = "left";
CompareMagnitudes.KEY_RIGHT = "right";
//# sourceMappingURL=CompareMagnitudes.js.map