import { $$deepDepSkip } from "../constants.ts";
import type { ExecutionDetails } from "../index.ts";
import type { GrafastResultsList, Maybe } from "../interfaces.ts";
import type { ListCapableStep } from "../step.ts";
import { Step } from "../step.ts";
import { __ItemStep } from "./__item.ts";
import type { ConnectionOptimizedStep, ItemsStep, StepRepresentingList } from "./connection.ts";
export type ListTransformReduce<TMemo, TItemPlanData> = (memo: TMemo, entireItemValue: unknown, itemPlanData: TItemPlanData) => TMemo;
export type ListTransformItemPlanCallback<TListStep extends Step<Maybe<readonly any[]>>, TDepsStep extends Step> = (listItemPlan: ItemsStep<TListStep> extends ListCapableStep<any, any> ? ReturnType<ItemsStep<TListStep>["listItem"]> : __ItemStep<any>) => TDepsStep;
export interface ListTransformOptions<TListStep extends StepRepresentingList<any>, TDepsStep extends Step, TMemo, TItemStep extends Step | undefined = undefined> {
    listStep: TListStep;
    itemPlanCallback: ListTransformItemPlanCallback<ItemsStep<TListStep>, TDepsStep>;
    initialState(): TMemo;
    reduceCallback: ListTransformReduce<TMemo, TDepsStep extends Step<infer U> ? U : never>;
    listItem?(itemPlan: Step): TItemStep;
    finalizeCallback?(data: TMemo): TMemo;
    meta?: string;
    optimize?: (this: __ListTransformStep<TListStep, TDepsStep, TMemo, TItemStep>) => Step;
    connectionClone?: ConnectionOptimizedStep<any, any, any, any>["connectionClone"];
}
/**
 * **Experimental.**
 *
 * A "special" plan that has custom handling in Grafast. Used for turning lists
 * into other things (or maybe more lists!).
 *
 * It's recommended that you don't use this directly, please use one of the
 * functions that uses this under the hood such as `filter()`.
 */
export declare class __ListTransformStep<TListStep extends StepRepresentingList<any> = StepRepresentingList<any>, TDepsStep extends Step = Step, TMemo = any, TItemStep extends Step | undefined = Step | undefined> extends Step<TMemo> {
    static $$export: {
        moduleName: string;
        exportName: string;
    };
    isSyncAndSafe: boolean;
    private listStepDepId;
    private rawListStepRefId;
    itemPlanCallback: ListTransformItemPlanCallback<ItemsStep<TListStep>, TDepsStep>;
    initialState: () => TMemo;
    reduceCallback: ListTransformReduce<TMemo, TDepsStep extends Step<infer U> ? U : never>;
    finalizeCallback?: (data: TMemo) => TMemo;
    listItem?: (itemPlan: __ItemStep<this>) => TItemStep;
    private meta;
    connectionClone?: ConnectionOptimizedStep<any, any, any, any>["connectionClone"];
    /** Set during query planning.  */
    itemStepId: number;
    constructor(options: ListTransformOptions<TListStep, TDepsStep, TMemo, TItemStep>);
    toStringMeta(): string | null;
    getListStep(): TListStep;
    [$$deepDepSkip](): TListStep;
    dangerouslyGetListPlan(): TListStep;
    deduplicate(peers: __ListTransformStep<any, any, any, any>[]): __ListTransformStep<TListStep, TDepsStep, TMemo, TItemStep>[];
    optimize(): Step;
    execute({ indexForEach, indexMap, values, extra, }: ExecutionDetails<[any[] | null | undefined | Error]>): Promise<GrafastResultsList<TMemo>>;
}
/**
 * **Experimental.**
 *
 * A "special" plan that has custom handling in Grafast. Used for turning lists
 * into other things (or maybe more lists!).
 *
 * {@page ~grafast/steps/listTransform.md}
 */
export declare function listTransform<TListStep extends StepRepresentingList<any>, TDepsStep extends Step, TMemo, TItemStep extends Step | undefined = undefined>(options: ListTransformOptions<TListStep, TDepsStep, TMemo, TItemStep>): __ListTransformStep<TListStep, TDepsStep, TMemo, TItemStep>;
//# sourceMappingURL=listTransform.d.ts.map