UNPKG

fluorine-lib

Version:

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

69 lines (53 loc) 1.77 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = distinctSelector; var _Observable = require('rxjs/Observable'); var Observable = _Observable.Observable; var _assert = require('./util/assert'); var assert = _interopRequireDefault(_assert).default; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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(); }); }); } module.exports = exports['default'];