fluorine-lib
Version:
Reactive state and side effect management for React using a single stream of actions
54 lines (44 loc) • 1.43 kB
JavaScript
import { Observable } from 'rxjs/Observable';
import assert from './util/assert';
export default function distinctSelector(keys) {
var _this = this;
var _containsStrings = keys.reduce(function (acc, str) {
return acc && typeof str === 'string';
}, true);
assert(Array.isArray(keys), 'Expected `keys` to be an array.');
assert(_containsStrings, 'Expected `keys` to contain only keys.');
return Observable.create(function (observer) {
var last = undefined;
return _this.subscribe(function (value) {
if (value === undefined || value === null || last === value) {
return;
}
var changed = false;
var result = {};
for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var key = _ref;
result[key] = value[key];
if (!changed || !last || result[key] !== last[key]) {
changed = true;
}
}
if (changed) {
observer.next(result);
}
last = value;
}, function (err) {
return observer.error(err);
}, function () {
return observer.complete();
});
});
}