UNPKG

live-set

Version:

Class representing a changing and transformable collection of items.

144 lines (130 loc) 15.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = flatMap; var _ = _interopRequireDefault(require(".")); function flatMap(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 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) { 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) { 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(); } } }); return { unsubscribe: function unsubscribe() { mainSub.unsubscribe(); childSetSubs.forEach(function (sub) { sub.unsubscribe(); }); childSets.clear(); childSetSubs.clear(); }, pullChanges: function pullChanges() { mainSub.pullChanges(); childSetSubs.forEach(function (sub) { sub.pullChanges(); }); } }; } }); } module.exports = exports.default; module.exports.default = exports.default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9mbGF0TWFwLmpzIl0sIm5hbWVzIjpbImZsYXRNYXAiLCJsaXZlU2V0IiwiY2IiLCJpc1JlYWRpbmciLCJMaXZlU2V0Iiwic2NoZWR1bGVyIiwiZ2V0U2NoZWR1bGVyIiwicmVhZCIsIkVycm9yIiwicyIsIlNldCIsInZhbHVlcyIsImZvckVhY2giLCJ2YWx1ZSIsImNoaWxkU2V0IiwiYWRkIiwibGlzdGVuIiwic2V0VmFsdWVzIiwiY29udHJvbGxlciIsIm1haW5TdWJDb21wbGV0ZWQiLCJoYXNTdWJzY3JpYmVkVG9DaGlsZHJlbiIsImNoaWxkU2V0U3VicyIsIk1hcCIsImNoaWxkU2V0U3Vic2NyaWJlIiwiaXNFbmRlZCIsInN1YnNjcmliZSIsInN0YXJ0Iiwic3ViIiwic2V0IiwibmV4dCIsImNoYW5nZXMiLCJjaGFuZ2UiLCJ0eXBlIiwicmVtb3ZlIiwiZXJyb3IiLCJlcnIiLCJjb21wbGV0ZSIsImRlbGV0ZSIsInNpemUiLCJlbmQiLCJjaGlsZFNldHMiLCJtYWluU3ViIiwiZ2V0IiwiY2hpbGRTZXRTdWIiLCJ1bnN1YnNjcmliZSIsImNsZWFyIiwicHVsbENoYW5nZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBOztBQUdlLFNBQVNBLE9BQVQsQ0FBc0JDLE9BQXRCLEVBQTJDQyxFQUEzQyxFQUFxRjtBQUNsRyxNQUFJQyxTQUFTLEdBQUcsS0FBaEI7QUFFQSxTQUFPLElBQUlDLFNBQUosQ0FBWTtBQUNqQkMsSUFBQUEsU0FBUyxFQUFFSixPQUFPLENBQUNLLFlBQVIsRUFETTtBQUVqQkMsSUFBQUEsSUFGaUIsa0JBRVY7QUFDTCxVQUFJSixTQUFKLEVBQWU7QUFDYixjQUFNLElBQUlLLEtBQUosQ0FBVSxpRUFBVixDQUFOO0FBQ0Q7O0FBQ0RMLE1BQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0EsVUFBTU0sQ0FBQyxHQUFHLElBQUlDLEdBQUosRUFBVjtBQUNBVCxNQUFBQSxPQUFPLENBQUNVLE1BQVIsR0FBaUJDLE9BQWpCLENBQXlCLFVB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QixTQUFwQjtBQUNEO0FBQ0Y7QUFDRixXQW5CRDtBQW9CRCxTQTlCK0I7QUErQmhDb0IsUUFBQUEsS0EvQmdDLGlCQStCMUJDLEdBL0IwQixFQStCckI7QUFDVGpCLFVBQUFBLFVBQVUsQ0FBQ2dCLEtBQVgsQ0FBaUJDLEdBQWpCO0FBQ0QsU0FqQytCO0FBa0NoQ0MsUUFBQUEsUUFsQ2dDLHNCQWtDckI7QUFDVGpCLFVBQUFBLGdCQUFnQixHQUFHLElBQW5COztBQUNBLGNBQUlDLHVCQUF1QixJQUFJQyxZQUFZLENBQUNpQixJQUFiLEtBQXNCLENBQXJELEVBQXdEO0FBQ3REcEIsWUFBQUEsVUFBVSxDQUFDcUIsR0FBWDtBQUNEO0FBQ0Y7QUF2QytCLE9BQWxCLENBQWhCO0FBMENBLGFBQU87QUFDTEssUUFBQUEsV0FESyx5QkFDUztBQUNaSCxVQUFBQSxPQUFPLENBQUNHLFdBQVI7QUFDQXZCLFVBQUFBLFlBQVksQ0FBQ1QsT0FBYixDQUFxQixVQUFBZSxHQUFHLEVBQUk7QUFDMUJBLFlBQUFBLEdBQUcsQ0FBQ2lCLFdBQUo7QUFDRCxXQUZEO0FBR0FKLFVBQUFBLFNBQVMsQ0FBQ0ssS0FBVjtBQUNBeEIsVUFBQUEsWUFBWSxDQUFDd0IsS0FBYjtBQUNELFNBUkk7QUFTTEMsUUFBQUEsV0FUSyx5QkFTUztBQUNaTCxVQUFBQSxPQUFPLENBQUNLLFdBQVI7QUFDQXpCLFVBQUFBLFlBQVksQ0FBQ1QsT0FBYixDQUFxQixVQUFBZSxHQUFHLEVBQUk7QUFDMUJBLFlBQUFBLEdBQUcsQ0FBQ21CLFdBQUo7QUFDRCxXQUZEO0FBR0Q7QUFkSSxPQUFQO0FBZ0JEO0FBdEhnQixHQUFaLENBQVA7QUF3SEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZmxvdyAqL1xuXG5pbXBvcnQgTGl2ZVNldCBmcm9tICcuJztcbmltcG9ydCB0eXBlIHtMaXZlU2V0U3Vic2NyaXB0aW9ufSBmcm9tICcuJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmxhdE1hcDxULFU+KGxpdmVTZXQ6IExpdmVTZXQ8VD4sIGNiOiAodmFsdWU6IFQpID0+IExpdmVTZXQ8VT4pOiBMaXZlU2V0PFU+IHtcbiAgbGV0IGlzUmVhZGluZyA9IGZhbHNlO1xuXG4gIHJldHVybiBuZXcgTGl2ZVNldCh7XG4gICAgc2NoZWR1bGVyOiBsaXZlU2V0LmdldFNjaGVkdWxlcigpLFxuICAgIHJlYWQoKSB7XG4gICAgICBpZiAoaXNSZWFkaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVhZGluZyBpbmFjdGl2ZSByZWN1cnNpdmVseS1mbGF0TWFwcGVkIHN0cmVhbSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICB9XG4gICAgICBpc1JlYWRpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcyA9IG5ldyBTZXQoKTtcbiAgICAgIGxpdmVTZXQudmFsdWVzKCkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkU2V0ID0gY2IodmFsdWUpO1xuICAgICAgICBjaGlsZFNldC52YWx1ZXMoKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICBzLmFkZCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpc1JlYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgbGlzdGVuKHNldFZhbHVlcywgY29udHJvbGxlcikge1xuICAgICAgbGV0IG1haW5TdWJDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNTdWJzY3JpYmVkVG9DaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgY29uc3QgY2hpbGRTZXRTdWJzOiBNYXA8TGl2ZVNldDxVPiwgTGl2ZVNldFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgICAgIGZ1bmN0aW9uIGNoaWxkU2V0U3Vic2NyaWJlKGNoaWxkU2V0OiBMaXZlU2V0PFU+KSB7XG4gICAgICAgIGlmIChjaGlsZFNldC5pc0VuZGVkKCkpIHsgLy8gb3B0aW1pemF0aW9uXG4gICAgICAgICAgY2hpbGRTZXQudmFsdWVzKCkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRTZXQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIHN0YXJ0KHN1Yikge1xuICAgICAgICAgICAgICBjaGlsZFNldFN1YnMuc2V0KGNoaWxkU2V0LCBzdWIpO1xuICAgICAgICAgICAgICBjaGlsZFNldC52YWx1ZXMoKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQoY2hhbmdlcykge1xuICAgICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnR5cGUgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZChjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLnJlbW92ZShjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IoZXJyKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgICAgY2hpbGRTZXRTdWJzLmRlbGV0ZShjaGlsZFNldCk7XG4gICAgICAgICAgICAgIGlmIChtYWluU3ViQ29tcGxldGVkICYmIGNoaWxkU2V0U3Vicy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbmQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldFZhbHVlcyhuZXcgU2V0KCkpO1xuICAgICAgY29uc3QgY2hpbGRTZXRzOiBNYXA8VCwgTGl2ZVNldDxVPj4gPSBuZXcgTWFwKCk7XG5cbiAgICAgIGNvbnN0IG1haW5TdWIgPSBsaXZlU2V0LnN1YnNjcmliZSh7XG4gICAgICAgIHN0YXJ0KCkge1xuICAgICAgICAgIGxpdmVTZXQudmFsdWVzKCkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFNldCA9IGNiKHZhbHVlKTtcbiAgICAgICAgICAgIGNoaWxkU2V0cy5zZXQodmFsdWUsIGNoaWxkU2V0KTtcbiAgICAgICAgICAgIGNoaWxkU2V0U3Vic2NyaWJlKGNoaWxkU2V0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNTdWJzY3JpYmVkVG9DaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQoY2hhbmdlcykge1xuICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgaWYgKGNoYW5nZS50eXBlID09PSAnYWRkJykge1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFNldCA9IGNiKGNoYW5nZS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNoaWxkU2V0cy5zZXQoY2hhbmdlLnZhbHVlLCBjaGlsZFNldCk7XG4gICAgICAgICAgICAgIGNoaWxkU2V0U3Vic2NyaWJlKGNoaWxkU2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkU2V0ID0gY2hpbGRTZXRzLmdldChjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICBpZiAoIWNoaWxkU2V0KSB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZWQgdmFsdWUgbm90IGluIGxpdmVzZXQnKTtcbiAgICAgICAgICAgICAgY2hpbGRTZXQudmFsdWVzKCkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5yZW1vdmUodmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY2hpbGRTZXRzLmRlbGV0ZShjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFNldFN1YiA9IGNoaWxkU2V0U3Vicy5nZXQoY2hpbGRTZXQpO1xuICAgICAgICAgICAgICBpZiAoY2hpbGRTZXRTdWIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSB3b24ndCBoYXZlIHRoZSBzdWJzY3JpcHRpb24gaWYgdGhlIGNoaWxkU2V0IGVuZGVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICBjaGlsZFNldFN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIGNoaWxkU2V0U3Vicy5kZWxldGUoY2hpbGRTZXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yKGVycikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgbWFpblN1YkNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGhhc1N1YnNjcmliZWRUb0NoaWxkcmVuICYmIGNoaWxkU2V0U3Vicy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICAgIG1haW5TdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICBjaGlsZFNldFN1YnMuZm9yRWFjaChzdWIgPT4ge1xuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2hpbGRTZXRzLmNsZWFyKCk7XG4gICAgICAgICAgY2hpbGRTZXRTdWJzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHB1bGxDaGFuZ2VzKCkge1xuICAgICAgICAgIG1haW5TdWIucHVsbENoYW5nZXMoKTtcbiAgICAgICAgICBjaGlsZFNldFN1YnMuZm9yRWFjaChzdWIgPT4ge1xuICAgICAgICAgICAgc3ViLnB1bGxDaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==