type MapFn = (value: T) => R; type FlatChannel = { "done": T, "recur": T extends ReadChannel ? FlatChannel : T }[Depth extends -1 ? "done" : "recur"]; interface CancelablePromise extends Promise { cancel(): void; } interface OrderPromise extends CancelablePromise { channel: C; prethen(onFulfilled: (value: T) => void): void; } type UnwrapOrderPromise = A extends OrderPromise ? T : never export interface ReadChannel { concat>(...values: (T | C)[]): C; every(callback: (value: T) => boolean, thisArg?: any): Promise; filter(callback: (value: T) => boolean, thisArg?: any): ReadWriteChannel; flat(depth?: D): ReadWriteChannel>; flatMap(mapperFunction: MapFn, thisArg?: any): ReadWriteChannel; forEach(callbackfn: (value: T) => void, thisArg?: any): Promise; join(separator?: string): Promise; map(mapperFunction: MapFn, thisArg?: any): ReadWriteChannel; readOnly(): ReadChannel; reduce(callbackfn: (prev: any, next: T) => any, initialValue?: any): Promise; shift(): OrderPromise; slice(start?: number, end?: number): ReadWriteChannel; some(callbackfn: (value: T) => boolean, thisArg?: any): Promise; toString(): string; value(): T; values(): Promise; } export interface WriteChannel { close(): void; length(): number; push(value: T): OrderPromise; writeOnly(): WriteChannel; } export type ReadWriteChannel = ReadChannel & WriteChannel; import { Functionalify, Typify } from './functional'; // Ideally these would not be channels of `any`, but I couldn't find a way to pass on the generic arguments type FunctionalInterface = Functionalify>, ReadChannel> & Functionalify>, WriteChannel> type ChannelConstructor = { (length?: number): ReadWriteChannel; new (length?: number): ReadWriteChannel; all(...values: T[]): ReadWriteChannel; from(iterable: Iterable, mapfn?: MapFn, thisArg?: any): ReadChannel; from(callback: () => T): ReadChannel; of(...values: T): ReadChannel; isChannel | WriteChannel>(channel: T): channel is T; select[]>(promises: T): CancelablePromise>>; } & FunctionalInterface declare const Channel: ChannelConstructor; export default Channel;