import type { Fn, Intersected } from "../utils/types"; import type { Passthrough } from "./iterator"; type Task = { tasks: { group: string | undefined; controller: AbortController }[]; controller: AbortController; id: string; args: T; }; interface Options { transform: ( generators: AsyncGenerator>>[], task: Task> ) => AsyncGenerator, true>>; concurrency: number; timeout: number; group?: string; cache: number; rate: number; } type Schedule = ( | { relative: number; absolute?: never; } | { relative?: never; absolute: number; } ) & { interval?: number; }; interface Executor { tasks: Set<{ controller: AbortController; group: string | undefined }>; controller: AbortController; group: string | undefined; } type Ctx = Record | unknown; type Context = T & { signal: AbortSignal; }; type Catcher = (error: Error & PoolError) => void; type Override = | ({ group?: string; context?: never } | { group: string; context: T }) | void; interface PoolError { handler?: string; caller?: string; trace: string[]; reason: string; pool: string; } interface State extends Options { cached: Map>[]>; listeners: Set>; executing: Set; pending: Set; catchers: Set; last?: Date; id: string; } declare const mapped: unique symbol; type Mapped = { [mapped]: true; from: T; to: U; }; type Result = T extends Mapped ? Map extends true ? B : A : T; type Handler = (( this: Context, ...args: Parameters ) => | Generator< | Result> | Promise>> | Passthrough, void > | (Result> extends Promise ? never : Result>)) & { group?: string; }; type PoolGenerator = AsyncGenerator, void> & PromiseLike[]> & { executor: Executor; }; type Caller = Intersected< T extends (..._: infer A) => infer U ? ( this: Override, ...args: A ) => Split extends false ? PoolGenerator : Map> : unknown >; type Filter = | { group: string; caller?: never; handler?: never } | { group?: never; caller: string; handler?: string } | { group?: never; caller?: string; handler: string }; type Pool any, C extends Ctx = unknown> = { (this: Override, handler: Handler): () => void; bind: (context: Override) => Pool; schedule: (when: Schedule) => Caller; where: (group: string) => Caller; catch: (handler?: Catcher) => void; abort: (filter?: Filter) => void; drain: (filter?: Filter) => void; close: (filter?: Filter) => void; status: () => State; split(): Caller; [state: symbol]: State; } & Caller & (C extends Record ? { context: (context: Partial) => void } : unknown); type PoolMaker = { void>(id: string, options?: Partial>): Pool< T, C >; bind(context: Override & { scope?: string }): PoolMaker; }; type Pools = Omit< { [key in keyof Pool]: Pool[key] extends (..._: infer A) => infer R ? { (id?: null | "*", ..._: A): R extends void ? R : R[]; (id: string, ..._: A): R; } : never; }, "bind" | "catch" | "context" > & { catch: (handler?: Catcher) => void; contexts: Map; count(): number; pool: PoolMaker; }; export type { PoolError, PoolMaker, Executor, Override, Options, Handler, Catcher, Result, Mapped, Filter, Pools, Task, Pool, Ctx, };