1 import { Subscription } from '../Subscription';
2 import { subscribeToResult } from '../util/subscribeToResult';
3 import { OuterSubscriber } from '../OuterSubscriber';
4 export function bufferToggle(openings, closingSelector) {
5 return function bufferToggleOperatorFunction(source) {
6 return source.lift(new BufferToggleOperator(openings, closingSelector));
9 class BufferToggleOperator {
10 constructor(openings, closingSelector) {
11 this.openings = openings;
12 this.closingSelector = closingSelector;
14 call(subscriber, source) {
15 return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
18 class BufferToggleSubscriber extends OuterSubscriber {
19 constructor(destination, openings, closingSelector) {
21 this.openings = openings;
22 this.closingSelector = closingSelector;
24 this.add(subscribeToResult(this, openings));
27 const contexts = this.contexts;
28 const len = contexts.length;
29 for (let i = 0; i < len; i++) {
30 contexts[i].buffer.push(value);
34 const contexts = this.contexts;
35 while (contexts.length > 0) {
36 const context = contexts.shift();
37 context.subscription.unsubscribe();
38 context.buffer = null;
39 context.subscription = null;
45 const contexts = this.contexts;
46 while (contexts.length > 0) {
47 const context = contexts.shift();
48 this.destination.next(context.buffer);
49 context.subscription.unsubscribe();
50 context.buffer = null;
51 context.subscription = null;
56 notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
57 outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
59 notifyComplete(innerSub) {
60 this.closeBuffer(innerSub.context);
64 const closingSelector = this.closingSelector;
65 const closingNotifier = closingSelector.call(this, value);
66 if (closingNotifier) {
67 this.trySubscribe(closingNotifier);
74 closeBuffer(context) {
75 const contexts = this.contexts;
76 if (contexts && context) {
77 const { buffer, subscription } = context;
78 this.destination.next(buffer);
79 contexts.splice(contexts.indexOf(context), 1);
80 this.remove(subscription);
81 subscription.unsubscribe();
84 trySubscribe(closingNotifier) {
85 const contexts = this.contexts;
87 const subscription = new Subscription();
88 const context = { buffer, subscription };
89 contexts.push(context);
90 const innerSubscription = subscribeToResult(this, closingNotifier, context);
91 if (!innerSubscription || innerSubscription.closed) {
92 this.closeBuffer(context);
95 innerSubscription.context = context;
96 this.add(innerSubscription);
97 subscription.add(innerSubscription);
101 //# sourceMappingURL=bufferToggle.js.map