@thi.ng/transducers-async
Version:
Async versions of various highly composable transducers, reducers and iterators
46 lines (45 loc) • 1.17 kB
JavaScript
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
};