UNPKG

transgate

Version:

Agent-based task flow framework

55 lines (54 loc) 1.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const buffer_1 = require("../gate/buffer"); /** * Merging items from gates for Input */ class Mixer { /** * @param {...Gate} outGates - source gates */ constructor(...inGates) { this._buffer = new buffer_1.ItemBuffer(); this._runnerAliveSet = new Set(); this._runners = inGates.map((g, idx) => this._createRunner(g, idx)); } /** * execute. */ async run() { return await Promise.all(this._runners); } /** * @return {Promise<object>} - A promise that resolves the item when recevied */ async receive() { return await this._buffer.read(); } async _createRunner(gate, idx) { this._runnerAliveSet.add(idx); let item; while ((item = await gate.receive()) !== null) { await this._buffer.write(item); } await this._destroyRunner(idx); } async _destroyRunner(idx) { this._runnerAliveSet.delete(idx); if (this._runnerAliveSet.size === 0) { await this._buffer.write(null); } } } exports.Mixer = Mixer; /** * Merging items from gates for Input * @param {...Gate} outGates - source gates * @return {Mixer} */ function mixer(...inGates) { const m = new Mixer(...inGates); m.run(); return m; } exports.mixer = mixer;