/**
 * @license
 * Copyright (c) 2025 Handsoncode. All rights reserved.
 */
import { ProcedureAst } from '../../parser';
import { InterpreterState } from '../InterpreterState';
import { ExtendedNumber, InternalScalarValue } from '../InterpreterValue';
import { FunctionPlugin, FunctionPluginTypecheck, ImplementedFunctions } from './FunctionPlugin';
export declare type BinaryOperation<T> = (left: T, right: T) => T;
export declare type MapOperation<T> = (arg: ExtendedNumber) => T;
export declare class NumericAggregationPlugin extends FunctionPlugin implements FunctionPluginTypecheck<NumericAggregationPlugin> {
    static implementedFunctions: ImplementedFunctions;
    static aliases: {
        VAR: string;
        VARP: string;
        STDEV: string;
        STDEVP: string;
        VARS: string;
        STDEVS: string;
    };
    /**
     * Corresponds to SUM(Number1, Number2, ...).
     *
     * Returns a sum of given numbers.
     *
     * @param ast
     * @param state
     */
    sum(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    sumsq(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    /**
     * Corresponds to MAX(Number1, Number2, ...).
     *
     * Returns a max of given numbers.
     *
     * @param ast
     * @param state
     */
    max(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    maxa(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    /**
     * Corresponds to MIN(Number1, Number2, ...).
     *
     * Returns a min of given numbers.
     *
     * @param ast
     * @param state
     */
    min(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    mina(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    count(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    counta(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    average(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    averagea(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    vars(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    varp(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    vara(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    varpa(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    stdevs(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    stdevp(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    stdeva(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    stdevpa(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    product(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    subtotal(ast: ProcedureAst, state: InterpreterState): InternalScalarValue;
    private reduceAggregate;
    private reduceAggregateA;
    private doAverage;
    private doVarS;
    private doVarP;
    private doStdevS;
    private doStdevP;
    private doCount;
    private doCounta;
    private doMax;
    private doMin;
    private doSum;
    private doProduct;
    private addWithEpsilonRaw;
    /**
     * Reduces procedure arguments with given reducing function
     *
     * @param args
     * @param state
     * @param initialAccValue - "neutral" value (equivalent of 0)
     * @param functionName - function name to use as cache key
     * @param reducingFunction - reducing function
     * @param mapFunction
     * @param coercionFunction
     */
    private reduce;
    /**
     * Performs range operation on given range
     *
     * @param {CellRangeAst | ColumnRangeAst | RowRangeAst} ast - cell range ast
     * @param {InterpreterState} state - interpreter state
     * @param {T} initialAccValue - initial accumulator value for reducing function
     * @param {string} functionName - function name to use as cache key
     * @param {BinaryOperation<T>} reducingFunction - reducing function
     * @param {MapOperation<T>} mapFunction - mapper transforming coerced scalar
     * @param {coercionOperation} coercionFunction - scalar-to-number coercer
     */
    private evaluateRange;
    /**
     * Checks whether both ends of a range point to existing sheets (placeholders excluded).
     */
    private isSheetValid;
    /**
     * Returns list of values for given range and function name
     *
     * If range is dependent on smaller range, list will contain value of smaller range for this function
     * and values of cells that are not present in smaller range
     *
     * @param functionName - function name (e.g., SUM)
     * @param range - cell range
     * @param rangeVertex
     * @param mapFunction
     * @param coercionFunction
     */
    private getRangeValues;
}
