@fbltd/async
Version:
Miscellaneous async utils
37 lines (36 loc) • 1.22 kB
JavaScript
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 };
}
};
}
};
}