UNPKG

@fbltd/async

Version:

Miscellaneous async utils

37 lines (36 loc) 1.22 kB
import { symAI } from "../../constants.js"; import { PromiseConfiguration } from "../../promise-configuration.js"; export function raceStream(deps) { let externalDispose = new PromiseConfiguration(); const [keys, streams] = Object .entries(deps) .reduce((acc, [key, dep]) => { acc[0].push(key); acc[1].push(dep[symAI]({ externalDispose })); return acc; }, [[], []]); function isDisposed() { return streams.some((s) => s.isDisposed); } return { dispose: () => !isDisposed() && externalDispose.resolve({ done: true, value: void 0 }), get isDisposed() { return isDisposed(); }, [symAI]() { return { next: async () => { const res = await Promise.race(streams.map(s => s.next())); if (res.done) { return res; } const value = keys.reduce((acc, key) => { acc[key] = deps[key].value; return acc; }, {}); return { done: false, value }; } }; } }; }