import { Variable } from "./language"; export interface EvaluationContext { get(variableName: string): number | boolean | undefined; } export declare class ValueMap extends Map implements EvaluationContext { constructor(...keyValues: Array); static toEntryPairs(keyValues: Array): Iterable; } /** * Numeric expression. */ export declare abstract class NumericExpression { abstract getVariables(): Variable[]; abstract evaluate(context: EvaluationContext): number | undefined; getVariableNames(): string[]; } export declare class VariableExpression extends NumericExpression { readonly name: string; readonly variable: Variable; constructor(name: string); getVariables(): Variable[]; evaluate(context: EvaluationContext): number | undefined; } export declare class NumericLiteral extends NumericExpression { readonly value: number; constructor(value: number); getVariables(): Variable[]; evaluate(context: EvaluationContext): number | undefined; } export declare abstract class BinaryExpression extends NumericExpression { readonly operator: string; readonly left: NumericExpression; readonly right: NumericExpression; constructor(operator: string, left: NumericExpression, right: NumericExpression); getVariables(): Variable[]; } export declare abstract class NAryExpression extends NumericExpression { readonly operator: string; readonly children: NumericExpression[]; constructor(operator: string, children: NumericExpression[]); getVariables(): Variable[]; abstract reduce(left: number | undefined, right: number | undefined): number | undefined; abstract identity(): number; evaluate(context: EvaluationContext): number | undefined; } export declare class Sum extends NAryExpression { constructor(children: NumericExpression[]); reduce(left: number | undefined, right: number | undefined): number | undefined; identity(): number; } export declare class Subtraction extends BinaryExpression { constructor(left: NumericExpression, right: NumericExpression); evaluate(context: EvaluationContext): number | undefined; } export declare class Product extends NAryExpression { constructor(children: NumericExpression[]); reduce(left: number | undefined, right: number | undefined): number | undefined; identity(): number; } export declare class Division extends BinaryExpression { constructor(left: NumericExpression, right: NumericExpression); evaluate(context: EvaluationContext): number | undefined; }