UNPKG

fluorine-lib

Version:

Reactive state and side effect management for React using a single stream of actions

54 lines (44 loc) 1.43 kB
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(); }); }); }