export type Predicate = (arg: T) => boolean; export interface Task { isRunning(): boolean; isCancelled(): boolean; result(): any; result(): T; error(): any; done: Promise; cancel(): void; } export interface Buffer { isEmpty(): boolean; put(message: T): void; take(): T; } export interface Channel { take(cb: (message: T) => void, matcher?: Predicate): void; put?(message: T): void; close(): void; }