/**
 * Copyright (c) 2019-present, GraphQL Foundation
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow strict
 */
export declare type BatchLoadFn<K, V> = (keys: ReadonlyArray<K>) => Promise<ReadonlyArray<V | Error>>;
export declare type Options<K, V, C = K> = {
    batch?: boolean;
    maxBatchSize?: number;
    batchScheduleFn?: (callback: () => void) => void;
    cache?: boolean;
    cacheKeyFn?: (key: K) => C;
    cacheMap?: CacheMap<C, Promise<V>> | null;
};
export declare type CacheMap<K, V> = {
    get(key: K): V | void;
    set(key: K, value: V): any;
    delete(key: K): any;
    clear(): any;
};
/**
 * A `DataLoader` creates a public API for loading data from a particular
 * data back-end with unique keys such as the `id` column of a SQL table or
 * document name in a MongoDB database, given a batch loading function.
 *
 * Each `DataLoader` instance contains a unique memoized cache. Use caution when
 * used in long-lived applications or those which serve many users with
 * different access permissions and consider creating a new instance per
 * web request.
 */
export declare class DataLoader<K, V, C = K> {
    constructor(batchLoadFn: BatchLoadFn<K, V>, options?: Options<K, V, C>);
    _batchLoadFn: BatchLoadFn<K, V>;
    _maxBatchSize: number;
    _batchScheduleFn: (callback: () => void) => void;
    _cacheKeyFn: (key: K) => C;
    _cacheMap: CacheMap<C, Promise<V>> | null;
    _batches: Batch<K, V>[];
    /**
     * Loads a key, returning a `Promise` for the value represented by that key.
     */
    load(key: K): Promise<V>;
    /**
     * Loads multiple keys, promising an array of values:
     *
     *     var [ a, b ] = await myLoader.loadMany([ 'a', 'b' ]);
     *
     * This is similar to the more verbose:
     *
     *     var [ a, b ] = await Promise.all([
     *       myLoader.load('a'),
     *       myLoader.load('b')
     *     ]);
     *
     * However it is different in the case where any load fails. Where
     * Promise.all() would reject, loadMany() always resolves, however each result
     * is either a value or an Error instance.
     *
     *     var [ a, b, c ] = await myLoader.loadMany([ 'a', 'b', 'badkey' ]);
     *     // c instanceof Error
     *
     */
    loadMany(keys: ReadonlyArray<K>): Promise<Array<V | Error>>;
    /**
     * Clears the value at `key` from the cache, if it exists. Returns itself for
     * method chaining.
     */
    clear(key: K): this;
    /**
     * Clears the entire cache. To be used when some event results in unknown
     * invalidations across this particular `DataLoader`. Returns itself for
     * method chaining.
     */
    clearAll(): this;
    /**
     * Adds the provided key and value to the cache. If the key already
     * exists, no change is made. Returns itself for method chaining.
     *
     * To prime the cache with an error at a key, provide an Error instance.
     */
    prime(key: K, value: V | Promise<V> | Error): this;
}
declare type Batch<K, V> = {
    keys: Array<K>;
    callbacks: Map<K, Array<{
        resolve: (value: V) => void;
        reject: (error: Error) => void;
    }>>;
    cacheHits?: Array<() => void>;
};
export {};
