UNPKG

streams

Version:

A lazy streams library for functional composition in JavaScript.

86 lines 7.31 kB
"use strict"; 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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