export interface AsyncSink { put(value: TValue | Promise): void; } export interface AsyncSpring { get(): Promise; } export interface AsyncQueue extends AsyncSpring, AsyncSink {} // Stream is nearly identical to AsyncGenerator and AsyncGenerator should // probably be identical to this definition of Stream. // Stream does not make the mistake of conflating the read and write return // types. export interface Stream< TRead, TWrite = undefined, TReadReturn = undefined, TWriteReturn = undefined, > { next(value: TWrite): Promise>; return(value: TWriteReturn): Promise>; throw(error: Error): Promise>; [Symbol.asyncIterator](): Stream; } export type Reader = Stream< TRead, undefined, TReadReturn, undefined >; export type Writer = Stream< undefined, TWrite, undefined, TWriteReturn >; export declare function makeQueue(): AsyncQueue; export declare function makeStream< TRead, TWrite = undefined, TReadReturn = undefined, TWriteReturn = undefined, >( acks: AsyncSpring>, data: AsyncSink>, ): Stream; export declare function makePipe< TRead, TWrite = undefined, TReadReturn = undefined, TWriteReturn = undefined, >(): [ Stream, Stream, ]; export declare function pump< TRead, TWrite = unknown, TReadReturn = unknown, TWriteReturn = unknown, >( writer: Stream, reader: Stream, primer?: TWrite, ): Promise; export declare function prime( writer: AsyncGenerator, ): // primer is implicitly undefined for this overload. Stream; // ESLint hasn't heard about overloads. // eslint-disable-next-line no-redeclare export declare function prime( writer: AsyncGenerator, primer: TWrite, ): Stream; export declare function mapReader< TReadIn, TReadOut = TReadIn, TWrite = undefined, TReadReturn = undefined, TWriteReturn = undefined, >( reader: Stream, transform: (value: TReadIn) => TReadOut, ): Stream; export declare function mapWriter< TWriteIn, TWriteOut = TWriteIn, TRead = undefined, TReadReturn = undefined, TWriteReturn = undefined, >( writer: Stream, transform: (value: TWriteIn) => TWriteOut, ): Stream;