import type { ConnectionOptimizedStep, ExecutionDetails } from "../index.ts";
import type { ExecutionDetailsStream, GrafastResultsList, Maybe, PromiseOrDirect, Thunk } from "../interfaces.ts";
import type { Multistep, UnwrapMultistep } from "../multistep.ts";
import { Step } from "../step.ts";
import { type IOEquivalence } from "./_loadCommon.ts";
import type { PaginationFeatures, PaginationParams } from "./connection.ts";
import { LoadedRecordStep } from "./loadedRecord.ts";
export interface LoadManyInfo<TItem, TParams extends Record<string, any>, TShared = never> {
    shared: TShared;
    attributes: ReadonlyArray<keyof TItem>;
    params: Partial<TParams>;
    /** @deprecated Please use `shared` instead (it's simply renamed) */
    unary: TShared;
}
export type LoadManyCallback<TLookup, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>> = Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, TParams extends Record<string, any> = Record<string, any>, TShared = never> = {
    (lookups: ReadonlyArray<TLookup>, info: LoadManyInfo<TItem, TParams, TShared>): PromiseOrDirect<ReadonlyArray<TData>>;
    displayName?: string;
};
/**
 * A TypeScript Identity Function to help you strongly type your
 * LoadManyCallback.
 */
export declare function loadManyCallback<TLookup, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>> = Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, TParams extends Record<string, any> = Record<string, any>, TShared = never>(load: LoadManyCallback<TLookup, TItem, TData, TParams, TShared>): LoadManyCallback<TLookup, TItem, TData, TParams, TShared>;
/**
 * A TypeScript Identity Function to help you strongly type your
 * LoadManyLoader.
 */
export declare function loadManyLoader<const TSpec, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>> = Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, TParams extends Record<string, any> = Record<string, any>, const TShared extends Multistep = never>(load: LoadManyLoader<TSpec, TItem, TData, TParams, TShared>): LoadManyLoader<TSpec, TItem, TData, TParams, TShared>;
interface LoadManyBaseParams {
    [key: string]: Maybe<any>;
    reverse?: Maybe<boolean>;
    after?: Maybe<string>;
    offset?: Maybe<number>;
    limit?: Maybe<number>;
}
export declare class LoadManyStep<const TLookup extends Multistep, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, // loadMany
TParams extends LoadManyBaseParams = any, const TShared extends Multistep = never> extends Step<TData> implements Partial<ConnectionOptimizedStep<TItem, any, any, any>> {
    static $$export: {
        moduleName: string;
        exportName: string;
    };
    isSyncAndSafe: boolean;
    loadInfo: Omit<LoadManyInfo<TItem, TParams, UnwrapMultistep<TShared>>, "shared" | "unary" | "params"> | null;
    loadInfoKey: string;
    attributes: Set<keyof TItem>;
    paramDepIdByKey: {
        [TKey in keyof TParams]: number;
    };
    sharedDepId: number | null;
    private ioEquivalence;
    private load;
    paginationSupport?: PaginationFeatures;
    private name;
    /** Direct field stream */
    private _fieldMightStream;
    /** Maybe its a connection with a `nodes @stream` or `edges @stream`. Null = unknown */
    private _fieldMightStreamViaConnection;
    constructor(lookup: TLookup, loader: LoadManyLoader<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared>);
    addStreamDetails?($streamDetails: Step<ExecutionDetailsStream | null> | null): void;
    private mightHaveStream;
    toStringMeta(): string | null;
    private _accessMap;
    private getAccessMap;
    listItem($item: Step): LoadedRecordStep<TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<infer U>> ? U extends Maybe<TItem> ? U : never : never, TParams>;
    setParam<TParamKey extends keyof TParams>(paramKey: TParamKey, value: TParams[TParamKey] | Step<Maybe<TParams[TParamKey]>>): void;
    setParams<TParams extends {
        [key in keyof TParams]?: TParams[key] | Step<Maybe<TParams[key]>>;
    }>(params: TParams): void;
    addAttributes(attributes: Set<keyof TItem>): void;
    deduplicate(peers: readonly LoadManyStep<any, any, any, any, any>[]): LoadManyStep<any, any, any, any, any>[];
    deduplicatedWith(replacement: LoadManyStep<any, any, any, any, any>): void;
    _paramSig?: string;
    getParamSignature(): string;
    optimize(): this;
    finalize(): void;
    execute(details: ExecutionDetails): PromiseOrDirect<GrafastResultsList<TData>>;
    applyPagination?($params: Step<PaginationParams<any>>): void;
    connectionClone(): LoadManyStep<TLookup, TItem, TData, TParams, TShared> & ConnectionOptimizedStep<any, any, any, any>;
}
export interface LoadManyLoader<TSpec, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>> = Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, TParams extends LoadManyBaseParams = LoadManyBaseParams, TShared extends Multistep = never> {
    /**
     * The function that actually loads data from the backend
     */
    load: LoadManyCallback<TSpec, TItem, TData, TParams, UnwrapMultistep<TShared>>;
    /** Name your function (for plan diagrams/debugging) */
    name?: string;
    /**
     * Details of anything your `load` function will need access to, for example
     * database connections, API clients, etc.
     */
    shared?: Thunk<TShared>;
    /**
     * Details of which attributes on the output are equivalent to those on the
     * input (if any), useful for reducing unnecessary fetches (e.g. load the
     * friends of a user by their id without ever loading the user).
     */
    ioEquivalence?: IOEquivalence<TSpec>;
    /**
     * Describes the feature the `load` function supports relating to pagination.
     * Even an empty object indicates that the load function supports `limit`, so
     * if this is not supported do not set this attribute.
     */
    paginationSupport?: PaginationFeatures;
}
export declare function loadMany<const TLookup extends Multistep, TItem, TData extends Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>> = Maybe<ReadonlyArrayOrAsyncIterable<Maybe<TItem>>>, TParams extends Record<string, any> = Record<string, any>, const TShared extends Multistep = never>(lookup: TLookup, loader: LoadManyCallback<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared> | LoadManyLoader<UnwrapMultistep<TLookup>, TItem, TData, TParams, TShared>): LoadManyStep<UnwrapMultistep<TLookup>, TItem, TData, TParams, UnwrapMultistep<TShared>>;
type ReadonlyArrayOrAsyncIterable<T> = ReadonlyArray<T> | AsyncIterable<T, void, unknown>;
export {};
//# sourceMappingURL=loadMany.d.ts.map