UNPKG

live-set

Version:

Class representing a changing and transformable collection of items.

156 lines (140 loc) 16.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = flatMapR; var _ = _interopRequireDefault(require(".")); function flatMapR(liveSet, cb) { var isReading = false; return new _.default({ scheduler: liveSet.getScheduler(), read: function read() { if (isReading) { throw new Error('reading inactive recursively-flatMapped stream is not supported'); } isReading = true; var s = new Set(); liveSet.values().forEach(function (value) { var childSet = cb(value); childSet.values().forEach(function (value) { s.add(value); }); }); isReading = false; return s; }, listen: function listen(setValues, controller) { var mainSubCompleted = false; var hasSubscribedToChildren = false; var nextHasFired = false; var childSetSubs = new Map(); function childSetSubscribe(childSet) { if (childSet.isEnded()) { // optimization childSet.values().forEach(function (value) { controller.add(value); }); } else { childSet.subscribe({ start: function start(sub) { childSetSubs.set(childSet, sub); childSet.values().forEach(function (value) { controller.add(value); }); }, next: function next(changes) { nextHasFired = true; changes.forEach(function (change) { if (change.type === 'add') { controller.add(change.value); } else if (change.type === 'remove') { controller.remove(change.value); } }); }, error: function error(err) { controller.error(err); }, complete: function complete() { childSetSubs.delete(childSet); if (mainSubCompleted && childSetSubs.size === 0) { controller.end(); } } }); } } setValues(new Set()); var childSets = new Map(); var mainSub = liveSet.subscribe({ start: function start() { liveSet.values().forEach(function (value) { var childSet = cb(value); childSets.set(value, childSet); childSetSubscribe(childSet); }); hasSubscribedToChildren = true; }, next: function next(changes) { nextHasFired = true; changes.forEach(function (change) { if (change.type === 'add') { var childSet = cb(change.value); childSets.set(change.value, childSet); childSetSubscribe(childSet); } else if (change.type === 'remove') { var _childSet = childSets.get(change.value); if (!_childSet) throw new Error('removed value not in liveset'); _childSet.values().forEach(function (value) { controller.remove(value); }); childSets.delete(change.value); var childSetSub = childSetSubs.get(_childSet); if (childSetSub) { // We won't have the subscription if the childSet ended already childSetSub.unsubscribe(); childSetSubs.delete(_childSet); } } }); }, error: function error(err) { controller.error(err); }, complete: function complete() { mainSubCompleted = true; if (hasSubscribedToChildren && childSetSubs.size === 0) { controller.end(); } } }); var isPullingChanges = false; return { unsubscribe: function unsubscribe() { mainSub.unsubscribe(); childSetSubs.forEach(function (sub) { sub.unsubscribe(); }); childSets.clear(); childSetSubs.clear(); }, pullChanges: function pullChanges() { if (isPullingChanges) return; isPullingChanges = true; do { nextHasFired = false; mainSub.pullChanges(); childSetSubs.forEach(function (sub) { sub.pullChanges(); }); } while (nextHasFired); isPullingChanges = false; } }; } }); } module.exports = exports.default; module.exports.default = exports.default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9mbGF0TWFwUi5qcyJdLCJuYW1lcyI6WyJmbGF0TWFwUiIsImxpdmVTZXQiLCJjYiIsImlzUmVhZGluZyIsIkxpdmVTZXQiLCJzY2hlZHVsZXIiLCJnZXRTY2hlZHVsZXIiLCJyZWFkIiwiRXJyb3IiLCJzIiwiU2V0IiwidmFsdWVzIiwiZm9yRWFjaCIsInZhbHVlIiwiY2hpbGRTZXQiLCJhZGQiLCJsaXN0ZW4iLCJzZXRWYWx1ZXMiLCJjb250cm9sbGVyIiwibWFpblN1YkNvbXBsZXRlZCIsImhhc1N1YnNjcmliZWRUb0NoaWxkcmVuIiwibmV4dEhhc0ZpcmVkIiwiY2hpbGRTZXRTdWJzIiwiTWFwIiwiY2hpbGRTZXRTdWJzY3JpYmUiLCJpc0VuZGVkIiwic3Vic2NyaWJlIiwic3RhcnQiLCJzdWIiLCJzZXQiLCJuZXh0IiwiY2hhbmdlcyIsImNoYW5nZSIsInR5cGUiLCJyZW1vdmUiLCJlcnJvciIsImVyciIsImNvbXBsZXRlIiwiZGVsZXRlIiwic2l6ZSIsImVuZCIsImNoaWxkU2V0cyIsIm1haW5TdWIiLCJnZXQiLCJjaGlsZFNldFN1YiIsInVuc3Vic2NyaWJlIiwiaXNQdWxsaW5nQ2hhbmdlcyIsImNsZWFyIiwicHVsbENoYW5nZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBOztBQUdlLFNBQVNBLFFBQVQsQ0FBdUJDLE9BQXZCLEVBQTRDQyxFQUE1QyxFQUFzRjtBQUNuRyxNQUFJQyxTQUFTLEdBQUcsS0FBaEI7QUFFQSxTQUFPLElBQUlDLFNBQUosQ0FBWTtBQUNqQkMsSUFBQUEsU0FBUyxFQUFFSixPQUFPLENBQUNLLFlBQVIsRUFETTtBQUVqQkMsSUFBQUEsSUFGaUIsa0JBRVY7QUFDTCxVQUFJSixTQUFKLEVBQWU7QUFDYixjQUFNLElBQUlLLEtBQUosQ0FBVSxpRUFBVixDQUFOO0FBQ0Q7O0FBQ0RMLE1BQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0EsVUFBTU0sQ0FBQyxHQUFHLElBQUlDLEdBQUosRUFBVjtBQUNBVCxNQUFBQSxP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QUFBLEdBQUcsQ0FBQ29CLFdBQUo7QUFDRCxhQUZEO0FBR0QsV0FORCxRQU1TM0IsWUFOVDs7QUFRQXlCLFVBQUFBLGdCQUFnQixHQUFHLEtBQW5CO0FBQ0Q7QUF0QkksT0FBUDtBQXdCRDtBQWxJZ0IsR0FBWixDQUFQO0FBb0lEIiwic291cmNlc0NvbnRlbnQiOlsiLyogQGZsb3cgKi9cblxuaW1wb3J0IExpdmVTZXQgZnJvbSAnLic7XG5pbXBvcnQgdHlwZSB7TGl2ZVNldFN1YnNjcmlwdGlvbn0gZnJvbSAnLic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXRNYXBSPFQsVT4obGl2ZVNldDogTGl2ZVNldDxUPiwgY2I6ICh2YWx1ZTogVCkgPT4gTGl2ZVNldDxVPik6IExpdmVTZXQ8VT4ge1xuICBsZXQgaXNSZWFkaW5nID0gZmFsc2U7XG5cbiAgcmV0dXJuIG5ldyBMaXZlU2V0KHtcbiAgICBzY2hlZHVsZXI6IGxpdmVTZXQuZ2V0U2NoZWR1bGVyKCksXG4gICAgcmVhZCgpIHtcbiAgICAgIGlmIChpc1JlYWRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFkaW5nIGluYWN0aXZlIHJlY3Vyc2l2ZWx5LWZsYXRNYXBwZWQgc3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlzUmVhZGluZyA9IHRydWU7XG4gICAgICBjb25zdCBzID0gbmV3IFNldCgpO1xuICAgICAgbGl2ZVNldC52YWx1ZXMoKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRTZXQgPSBjYih2YWx1ZSk7XG4gICAgICAgIGNoaWxkU2V0LnZhbHVlcygpLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgIHMuYWRkKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlzUmVhZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcbiAgICBsaXN0ZW4oc2V0VmFsdWVzLCBjb250cm9sbGVyKSB7XG4gICAgICBsZXQgbWFpblN1YkNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgbGV0IGhhc1N1YnNjcmliZWRUb0NoaWxkcmVuID0gZmFsc2U7XG4gICAgICBsZXQgbmV4dEhhc0ZpcmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjaGlsZFNldFN1YnM6IE1hcDxMaXZlU2V0PFU+LCBMaXZlU2V0U3Vic2NyaXB0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAgICAgZnVuY3Rpb24gY2hpbGRTZXRTdWJzY3JpYmUoY2hpbGRTZXQ6IExpdmVTZXQ8VT4pIHtcbiAgICAgICAgaWYgKGNoaWxkU2V0LmlzRW5kZWQoKSkgeyAvLyBvcHRpbWl6YXRpb25cbiAgICAgICAgICBjaGlsZFNldC52YWx1ZXMoKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKHZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZFNldC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgc3RhcnQoc3ViKSB7XG4gICAgICAgICAgICAgIGNoaWxkU2V0U3Vicy5zZXQoY2hpbGRTZXQsIHN1Yik7XG4gICAgICAgICAgICAgIGNoaWxkU2V0LnZhbHVlcygpLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dChjaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIG5leHRIYXNGaXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkKGNoYW5nZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UudHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlKGNoYW5nZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgICBjaGlsZFNldFN1YnMuZGVsZXRlKGNoaWxkU2V0KTtcbiAgICAgICAgICAgICAgaWYgKG1haW5TdWJDb21wbGV0ZWQgJiYgY2hpbGRTZXRTdWJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVuZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0VmFsdWVzKG5ldyBTZXQoKSk7XG4gICAgICBjb25zdCBjaGlsZFNldHM6IE1hcDxULCBMaXZlU2V0PFU+PiA9IG5ldyBNYXAoKTtcblxuICAgICAgY29uc3QgbWFpblN1YiA9IGxpdmVTZXQuc3Vic2NyaWJlKHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgbGl2ZVNldC52YWx1ZXMoKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkU2V0ID0gY2IodmFsdWUpO1xuICAgICAgICAgICAgY2hpbGRTZXRzLnNldCh2YWx1ZSwgY2hpbGRTZXQpO1xuICAgICAgICAgICAgY2hpbGRTZXRTdWJzY3JpYmUoY2hpbGRTZXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc1N1YnNjcmliZWRUb0NoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dChjaGFuZ2VzKSB7XG4gICAgICAgICAgbmV4dEhhc0ZpcmVkID0gdHJ1ZTtcbiAgICAgICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRTZXQgPSBjYihjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICBjaGlsZFNldHMuc2V0KGNoYW5nZS52YWx1ZSwgY2hpbGRTZXQpO1xuICAgICAgICAgICAgICBjaGlsZFNldFN1YnNjcmliZShjaGlsZFNldCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS50eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFNldCA9IGNoaWxkU2V0cy5nZXQoY2hhbmdlLnZhbHVlKTtcbiAgICAgICAgICAgICAgaWYgKCFjaGlsZFNldCkgdGhyb3cgbmV3IEVycm9yKCdyZW1vdmVkIHZhbHVlIG5vdCBpbiBsaXZlc2V0Jyk7XG4gICAgICAgICAgICAgIGNoaWxkU2V0LnZhbHVlcygpLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNoaWxkU2V0cy5kZWxldGUoY2hhbmdlLnZhbHVlKTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRTZXRTdWIgPSBjaGlsZFNldFN1YnMuZ2V0KGNoaWxkU2V0KTtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkU2V0U3ViKSB7XG4gICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgaGF2ZSB0aGUgc3Vic2NyaXB0aW9uIGlmIHRoZSBjaGlsZFNldCBlbmRlZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgY2hpbGRTZXRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICBjaGlsZFNldFN1YnMuZGVsZXRlKGNoaWxkU2V0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcihlcnIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG1haW5TdWJDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChoYXNTdWJzY3JpYmVkVG9DaGlsZHJlbiAmJiBjaGlsZFNldFN1YnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgaXNQdWxsaW5nQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgICAgbWFpblN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIGNoaWxkU2V0U3Vicy5mb3JFYWNoKHN1YiA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjaGlsZFNldHMuY2xlYXIoKTtcbiAgICAgICAgICBjaGlsZFNldFN1YnMuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVsbENoYW5nZXMoKSB7XG4gICAgICAgICAgaWYgKGlzUHVsbGluZ0NoYW5nZXMpIHJldHVybjtcbiAgICAgICAgICBpc1B1bGxpbmdDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHRIYXNGaXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbWFpblN1Yi5wdWxsQ2hhbmdlcygpO1xuICAgICAgICAgICAgY2hpbGRTZXRTdWJzLmZvckVhY2goc3ViID0+IHtcbiAgICAgICAgICAgICAgc3ViLnB1bGxDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IHdoaWxlIChuZXh0SGFzRmlyZWQpO1xuXG4gICAgICAgICAgaXNQdWxsaW5nQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG4iXX0=