1+ import Operator from '../Operator' ;
2+ import Observer from '../Observer' ;
3+ import Subscriber from '../Subscriber' ;
4+ import Scheduler from '../Scheduler' ;
5+ import Observable from '../Observable' ;
6+ import Subscription from '../Subscription' ;
7+
8+ import tryCatch from '../util/tryCatch' ;
9+ import { errorObject } from '../util/errorObject' ;
10+ import bindCallback from '../util/bindCallback' ;
11+
12+ export default function debounce < T > ( dueTime : number , scheduler : Scheduler = Scheduler . nextTick ) : Observable < T > {
13+ return this . lift ( new DebounceOperator ( dueTime , scheduler ) ) ;
14+ }
15+
16+ export class DebounceOperator < T , R > extends Operator < T , R > {
17+
18+ constructor ( private dueTime : number , private scheduler : Scheduler ) {
19+ super ( ) ;
20+ }
21+
22+ call ( observer : Observer < T > ) : Observer < T > {
23+ return new DebounceSubscriber ( observer , this . dueTime , this . scheduler ) ;
24+ }
25+ }
26+
27+ export class DebounceSubscriber < T > extends Subscriber < T > {
28+ private debounced : Subscription < any > ;
29+
30+ constructor ( destination : Observer < T > , private dueTime : number , private scheduler : Scheduler ) {
31+ super ( destination ) ;
32+ }
33+
34+ _next ( value : T ) {
35+ if ( ! this . debounced ) {
36+ this . add ( this . debounced = this . scheduler . schedule ( this . dueTime , { value, subscriber : this } , dispatchNext ) ) ;
37+ }
38+ }
39+
40+ clearDebounce ( ) {
41+ const debounced = this . debounced ;
42+ if ( debounced ) {
43+ debounced . unsubscribe ( ) ;
44+ this . remove ( debounced ) ;
45+ }
46+ }
47+
48+ debouncedNext ( value : T ) {
49+ this . clearDebounce ( ) ;
50+ this . destination . next ( value ) ;
51+ }
52+ }
53+
54+ function dispatchNext < T > ( { value, subscriber } ) {
55+ subscriber . debouncedNext ( value ) ;
56+ }
0 commit comments