@@ -35,29 +35,29 @@ import {InnerSubscriber} from '../InnerSubscriber';
35
35
* @see {@link bufferWhen }
36
36
* @see {@link windowToggle }
37
37
*
38
- * @param {Observable <O> } openings An observable of notifications to start new
38
+ * @param {SubscribableOrPromise <O> } openings A Subscribable or Promise of notifications to start new
39
39
* buffers.
40
- * @param {function(value: O): Observable } closingSelector A function that takes
40
+ * @param {function(value: O): SubscribableOrPromise } closingSelector A function that takes
41
41
* the value emitted by the `openings` observable and returns a Subscribable or Promise,
42
42
* which, when it emits, signals that the associated buffer should be emitted
43
43
* and cleared.
44
44
* @return {Observable<T[]> } An observable of arrays of buffered values.
45
45
* @method bufferToggle
46
46
* @owner Observable
47
47
*/
48
- export function bufferToggle < T , O > ( openings : Observable < O > ,
49
- closingSelector : ( value : O ) => SubscribableOrPromise < any > | void ) : Observable < T [ ] > {
48
+ export function bufferToggle < T , O > ( openings : SubscribableOrPromise < O > ,
49
+ closingSelector : ( value : O ) => SubscribableOrPromise < any > ) : Observable < T [ ] > {
50
50
return this . lift ( new BufferToggleOperator < T , O > ( openings , closingSelector ) ) ;
51
51
}
52
52
53
53
export interface BufferToggleSignature < T > {
54
- < O > ( openings : Observable < O > , closingSelector : ( value : O ) => SubscribableOrPromise < any > | void ) : Observable < T [ ] > ;
54
+ < O > ( openings : SubscribableOrPromise < O > , closingSelector : ( value : O ) => SubscribableOrPromise < any > ) : Observable < T [ ] > ;
55
55
}
56
56
57
57
class BufferToggleOperator < T , O > implements Operator < T , T [ ] > {
58
58
59
- constructor ( private openings : Observable < O > ,
60
- private closingSelector : ( value : O ) => SubscribableOrPromise < any > | void ) {
59
+ constructor ( private openings : SubscribableOrPromise < O > ,
60
+ private closingSelector : ( value : O ) => SubscribableOrPromise < any > ) {
61
61
}
62
62
63
63
call ( subscriber : Subscriber < T [ ] > , source : any ) : any {
@@ -79,10 +79,10 @@ class BufferToggleSubscriber<T, O> extends OuterSubscriber<T, O> {
79
79
private contexts : Array < BufferContext < T > > = [ ] ;
80
80
81
81
constructor ( destination : Subscriber < T [ ] > ,
82
- private openings : Observable < O > ,
82
+ private openings : SubscribableOrPromise < O > ,
83
83
private closingSelector : ( value : O ) => SubscribableOrPromise < any > | void ) {
84
84
super ( destination ) ;
85
- this . add ( this . openings . subscribe ( new BufferToggleOpeningsSubscriber ( this ) ) ) ;
85
+ this . add ( subscribeToResult ( this , openings ) ) ;
86
86
}
87
87
88
88
protected _next ( value : T ) : void {
@@ -118,7 +118,17 @@ class BufferToggleSubscriber<T, O> extends OuterSubscriber<T, O> {
118
118
super . _complete ( ) ;
119
119
}
120
120
121
- openBuffer ( value : O ) : void {
121
+ notifyNext ( outerValue : any , innerValue : O ,
122
+ outerIndex : number , innerIndex : number ,
123
+ innerSub : InnerSubscriber < T , O > ) : void {
124
+ outerValue ? this . closeBuffer ( outerValue ) : this . openBuffer ( innerValue ) ;
125
+ }
126
+
127
+ notifyComplete ( innerSub : InnerSubscriber < T , O > ) : void {
128
+ this . closeBuffer ( ( < any > innerSub ) . context ) ;
129
+ }
130
+
131
+ private openBuffer ( value : O ) : void {
122
132
try {
123
133
const closingSelector = this . closingSelector ;
124
134
const closingNotifier = closingSelector . call ( this , value ) ;
@@ -130,16 +140,6 @@ class BufferToggleSubscriber<T, O> extends OuterSubscriber<T, O> {
130
140
}
131
141
}
132
142
133
- notifyNext ( outerValue : any , innerValue : O ,
134
- outerIndex : number , innerIndex : number ,
135
- innerSub : InnerSubscriber < T , O > ) : void {
136
- this . closeBuffer ( outerValue ) ;
137
- }
138
-
139
- notifyComplete ( innerSub : InnerSubscriber < T , O > ) : void {
140
- this . closeBuffer ( ( < any > innerSub ) . context ) ;
141
- }
142
-
143
143
private closeBuffer ( context : BufferContext < T > ) : void {
144
144
const contexts = this . contexts ;
145
145
@@ -162,36 +162,13 @@ class BufferToggleSubscriber<T, O> extends OuterSubscriber<T, O> {
162
162
163
163
const innerSubscription = subscribeToResult ( this , closingNotifier , < any > context ) ;
164
164
165
- if ( ! innerSubscription . isUnsubscribed ) {
165
+ if ( ! innerSubscription || innerSubscription . isUnsubscribed ) {
166
+ this . closeBuffer ( context ) ;
167
+ } else {
166
168
( < any > innerSubscription ) . context = context ;
167
169
168
170
this . add ( innerSubscription ) ;
169
171
subscription . add ( innerSubscription ) ;
170
- } else {
171
- this . closeBuffer ( context ) ;
172
172
}
173
173
}
174
- }
175
-
176
- /**
177
- * We need this JSDoc comment for affecting ESDoc.
178
- * @ignore
179
- * @extends {Ignored }
180
- */
181
- class BufferToggleOpeningsSubscriber < T , O > extends Subscriber < O > {
182
- constructor ( private parent : BufferToggleSubscriber < T , O > ) {
183
- super ( null ) ;
184
- }
185
-
186
- protected _next ( value : O ) {
187
- this . parent . openBuffer ( value ) ;
188
- }
189
-
190
- protected _error ( err : any ) {
191
- this . parent . error ( err ) ;
192
- }
193
-
194
- protected _complete ( ) {
195
- // noop
196
- }
197
- }
174
+ }
0 commit comments