sflow
Version:
sflow is a powerful and highly-extensible library designed for processing and manipulating streams of data effortlessly. Inspired by the functional programming paradigm, it provides a rich set of utilities for transforming streams, including chunking, fil
41 lines (39 loc) • 1.28 kB
text/typescript
import DIE from "phpdie";
/** Confluence of multiple flow sources by breadth first */
/** @deprecated use confluencesBy */
export const confluences = <T>({
order = "breadth",
}: {
order?: "breadth" | "deepth" | "faster";
} = {}): TransformStream<ReadableStream<T>, T> => {
const baseError = new Error();
if (order !== "breadth") DIE("not implemented");
const { writable, readable: sources } = new TransformStream<
ReadableStream<T>,
ReadableStream<T>
>();
const srcsQueue: ReadableStream<T>[] = [];
const readable = new ReadableStream({
async pull(ctrl) {
while (true) {
const src = await (async function () {
// get from source first
const r = sources.getReader();
const { done, value: src } = await r.read();
r.releaseLock();
if (done) return srcsQueue.shift(); // use queue if sources drain
return src;
})();
if (!src) return ctrl.close();
const r = src.getReader();
const { done, value } = await r.read();
r.releaseLock();
if (done) continue; // try next src
srcsQueue.push(src); // enqueue this src if not done
ctrl.enqueue(value);
return;
}
},
});
return { writable, readable };
};