import { type RowNode } from "@1771technologies/lytenyte-shared";
import type { LeafOrParent, TreeLeaf, TreeRootAndApi } from "./async-tree/types.js";
import { RangeTree } from "./range-tree/range-tree.js";
import type { DataRequest, DataResponse, DataResponsePinned } from "./types.js";
export type DataFetcher = (req: DataRequest[], expansions: Record<string, boolean | undefined>) => Promise<(DataResponse | DataResponsePinned)[]>;
export interface FlatView {
    readonly tree: TreeRootAndApi;
    readonly top: number;
    readonly center: number;
    readonly bottom: number;
    readonly rangeTree: RangeTree;
    readonly rowIndexToRow: Map<number, RowNode<any>>;
    readonly rowIdToRow: Map<string, RowNode<any>>;
    readonly rowIdToRowIndex: Map<string, number>;
    readonly rowIdToTreeNode: Map<string, LeafOrParent>;
    readonly loading: Set<number>;
    readonly loadingGroup: Set<number>;
    readonly errored: Map<number, {
        error: unknown;
        request?: DataRequest;
    }>;
    readonly erroredGroup: Map<number, {
        error: unknown;
        request: DataRequest;
    }>;
    readonly maxDepth: number;
    readonly seenRequests: Set<string>;
}
export interface ServerDataConstructorParams {
    readonly blocksize: number;
    readonly expansions: Record<string, boolean | undefined>;
    readonly onResetLoadBegin: () => void;
    readonly onResetLoadError: (error: unknown) => void;
    readonly onResetLoadEnd: () => void;
    readonly onFlatten: (r: FlatView) => void;
    readonly onInvalidate: () => void;
    readonly defaultExpansion: boolean | number;
}
export declare class ServerData {
    #private;
    tree: TreeRootAndApi;
    flat: FlatView;
    constructor({ blocksize, expansions, onResetLoadBegin, onResetLoadEnd, onResetLoadError, onFlatten, onInvalidate, defaultExpansion, }: ServerDataConstructorParams);
    set dataFetcher(d: DataFetcher);
    set expansions(d: Record<string, boolean | undefined>);
    set defaultExpansion(d: boolean | number);
    set rowViewBounds(viewBounds: [start: number, end: number]);
    reset: () => Promise<void>;
    requestForGroup(i: number): DataRequest | null;
    handleRequests: (requests: DataRequest[], opts?: {
        onError?: (e: unknown) => void;
        onSuccess?: () => void;
        skipState?: boolean;
    }) => Promise<void>;
    handleResponses: (data: (DataResponse | DataResponsePinned)[], beforeOnFlat?: () => void) => void;
    requestForNextSlice(req: DataRequest): {
        id: string;
        path: (string | null)[];
        start: number;
        end: number;
        rowStartIndex: number;
        rowEndIndex: number;
    } | null;
    requestsForView(start?: number, end?: number): DataRequest[];
    handleViewBoundsChange(): Promise<void>;
    retry(): void;
    addBefore(leafs: TreeLeaf[]): void;
    addAfter(leafs: TreeLeaf[]): void;
    deleteBefore(leafs: string[]): void;
    deleteAfter(leafs: string[]): void;
    updateRow(id: string, data: any, asOf?: number): void;
    flatten: () => void;
}
