UNPKG

@thi.ng/transducers-async

Version:

Async versions of various highly composable transducers, reducers and iterators

46 lines (45 loc) 1.17 kB
import { fifo } from "@thi.ng/buffers/fifo"; import { isNumber } from "@thi.ng/checks/is-number"; import { illegalState } from "@thi.ng/errors/illegal-state"; const source = (initial, buffer = 1) => { const queue = isNumber(buffer) ? fifo(buffer) : buffer; let last = initial; let state = 0; let promise; let resolve; const newPromise = () => { promise = new Promise(($resolve) => { resolve = $resolve; }); }; newPromise(); const gen = async function* () { while (true) { const val = await promise; last = val; if (val === void 0) break; yield val; newPromise(); if (queue.readable()) resolve(queue.read()); } state = 2; }(); gen.write = (x) => { if (state > 0) return; if (resolve) { resolve(x); resolve = void 0; } else if (queue.writable()) { queue.write(x); if (x === void 0) state = 1; } else illegalState("buffer overflow"); }; gen.update = (fn, ...args) => gen.write(fn(last, ...args)); gen.close = () => gen.write(void 0); gen.deref = () => last; if (initial !== void 0) gen.write(initial); return gen; }; export { source };