live-set
Version:
Class representing a changing and transformable collection of items.
156 lines (140 loc) • 16.7 kB
JavaScript
;
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=