import { OpenPromise } from "./OpenPromise.js"; export class Stream implements AsyncIterable { public pending: OpenPromise = new OpenPromise(); [Symbol.asyncIterator](): AsyncIterator { return new StreamIterator(this); } append(value: T) { //console.warn("STREAMING WITH", value); this.pending.resolve(value); this.pending = new OpenPromise(); } } export class StreamIterator implements AsyncIterator { constructor(public source: Stream) { } next(): Promise> { let prom: Promise>; prom = new Promise(async (resolve, reject) => { this.source.pending.then((value: T) => { resolve({ done: false, value: value as T }); }); this.source.pending.catch((reason: any) => { resolve({ done: true, value: undefined }); }) }); return prom; } }