UNPKG

12.4 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var index_1 = require("../index");
4var FCAMIL = /** @class */ (function () {
5 function FCAMIL(out, op) {
6 this.out = out;
7 this.op = op;
8 }
9 FCAMIL.prototype._n = function (t) {
10 this.out._n(t);
11 };
12 FCAMIL.prototype._e = function (err) {
13 this.out._e(err);
14 };
15 FCAMIL.prototype._c = function () {
16 this.op.less();
17 };
18 return FCAMIL;
19}());
20var FlattenConcAMOperator = /** @class */ (function () {
21 function FlattenConcAMOperator(n, ins) {
22 this.n = n;
23 this.ins = ins;
24 this.type = 'flattenConcurrentlyAtMost';
25 this.out = null;
26 this._l = 0;
27 this._d = false;
28 this._seq = [];
29 }
30 FlattenConcAMOperator.prototype._start = function (out) {
31 this.out = out;
32 this.ins._add(this);
33 };
34 FlattenConcAMOperator.prototype._stop = function () {
35 this.ins._remove(this);
36 this._l = 0;
37 this.out = null;
38 this._seq = [];
39 };
40 FlattenConcAMOperator.prototype.less = function () {
41 var seq = this._seq;
42 if (--this._l === 0 && seq.length === 0 && this._d) {
43 var u = this.out;
44 if (!u)
45 return;
46 u._c();
47 }
48 if (this._l < this.n && seq.length > 0) {
49 this._n(seq.shift());
50 }
51 };
52 FlattenConcAMOperator.prototype._n = function (s) {
53 var u = this.out;
54 if (!u)
55 return;
56 if (this._l < this.n) {
57 this._l++;
58 s._add(new FCAMIL(u, this));
59 }
60 else {
61 this._seq.push(s);
62 }
63 };
64 FlattenConcAMOperator.prototype._e = function (err) {
65 var u = this.out;
66 if (!u)
67 return;
68 u._e(err);
69 };
70 FlattenConcAMOperator.prototype._c = function () {
71 var seq = this._seq;
72 this._d = true;
73 if (this._l === 0 && seq.length === 0) {
74 var u = this.out;
75 if (!u)
76 return;
77 u._c();
78 }
79 };
80 return FlattenConcAMOperator;
81}());
82exports.FlattenConcAMOperator = FlattenConcAMOperator;
83/**
84 * Flattens a "stream of streams", handling multiple concurrent nested streams
85 * simultaneously, up to some limit `n`.
86 *
87 * If the input stream is a stream that emits streams, then this operator will
88 * return an output stream which is a flat stream: emits regular events. The
89 * flattening happens concurrently, up to the configured limit. It works like
90 * this: when the input stream emits a nested stream,
91 * *flattenConcurrentlyAtMost* will start imitating that nested one. When the
92 * next nested stream is emitted on the input stream,
93 * *flattenConcurrentlyAtMost* will check to see how many streams it is connected
94 * to. If it is connected to a number of streams less than the limit, it will also
95 * imitate that new one, but will continue to imitate the previous nested streams
96 * as well.
97 *
98 * If the limit has already been reached, *flattenConcurrentlyAtMost* will put the
99 * stream in a queue. When any of the streams it is listening to completes, a stream
100 * is taken out of the queue and `flattenConcurrentlyAtMost` will connect to it.
101 *
102 * This process continues until the metastream completes and there are no more
103 * connected streams or streams in the queue.
104 *
105 * Marble diagrams:
106 *
107 * ```text
108 * --+--------+---------------
109 * \ \
110 * \ ----1----2---3--|
111 * --a--b----c----|
112 * flattenConcurrentlyAtMost(1)
113 * -----a--b----c-1----2---3--|
114 * ```
115 *
116 * ```text
117 * --+---+---+-|
118 * \ \ \
119 * \ \ ---fgh----i-----jh--|
120 * \ -----1----2----3--|
121 * ---a--b-----c--|
122 * flattenConcurrentlyAtMost(2)
123 * ---------a--b-1---c2--i-3------fgh----i-----jh--|
124 * ```
125 *
126 * @return {Stream}
127 */
128function flattenConcurrentlyAtMost(n) {
129 return function flattenConcAMOperator(ins) {
130 return new index_1.Stream(new FlattenConcAMOperator(n, ins));
131 };
132}
133exports.default = flattenConcurrentlyAtMost;
134//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdHRlbkNvbmN1cnJlbnRseUF0TW9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRyYS9mbGF0dGVuQ29uY3VycmVudGx5QXRNb3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQXVGO0FBRXZGO0lBQ0UsZ0JBQW1CLEdBQWMsRUFDYixFQUE0QjtRQUQ3QixRQUFHLEdBQUgsR0FBRyxDQUFXO1FBQ2IsT0FBRSxHQUFGLEVBQUUsQ0FBMEI7SUFDaEQsQ0FBQztJQUVELG1CQUFFLEdBQUYsVUFBRyxDQUFJO1FBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVELG1CQUFFLEdBQUYsVUFBRyxHQUFRO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1CQUFFLEdBQUY7UUFDRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FBQyxBQWhCRCxJQWdCQztBQUVEO0lBT0UsK0JBQW1CLENBQVMsRUFBUyxHQUFzQjtRQUF4QyxNQUFDLEdBQUQsQ0FBQyxDQUFRO1FBQVMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFOcEQsU0FBSSxHQUFHLDJCQUEyQixDQUFDO1FBQ25DLFFBQUcsR0FBYyxJQUFXLENBQUM7UUFDNUIsT0FBRSxHQUFXLENBQUMsQ0FBQztRQUNmLE9BQUUsR0FBWSxLQUFLLENBQUM7UUFDcEIsU0FBSSxHQUFxQixFQUFFLENBQUM7SUFHcEMsQ0FBQztJQUVELHNDQUFNLEdBQU4sVUFBTyxHQUFjO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELHFDQUFLLEdBQUw7UUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBVyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxvQ0FBSSxHQUFKO1FBQ0UsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFDZixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBZSxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsa0NBQUUsR0FBRixVQUFHLENBQVk7UUFDYixJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNmLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVELGtDQUFFLEdBQUYsVUFBRyxHQUFRO1FBQ1QsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDZixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELGtDQUFFLEdBQUY7UUFDRSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQyxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFDZixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDUjtJQUNILENBQUM7SUFDSCw0QkFBQztBQUFELENBQUMsQUE1REQsSUE0REM7QUE1RFksc0RBQXFCO0FBOERsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFDSCxTQUF3Qix5QkFBeUIsQ0FBSSxDQUFTO0lBQzVELE9BQU8sU0FBUyxxQkFBcUIsQ0FBQyxHQUF3QztRQUM1RSxPQUFPLElBQUksY0FBTSxDQUFJLElBQUkscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUpELDRDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3BlcmF0b3IsIFN0cmVhbSwgTWVtb3J5U3RyZWFtLCBPdXRTZW5kZXIsIEludGVybmFsTGlzdGVuZXIgfSBmcm9tICcuLi9pbmRleCc7XG5cbmNsYXNzIEZDQU1JTDxUPiBpbXBsZW1lbnRzIEludGVybmFsTGlzdGVuZXI8VD4sIE91dFNlbmRlcjxUPiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvdXQ6IFN0cmVhbTxUPixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvcDogRmxhdHRlbkNvbmNBTU9wZXJhdG9yPFQ+KSB7XG4gIH1cblxuICBfbih0OiBUKSB7XG4gICAgdGhpcy5vdXQuX24odCk7XG4gIH1cblxuICBfZShlcnI6IGFueSkge1xuICAgIHRoaXMub3V0Ll9lKGVycik7XG4gIH1cblxuICBfYygpIHtcbiAgICB0aGlzLm9wLmxlc3MoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmxhdHRlbkNvbmNBTU9wZXJhdG9yPFQ+IGltcGxlbWVudHMgT3BlcmF0b3I8U3RyZWFtPFQ+LCBUPiB7XG4gIHB1YmxpYyB0eXBlID0gJ2ZsYXR0ZW5Db25jdXJyZW50bHlBdE1vc3QnO1xuICBwdWJsaWMgb3V0OiBTdHJlYW08VD4gPSBudWxsIGFzIGFueTtcbiAgcHJpdmF0ZSBfbDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zZXE6IEFycmF5PFN0cmVhbTxUPj4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbjogbnVtYmVyLCBwdWJsaWMgaW5zOiBTdHJlYW08U3RyZWFtPFQ+Pikge1xuICB9XG5cbiAgX3N0YXJ0KG91dDogU3RyZWFtPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5vdXQgPSBvdXQ7XG4gICAgdGhpcy5pbnMuX2FkZCh0aGlzKTtcbiAgfVxuXG4gIF9zdG9wKCk6IHZvaWQge1xuICAgIHRoaXMuaW5zLl9yZW1vdmUodGhpcyk7XG4gICAgdGhpcy5fbCA9IDA7XG4gICAgdGhpcy5vdXQgPSBudWxsIGFzIGFueTtcbiAgICB0aGlzLl9zZXEgPSBbXTtcbiAgfVxuXG4gIGxlc3MoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VxID0gdGhpcy5fc2VxO1xuICAgIGlmICgtLXRoaXMuX2wgPT09IDAgJiYgc2VxLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9kKSB7XG4gICAgICBjb25zdCB1ID0gdGhpcy5vdXQ7XG4gICAgICBpZiAoIXUpIHJldHVybjtcbiAgICAgIHUuX2MoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2wgPCB0aGlzLm4gJiYgc2VxLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX24oc2VxLnNoaWZ0KCkgYXMgU3RyZWFtPFQ+KTtcbiAgICB9XG4gIH1cblxuICBfbihzOiBTdHJlYW08VD4pIHtcbiAgICBjb25zdCB1ID0gdGhpcy5vdXQ7XG4gICAgaWYgKCF1KSByZXR1cm47XG4gICAgaWYgKHRoaXMuX2wgPCB0aGlzLm4pIHtcbiAgICAgIHRoaXMuX2wrKztcbiAgICAgIHMuX2FkZChuZXcgRkNBTUlMKHUsIHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VxLnB1c2gocyk7XG4gICAgfVxuICB9XG5cbiAgX2UoZXJyOiBhbnkpIHtcbiAgICBjb25zdCB1ID0gdGhpcy5vdXQ7XG4gICAgaWYgKCF1KSByZXR1cm47XG4gICAgdS5fZShlcnIpO1xuICB9XG5cbiAgX2MoKSB7XG4gICAgY29uc3Qgc2VxID0gdGhpcy5fc2VxO1xuICAgIHRoaXMuX2QgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9sID09PSAwICYmIHNlcS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHUgPSB0aGlzLm91dDtcbiAgICAgIGlmICghdSkgcmV0dXJuO1xuICAgICAgdS5fYygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgXCJzdHJlYW0gb2Ygc3RyZWFtc1wiLCBoYW5kbGluZyBtdWx0aXBsZSBjb25jdXJyZW50IG5lc3RlZCBzdHJlYW1zXG4gKiBzaW11bHRhbmVvdXNseSwgdXAgdG8gc29tZSBsaW1pdCBgbmAuXG4gKlxuICogSWYgdGhlIGlucHV0IHN0cmVhbSBpcyBhIHN0cmVhbSB0aGF0IGVtaXRzIHN0cmVhbXMsIHRoZW4gdGhpcyBvcGVyYXRvciB3aWxsXG4gKiByZXR1cm4gYW4gb3V0cHV0IHN0cmVhbSB3aGljaCBpcyBhIGZsYXQgc3RyZWFtOiBlbWl0cyByZWd1bGFyIGV2ZW50cy4gVGhlXG4gKiBmbGF0dGVuaW5nIGhhcHBlbnMgY29uY3VycmVudGx5LCB1cCB0byB0aGUgY29uZmlndXJlZCBsaW1pdC4gSXQgd29ya3MgbGlrZVxuICogdGhpczogd2hlbiB0aGUgaW5wdXQgc3RyZWFtIGVtaXRzIGEgbmVzdGVkIHN0cmVhbSxcbiAqICpmbGF0dGVuQ29uY3VycmVudGx5QXRNb3N0KiB3aWxsIHN0YXJ0IGltaXRhdGluZyB0aGF0IG5lc3RlZCBvbmUuIFdoZW4gdGhlXG4gKiBuZXh0IG5lc3RlZCBzdHJlYW0gaXMgZW1pdHRlZCBvbiB0aGUgaW5wdXQgc3RyZWFtLFxuICogKmZsYXR0ZW5Db25jdXJyZW50bHlBdE1vc3QqIHdpbGwgY2hlY2sgdG8gc2VlIGhvdyBtYW55IHN0cmVhbXMgaXQgaXMgY29ubmVjdGVkXG4gKiB0by4gSWYgaXQgaXMgY29ubmVjdGVkIHRvIGEgbnVtYmVyIG9mIHN0cmVhbXMgbGVzcyB0aGFuIHRoZSBsaW1pdCwgaXQgd2lsbCBhbHNvXG4gKiBpbWl0YXRlIHRoYXQgbmV3IG9uZSwgYnV0IHdpbGwgY29udGludWUgdG8gaW1pdGF0ZSB0aGUgcHJldmlvdXMgbmVzdGVkIHN0cmVhbXNcbiAqIGFzIHdlbGwuXG4gKlxuICogSWYgdGhlIGxpbWl0IGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCwgKmZsYXR0ZW5Db25jdXJyZW50bHlBdE1vc3QqIHdpbGwgcHV0IHRoZVxuICogc3RyZWFtIGluIGEgcXVldWUuIFdoZW4gYW55IG9mIHRoZSBzdHJlYW1zIGl0IGlzIGxpc3RlbmluZyB0byBjb21wbGV0ZXMsIGEgc3RyZWFtXG4gKiBpcyB0YWtlbiBvdXQgb2YgdGhlIHF1ZXVlIGFuZCBgZmxhdHRlbkNvbmN1cnJlbnRseUF0TW9zdGAgd2lsbCBjb25uZWN0IHRvIGl0LlxuICpcbiAqIFRoaXMgcHJvY2VzcyBjb250aW51ZXMgdW50aWwgdGhlIG1ldGFzdHJlYW0gY29tcGxldGVzIGFuZCB0aGVyZSBhcmUgbm8gbW9yZVxuICogY29ubmVjdGVkIHN0cmVhbXMgb3Igc3RyZWFtcyBpbiB0aGUgcXVldWUuXG4gKlxuICogTWFyYmxlIGRpYWdyYW1zOlxuICpcbiAqIGBgYHRleHRcbiAqIC0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLVxuICogICBcXCAgICAgICAgXFxcbiAqICAgIFxcICAgICAgIC0tLS0xLS0tLTItLS0zLS18XG4gKiAgICAtLWEtLWItLS0tYy0tLS18XG4gKiAgICAgZmxhdHRlbkNvbmN1cnJlbnRseUF0TW9zdCgxKVxuICogLS0tLS1hLS1iLS0tLWMtMS0tLS0yLS0tMy0tfFxuICogYGBgXG4gKlxuICogYGBgdGV4dFxuICogLS0rLS0tKy0tLSstfFxuICogICAgXFwgICBcXCAgIFxcXG4gKiAgICAgXFwgICBcXCAgIC0tLWZnaC0tLS1pLS0tLS1qaC0tfFxuICogICAgICBcXCAgIC0tLS0tMS0tLS0yLS0tLTMtLXxcbiAqICAgICAgIC0tLWEtLWItLS0tLWMtLXxcbiAqICAgICBmbGF0dGVuQ29uY3VycmVudGx5QXRNb3N0KDIpXG4gKiAtLS0tLS0tLS1hLS1iLTEtLS1jMi0taS0zLS0tLS0tZmdoLS0tLWktLS0tLWpoLS18XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJlYW19XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5Db25jdXJyZW50bHlBdE1vc3Q8VD4objogbnVtYmVyKTogKGluczogU3RyZWFtPFN0cmVhbTxUPiB8IE1lbW9yeVN0cmVhbTxUPj4pID0+IFN0cmVhbTxUPiB7XG4gIHJldHVybiBmdW5jdGlvbiBmbGF0dGVuQ29uY0FNT3BlcmF0b3IoaW5zOiBTdHJlYW08U3RyZWFtPFQ+IHwgTWVtb3J5U3RyZWFtPFQ+Pikge1xuICAgIHJldHVybiBuZXcgU3RyZWFtPFQ+KG5ldyBGbGF0dGVuQ29uY0FNT3BlcmF0b3IobiwgaW5zKSk7XG4gIH07XG59XG4iXX0=
\No newline at end of file