rxjs
Version:
Reactive Extensions for modern JavaScript
53 lines • 1.73 kB
JavaScript
import { Subscriber } from '../Subscriber';
import { tryCatch } from '../util/tryCatch';
import { errorObject } from '../util/errorObject';
export function distinctUntilChanged(compare, keySelector) {
return (source) => source.lift(new DistinctUntilChangedOperator(compare, keySelector));
}
class DistinctUntilChangedOperator {
constructor(compare, keySelector) {
this.compare = compare;
this.keySelector = keySelector;
}
call(subscriber, source) {
return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
}
}
class DistinctUntilChangedSubscriber extends Subscriber {
constructor(destination, compare, keySelector) {
super(destination);
this.keySelector = keySelector;
this.hasKey = false;
if (typeof compare === 'function') {
this.compare = compare;
}
}
compare(x, y) {
return x === y;
}
_next(value) {
const keySelector = this.keySelector;
let key = value;
if (keySelector) {
key = tryCatch(this.keySelector)(value);
if (key === errorObject) {
return this.destination.error(errorObject.e);
}
}
let result = false;
if (this.hasKey) {
result = tryCatch(this.compare)(this.key, key);
if (result === errorObject) {
return this.destination.error(errorObject.e);
}
}
else {
this.hasKey = true;
}
if (Boolean(result) === false) {
this.key = key;
this.destination.next(value);
}
}
}
//# sourceMappingURL=distinctUntilChanged.js.map