multitude
Version:
Comprehensive streams for push and pull
44 lines (43 loc) • 1.6 kB
TypeScript
import { MaybePromise } from 'type-core';
export declare namespace Pull {
interface LikeConstructor {
new <O, I = void>(provider: Provider<O, I>): Like<O, I>;
prototype: Like<any, any>;
}
interface PullableConstructor {
new <O, I = void>(provider: Provider<O, I>): Pullable<O, I>;
from<O, I = void>(item: Convertible<O, I>): Pullable<O, I>;
prototype: Pullable<any, any>;
}
type Convertible<O, I = void> = Like<O, I> | Compatible<O, I> | Iterable<O>;
interface Like<O, I = void> {
source: Source<O, I>;
}
interface Compatible<O, I = void> {
[Symbol.asyncIterator](): AsyncIterator<O, void, I>;
}
interface Pullable<O, I = void> extends Compatible<O, I>, Like<O, I> {
consume(consumer: Consumer<O, I>): void;
}
type Provider<O, I> = () => Iterator<O, I | void>;
type Consumer<O, I> = () => Iterator<I, O>;
type Source<O, I> = () => PullableIterator<O, I | void>;
type Sink<O, I> = () => PullableIterator<I, O>;
interface Iterator<O, I> {
next?: (value: I) => MaybePromise<Response<O>>;
error?: (reason: Error) => MaybePromise<Response<O>>;
complete?: () => MaybePromise<void>;
}
interface PullableIterator<O, I> extends Iterator<O, I> {
next: (value: I) => MaybePromise<Response<O>>;
error: (reason: Error) => MaybePromise<Response<O>>;
complete: () => MaybePromise<void>;
}
type Response<T> = {
complete?: false;
value: T;
} | {
complete: true;
value?: void;
};
}