/**
 * TODO auto adjust concurrent size to optimize concurrency
 * currently solely relay on maxConcurrent
 *
 * data loading can be in arbitrary order,
 * data processing must be in order
 *
 * this impl is faster than TaskPool for large number of keys
 *
 * @param args.maxConcurrent: manually adjust to avoid out of memory
 * */
export declare function batchProcess<K, D>(args: {
    keys: K[];
    loader: (key: K) => Promise<D>;
    processor: (datum: D, key: K) => void | Promise<void>;
    maxConcurrent?: number;
}): Promise<void>;
