import { ArithmeticOperator, BaseExpressionFields, BooleanExpression, BooleanValueType, ComparisonOperator, ContinuousDimensionType, DiscreteDimensionType, EnumExpression, Expression, FloatExpression, FloatValueType, FunctionValueType, IntExpression, IntValueType, ListValueType, NoOpExpression, ObjectValueType, Parameter, RegexExpression, StringExpression, StringValueType, ValueType, VariableExpression, VoidValueType } from "../types";
type FoldPartialResult<TFoldResult> = null | NoOpExpression | BooleanExpression | IntExpression | FloatExpression | StringExpression | RegexExpression | EnumExpression | (BaseExpressionFields & {
    type: "ObjectExpression";
    valueType: ObjectValueType;
    objectTypeName: string;
    fields: {
        [fieldName: string]: TFoldResult;
    };
}) | (BaseExpressionFields & {
    type: "GetFieldExpression";
    valueType: ValueType;
    object: TFoldResult;
    fieldPath: string | null;
}) | (BaseExpressionFields & {
    type: "UpdateObjectExpression";
    valueType: ObjectValueType;
    object: TFoldResult;
    updates: {
        [fieldName: string]: TFoldResult;
    };
}) | (BaseExpressionFields & {
    type: "ListExpression";
    valueType: ListValueType;
    items: TFoldResult[];
}) | (BaseExpressionFields & {
    type: "SwitchExpression";
    valueType: ValueType;
    control: TFoldResult;
    cases: {
        id: string;
        when: TFoldResult;
        then: TFoldResult;
    }[];
    default: TFoldResult;
}) | (BaseExpressionFields & {
    type: "EnumSwitchExpression";
    valueType: ValueType;
    control: TFoldResult;
    cases: {
        [enumValue: string]: TFoldResult;
    };
}) | (BaseExpressionFields & {
    type: "ComparisonExpression";
    valueType: BooleanValueType;
    operator: ComparisonOperator | null;
    a: TFoldResult;
    b: TFoldResult;
}) | (BaseExpressionFields & {
    type: "ArithmeticExpression";
    valueType: IntValueType | FloatValueType;
    operator: ArithmeticOperator | null;
    a: TFoldResult;
    b: TFoldResult;
}) | (BaseExpressionFields & {
    type: "RoundNumberExpression";
    valueType: IntValueType;
    number: TFoldResult;
}) | (BaseExpressionFields & {
    type: "StringifyNumberExpression";
    valueType: StringValueType;
    number: TFoldResult;
}) | (BaseExpressionFields & {
    type: "StringConcatExpression";
    valueType: StringValueType;
    strings: TFoldResult;
}) | (BaseExpressionFields & {
    type: "GetUrlQueryParameterExpression";
    valueType: StringValueType;
    url: TFoldResult;
    queryParameterName: TFoldResult;
}) | (BaseExpressionFields & {
    type: "SplitExpression";
    valueType: ValueType;
    splitId: string | null;
    dimensionId: string | null;
    expose: TFoldResult;
    unitId: TFoldResult;
    dimensionMapping: {
        type: typeof DiscreteDimensionType;
        cases: {
            [armId: string]: TFoldResult;
        };
    } | {
        type: typeof ContinuousDimensionType;
        function: TFoldResult;
    };
    eventObjectTypeName: string | null;
    eventPayload: TFoldResult;
}) | (BaseExpressionFields & {
    type: "LogEventExpression";
    valueType: VoidValueType;
    eventObjectTypeName: string | null;
    eventPayload: TFoldResult;
    eventTypeId: string | null;
    unitId: TFoldResult;
}) | (BaseExpressionFields & {
    type: "FunctionExpression";
    valueType: FunctionValueType;
    parameters: Parameter[];
    body: TFoldResult;
}) | VariableExpression | (BaseExpressionFields & {
    type: "ApplicationExpression";
    valueType: ValueType;
    function: TFoldResult;
    arguments: TFoldResult[];
});
type FoldFunction<TFoldResult> = (partialResult: FoldPartialResult<TFoldResult>) => TFoldResult;
export default function fold<TFoldResult>(f: FoldFunction<TFoldResult>, expression: Expression | null): TFoldResult;
export declare function mapExpressionWithResult<TMapResult>(fn: (expr: Expression | null) => {
    newExpression: Expression | null;
    mapResult: TMapResult;
}, combineResults: (...results: TMapResult[]) => TMapResult, expression: Expression | null): {
    newExpression: Expression | null;
    mapResult: TMapResult;
};
export declare function mapExpression(mapper: (expr: Expression | null) => Expression | null, expression: Expression | null): Expression | null;
export {};
//# sourceMappingURL=fold.d.ts.map