import { Observable, Observer } from './Observable'; import { Defer } from './utility'; export function createQueue() { type Data = { defer: Defer; data: D }; var feedNext: Observer['next'], stop: Observer['complete']; const observable = new Observable(({ next, complete }) => { (feedNext = next), (stop = complete); }); return { process(data: D) { const defer = new Defer(); if (!feedNext) throw Error("Can't process data before Queue consuming"); feedNext({ defer, data }); return defer.promise; }, destroy() { if (!stop) throw Error("Can't stop a Queue before Queue consuming"); stop(); }, observable }; }