export declare type Resolve<T> = (value: T) => void;
export declare type Reject = (error: Error) => void;
export declare function defer<T>(): [Promise<T>, Resolve<T>, Reject];
export declare class Queue<T> {
    private readonly promises;
    private readonly resolvers;
    dequeue(): Promise<T>;
    enqueue(value: T): void;
}
export declare type Protocol<T> = Data<T> | End;
export declare type Data<T> = {
    type: 'data';
    value: T;
};
export declare type End = {
    type: 'end';
};
export declare class Sender<T> {
    private readonly queue;
    constructor(queue: Queue<Protocol<T>>);
    send(value: T): void;
    end(): void;
}
export declare class Receiver<T> {
    private readonly queue;
    constructor(queue: Queue<Protocol<T>>);
    [Symbol.asyncIterator](): AsyncGenerator<Awaited<T>, void, unknown>;
}
export declare function channel<T>(): [Sender<T>, Receiver<T>];
declare type SelectInner<T extends Receiver<any>[]> = {
    [K in keyof T]: T[K] extends Receiver<infer U> ? U : never;
}[number];
export declare function select<R extends Receiver<any>[]>(receivers: [...R]): Receiver<SelectInner<R>>;
export {};
