streams
Version:
A lazy streams library for functional composition in JavaScript.
86 lines • 7.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeAsyncGeneratorPair = makeAsyncGeneratorPair;
function makeAsyncGeneratorPair(consumerHandlers, producerHandlers) {
const puts = [];
const takes = [];
function makeAsyncGenerator(name, puts, takes, { onReturn, onThrow } = {}) {
let done = false;
function next(send) {
if (done) {
return Promise.resolve({ done: true, value: undefined });
}
const { message: received, response } = takes.shift() ?? {};
// The other side arrived first... close the link!
if (received !== undefined) {
// Send the other side our message
if (response !== undefined) {
const { m, error } = send;
if (m !== undefined) {
response.resolve(m);
}
else {
response.reject(error);
}
}
// Special case: drain the other side's queue if done
if (send.m?.done || send.error !== undefined) {
for (const { response } of takes) {
response?.resolve({ done: true, value: undefined });
}
takes.length = 0;
}
// Receive the other side's message.
const { m, error } = received;
if (m !== undefined) {
if (m.done) {
done = true;
}
return Promise.resolve(m);
}
else {
done = true;
return Promise.reject(error);
}
}
// We are here first... send the other side our message and await
// the other side's response.
return new Promise((resolve, reject) => {
puts.push({ message: send, response: { resolve, reject } });
});
}
return {
// @ts-expect-error for Debugging
[Symbol.toStringTag]: `AsyncIterator${name}`,
[Symbol.asyncIterator]() {
return this;
},
next(value) {
return next({ m: { value: value, done: false } });
},
async return(value) {
if (done) {
return { value: undefined, done: true };
}
next({ m: { value: value, done: true } });
done = true;
const returnValue = await onReturn?.(this, value);
return { value: returnValue, done: true };
},
async throw(error) {
if (done) {
return { value: undefined, done: true };
}
next({ error });
done = true;
const returnValue = await (onThrow ?? onReturn)?.(this, error);
return { value: returnValue, done: true };
},
};
}
return [
makeAsyncGenerator("Consumer", puts, takes, consumerHandlers),
makeAsyncGenerator("Producer", takes, puts, producerHandlers),
];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtaXRlcmF0b3ItcGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsL2FzeW5jLWl0ZXJhdG9yLXBhaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzQkEsd0RBa0dDO0FBbEdELFNBQWdCLHNCQUFzQixDQUNwQyxnQkFBK0MsRUFDL0MsZ0JBQStDO0lBRS9DLE1BQU0sSUFBSSxHQUFvQyxFQUFFLENBQUM7SUFDakQsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztJQUVsRCxTQUFTLGtCQUFrQixDQUN6QixJQUFZLEVBQ1osSUFBcUMsRUFDckMsS0FBc0MsRUFDdEMsRUFBRSxRQUFRLEVBQUUsT0FBTyxLQUFtQyxFQUFFO1FBRXhELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztRQUVqQixTQUFTLElBQUksQ0FDWCxJQUE2QjtZQUU3QixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTVELGtEQUFrRDtZQUNsRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0Isa0NBQWtDO2dCQUNsQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQzFCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNwQixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENB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