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.closingSelector = closingSelector;
23 this.add(subscribeToResult(this, openings));
26 const contexts = this.contexts;
27 const len = contexts.length;
28 for (let i = 0; i < len; i++) {
29 contexts[i].buffer.push(value);
33 const contexts = this.contexts;
34 while (contexts.length > 0) {
35 const context = contexts.shift();
36 context.subscription.unsubscribe();
37 context.buffer = null;
38 context.subscription = null;
44 const contexts = this.contexts;
45 while (contexts.length > 0) {
46 const context = contexts.shift();
47 this.destination.next(context.buffer);
48 context.subscription.unsubscribe();
49 context.buffer = null;
50 context.subscription = null;
55 notifyNext(outerValue, innerValue) {
56 outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
58 notifyComplete(innerSub) {
59 this.closeBuffer(innerSub.context);
63 const closingSelector = this.closingSelector;
64 const closingNotifier = closingSelector.call(this, value);
65 if (closingNotifier) {
66 this.trySubscribe(closingNotifier);
73 closeBuffer(context) {
74 const contexts = this.contexts;
75 if (contexts && context) {
76 const { buffer, subscription } = context;
77 this.destination.next(buffer);
78 contexts.splice(contexts.indexOf(context), 1);
79 this.remove(subscription);
80 subscription.unsubscribe();
83 trySubscribe(closingNotifier) {
84 const contexts = this.contexts;
86 const subscription = new Subscription();
87 const context = { buffer, subscription };
88 contexts.push(context);
89 const innerSubscription = subscribeToResult(this, closingNotifier, context);
90 if (!innerSubscription || innerSubscription.closed) {
91 this.closeBuffer(context);
94 innerSubscription.context = context;
95 this.add(innerSubscription);
96 subscription.add(innerSubscription);
100 //# sourceMappingURL=bufferToggle.js.map