import type { DataKey, Database } from "../util/data.js";
import type { Item, ItemQuery, Items, OptionalItem } from "../util/item.js";
import type { Sourceable } from "../util/source.js";
import type { Updates } from "../util/update.js";
import type { AsyncProvider, Provider } from "./Provider.js";
/** A provider that passes through to a synchronous source. */
export declare class ThroughProvider<T extends Database> implements Provider<T>, Sourceable<Provider<T>> {
    readonly source: Provider<T>;
    constructor(source: Provider<T>);
    getItem<K extends DataKey<T>>(collection: K, id: string): OptionalItem<T[K]>;
    requireItem<K extends DataKey<T>>(collection: K, id: string): Item<T[K]>;
    getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
    addItem<K extends DataKey<T>>(collection: K, data: T[K]): string;
    setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): void;
    updateItem<K extends DataKey<T>>(collection: K, id: string, update: Updates<T[K]>): void;
    deleteItem<K extends DataKey<T>>(collection: K, id: string): void;
    countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): number;
    getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Items<T[K]>;
    getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
    setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): void;
    updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, update: Updates<T[K]>): void;
    deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): void;
    getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): OptionalItem<T[K]>;
    requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Item<T[K]>;
}
/** A provider that passes through to an asynchronous source. */
export declare class AsyncThroughProvider<T extends Database> implements AsyncProvider<T>, Sourceable<AsyncProvider<T>> {
    readonly source: AsyncProvider<T>;
    constructor(source: AsyncProvider<T>);
    getItem<K extends DataKey<T>>(collection: K, id: string): Promise<OptionalItem<T[K]>>;
    requireItem<K extends DataKey<T>>(collection: K, id: string): Promise<Item<T[K]>>;
    getItemSequence<K extends DataKey<T>>(collection: K, id: string): AsyncIterable<OptionalItem<T[K]>>;
    addItem<K extends DataKey<T>>(collection: K, data: T[K]): Promise<string>;
    setItem<K extends DataKey<T>>(collection: K, id: string, data: T[K]): Promise<void>;
    updateItem<K extends DataKey<T>>(collection: K, id: string, updates: Updates<T[K]>): Promise<void>;
    deleteItem<K extends DataKey<T>>(collection: K, id: string): Promise<void>;
    countQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<number>;
    getQuery<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): Promise<Items<T[K]>>;
    getQuerySequence<K extends DataKey<T>>(collection: K, query?: ItemQuery<T[K]>): AsyncIterable<Items<T[K]>>;
    setQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, data: T[K]): Promise<void>;
    updateQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>, updates: Updates<T[K]>): Promise<void>;
    deleteQuery<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<void>;
    getFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<OptionalItem<T[K]>>;
    requireFirst<K extends DataKey<T>>(collection: K, query: ItemQuery<T[K]>): Promise<Item<T[K]>>;
}
