live-set
Version:
Class representing a changing and transformable collection of items.
163 lines (142 loc) • 15.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = transduce;
var _ = _interopRequireDefault(require("."));
var arrayXf = {
'@@transducer/init': function transducerInit() {
return [];
},
'@@transducer/step': function transducerStep(res, input) {
res.push(input);
return res;
},
'@@transducer/result': function transducerResult(input) {
return input;
}
};
function transduce(liveSet, transducer) {
function step(xform, inputValue) {
var addsComplete = false;
var outputValues;
var ret = xform['@@transducer/step']([], inputValue);
if (ret && ret['@@transducer/reduced']) {
outputValues = ret['@@transducer/value'];
addsComplete = true;
} else {
outputValues = ret;
}
return {
outputValues: outputValues,
addsComplete: addsComplete
};
}
function valuesAndContext() {
var inputToOutputValues = new Map();
var xform = transducer(arrayXf);
var addsComplete = false;
var values = new Set(xform['@@transducer/init']());
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = liveSet.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var value = _step.value;
var _step2 = step(xform, value),
outputValues = _step2.outputValues,
_addsComplete = _step2.addsComplete;
inputToOutputValues.set(value, outputValues);
for (var i = 0, len = outputValues.length; i < len; i++) {
values.add(outputValues[i]);
}
if (_addsComplete) {
addsComplete = true;
xform['@@transducer/result']([]).forEach(function (value) {
values.add(value);
});
break;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return {
values: values,
inputToOutputValues: inputToOutputValues,
xform: xform,
addsComplete: addsComplete
};
}
return new _.default({
scheduler: liveSet.getScheduler(),
read: function read() {
return valuesAndContext().values;
},
listen: function listen(setValues, controller) {
var inputToOutputValues, xform, addsComplete;
var sub = liveSet.subscribe({
start: function start() {
var ret = valuesAndContext();
setValues(ret.values);
inputToOutputValues = ret.inputToOutputValues;
xform = ret.xform;
addsComplete = ret.addsComplete;
},
next: function next(changes) {
for (var i = 0, len = changes.length; i < len; i++) {
var change = changes[i];
if (change.type === 'add') {
if (!addsComplete) {
var value = change.value;
var _step3 = step(xform, value),
outputValues = _step3.outputValues,
_addsComplete = _step3.addsComplete;
inputToOutputValues.set(value, outputValues);
for (var _i = 0, _len = outputValues.length; _i < _len; _i++) {
controller.add(outputValues[_i]);
}
if (_addsComplete) {
addsComplete = true;
xform['@@transducer/result']([]).forEach(function (endValue) {
controller.add(endValue);
});
}
}
} else if (change.type === 'remove') {
var _value = change.value;
var list = inputToOutputValues.get(_value);
if (!list) throw new Error('value had not been added');
list.forEach(function (transformedValue) {
controller.remove(transformedValue);
});
inputToOutputValues.delete(_value);
}
}
},
error: function error(err) {
controller.error(err);
},
complete: function complete() {
controller.end();
}
});
return sub;
}
});
}
module.exports = exports.default;
module.exports.default = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy90cmFuc2R1Y2UuanMiXSwibmFtZXMiOlsiYXJyYXlYZiIsInJlcyIsImlucHV0IiwicHVzaCIsInRyYW5zZHVjZSIsImxpdmVTZXQiLCJ0cmFuc2R1Y2VyIiwic3RlcCIsInhmb3JtIiwiaW5wdXRWYWx1ZSIsImFkZHNDb21wbGV0ZSIsIm91dHB1dFZhbHVlcyIsInJldCIsInZhbHVlc0FuZENvbnRleHQiLCJpbnB1dFRvT3V0cHV0VmFsdWVzIiwiTWFwIiwidmFsdWVzIiwiU2V0IiwidmFsdWUiLCJfYWRkc0NvbXBsZXRlIiwic2V0IiwiaSIsImxlbiIsImxlbmd0aCIsImFkZCIsImZvckVhY2giLCJMaXZlU2V0Iiwic2NoZWR1bGVyIiwiZ2V0U2NoZWR1bGVyIiwicmVhZCIsImxpc3RlbiIsInNldFZhbHVlcyIsImNvbnRyb2xsZXIiLCJzdWIiLCJzdWJzY3JpYmUiLCJzdGFydCIsIm5leHQiLCJjaGFuZ2VzIiwiY2hhbmdlIiwidHlwZSIsImVuZFZhbHVlIiwibGlzdCIsImdldCIsIkVycm9yIiwidHJhbnNmb3JtZWRWYWx1ZSIsInJlbW92ZSIsImRlbGV0ZSIsImVycm9yIiwiZXJyIiwiY29tcGxldGUiLCJlbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBOztBQUVBLElBQU1BLE9BQU8sR0FBRztBQUNkLHFCQURjLDRCQUNRO0FBQ3BCLFdBQU8sRUFBUDtBQUNELEdBSGE7QUFJZCxxQkFKYywwQkFJTUMsR0FKTixFQUlXQyxLQUpYLEVBSWtCO0FBQzlCRCxJQUFBQSxHQUFHLENBQUNFLElBQUosQ0FBU0QsS0FBVDtBQUNBLFdBQU9ELEdBQVA7QUFDRCxHQVBhO0FBUWQsdUJBUmMsNEJBUVFDLEtBUlIsRUFRZTtBQUMzQixXQUFPQSxLQUFQO0FBQ0Q7QUFWYSxDQUFoQjs7QUFhZSxTQUFTRSxTQUFULENBQW1CQyxPQUFuQixFQUEwQ0MsVUFBMUMsRUFBOEU7QUFDM0YsV0FBU0MsSUFBVCxDQUFjQyxLQUFkLEVBQTZCQyxVQUE3QixFQUdF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QyxVQUFBZSxRQUFRLEVBQUk7QUFDbkRSLG9CQUFBQSxVQUFVLENBQUNSLEdBQVgsQ0FBZWdCLFFBQWY7QUFDRCxtQkFGRDtBQUdEO0FBQ0Y7QUFDRixhQWZELE1BZU8sSUFBSUYsTUFBTSxDQUFDQyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQUEsa0JBQzVCckIsTUFENEIsR0FDbkJvQixNQURtQixDQUM1QnBCLEtBRDRCO0FBRW5DLGtCQUFNdUIsSUFBSSxHQUFHM0IsbUJBQW1CLENBQUM0QixHQUFwQixDQUF3QnhCLE1BQXhCLENBQWI7QUFDQSxrQkFBSSxDQUFDdUIsSUFBTCxFQUFXLE1BQU0sSUFBSUUsS0FBSixDQUFVLDBCQUFWLENBQU47QUFDWEYsY0FBQUEsSUFBSSxDQUFDaEIsT0FBTCxDQUFhLFVBQUFtQixnQkFBZ0IsRUFBSTtBQUMvQlosZ0JBQUFBLFVBQVUsQ0FBQ2EsTUFBWCxDQUFrQkQsZ0JBQWxCO0FBQ0QsZUFGRDtBQUdBOUIsY0FBQUEsbUJBQW1CLENBQUNnQyxNQUFwQixDQUEyQjVCLE1BQTNCO0FBQ0Q7QUFDRjtBQUNGLFNBcEMyQjtBQXFDNUI2QixRQUFBQSxLQXJDNEIsaUJBcUN0QkMsR0FyQ3NCLEVBcUNqQjtBQUNUaEIsVUFBQUEsVUFBVSxDQUFDZSxLQUFYLENBQWlCQyxHQUFqQjtBQUNELFNBdkMyQjtBQXdDNUJDLFFBQUFBLFFBeEM0QixzQkF3Q2pCO0FBQ1RqQixVQUFBQSxVQUFVLENBQUNrQixHQUFYO0FBQ0Q7QUExQzJCLE9BQWxCLENBQVo7QUE2Q0EsYUFBT2pCLEdBQVA7QUFDRDtBQW5EZ0IsR0FBWixDQUFQO0FBcUREIiwic291cmNlc0NvbnRlbnQiOlsiLyogQGZsb3cgKi9cblxuaW1wb3J0IExpdmVTZXQgZnJvbSAnLic7XG5cbmNvbnN0IGFycmF5WGYgPSB7XG4gICdAQHRyYW5zZHVjZXIvaW5pdCcoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICAnQEB0cmFuc2R1Y2VyL3N0ZXAnKHJlcywgaW5wdXQpIHtcbiAgICByZXMucHVzaChpbnB1dCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcbiAgJ0BAdHJhbnNkdWNlci9yZXN1bHQnKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2R1Y2UobGl2ZVNldDogTGl2ZVNldDxhbnk+LCB0cmFuc2R1Y2VyOiBGdW5jdGlvbik6IExpdmVTZXQ8YW55PiB7XG4gIGZ1bmN0aW9uIHN0ZXAoeGZvcm06IE9iamVjdCwgaW5wdXRWYWx1ZTogYW55KToge1xuICAgIG91dHB1dFZhbHVlczogQXJyYXk8YW55PjtcbiAgICBhZGRzQ29tcGxldGU6IGJvb2xlYW47XG4gIH0ge1xuICAgIGxldCBhZGRzQ29tcGxldGUgPSBmYWxzZTtcbiAgICBsZXQgb3V0cHV0VmFsdWVzO1xuICAgIGNvbnN0IHJldCA9IHhmb3JtWydAQHRyYW5zZHVjZXIvc3RlcCddKFtdLCBpbnB1dFZhbHVlKTtcbiAgICBpZiAocmV0ICYmIHJldFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgb3V0cHV0VmFsdWVzID0gcmV0WydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGFkZHNDb21wbGV0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFZhbHVlcyA9IHJldDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dFZhbHVlcyxcbiAgICAgIGFkZHNDb21wbGV0ZVxuICAgIH07XG4gIH1cblxuICB0eXBlIFZhbHVlc0FuZENvbnRleHQgPSB7XG4gICAgdmFsdWVzOiBTZXQ8YW55PjtcbiAgICBpbnB1dFRvT3V0cHV0VmFsdWVzOiBNYXA8YW55LCBBcnJheTxhbnk+PjtcbiAgICB4Zm9ybTogT2JqZWN0O1xuICAgIGFkZHNDb21wbGV0ZTogYm9vbGVhbjtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXNBbmRDb250ZXh0KCk6IFZhbHVlc0FuZENvbnRleHQge1xuICAgIGNvbnN0IGlucHV0VG9PdXRwdXRWYWx1ZXMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgeGZvcm0gPSB0cmFuc2R1Y2VyKGFycmF5WGYpO1xuICAgIGxldCBhZGRzQ29tcGxldGUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgU2V0KHhmb3JtWydAQHRyYW5zZHVjZXIvaW5pdCddKCkpO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIGxpdmVTZXQudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHtvdXRwdXRWYWx1ZXMsIGFkZHNDb21wbGV0ZTogX2FkZHNDb21wbGV0ZX0gPSBzdGVwKHhmb3JtLCB2YWx1ZSk7XG4gICAgICBpbnB1dFRvT3V0cHV0VmFsdWVzLnNldCh2YWx1ZSwgb3V0cHV0VmFsdWVzKTtcbiAgICAgIGZvciAobGV0IGk9MCxsZW49b3V0cHV0VmFsdWVzLmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICB2YWx1ZXMuYWRkKG91dHB1dFZhbHVlc1tpXSk7XG4gICAgICB9XG4gICAgICBpZiAoX2FkZHNDb21wbGV0ZSkge1xuICAgICAgICBhZGRzQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB4Zm9ybVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKFtdKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzLFxuICAgICAgaW5wdXRUb091dHB1dFZhbHVlcyxcbiAgICAgIHhmb3JtLFxuICAgICAgYWRkc0NvbXBsZXRlXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBuZXcgTGl2ZVNldCh7XG4gICAgc2NoZWR1bGVyOiBsaXZlU2V0LmdldFNjaGVkdWxlcigpLFxuICAgIHJlYWQ6ICgpID0+IHZhbHVlc0FuZENvbnRleHQoKS52YWx1ZXMsXG4gICAgbGlzdGVuKHNldFZhbHVlcywgY29udHJvbGxlcikge1xuICAgICAgbGV0IGlucHV0VG9PdXRwdXRWYWx1ZXMsIHhmb3JtLCBhZGRzQ29tcGxldGU7XG4gICAgICBjb25zdCBzdWIgPSBsaXZlU2V0LnN1YnNjcmliZSh7XG4gICAgICAgIHN0YXJ0KCkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IHZhbHVlc0FuZENvbnRleHQoKTtcbiAgICAgICAgICBzZXRWYWx1ZXMocmV0LnZhbHVlcyk7XG4gICAgICAgICAgaW5wdXRUb091dHB1dFZhbHVlcyA9IHJldC5pbnB1dFRvT3V0cHV0VmFsdWVzO1xuICAgICAgICAgIHhmb3JtID0gcmV0Lnhmb3JtO1xuICAgICAgICAgIGFkZHNDb21wbGV0ZSA9IHJldC5hZGRzQ29tcGxldGU7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQoY2hhbmdlcykge1xuICAgICAgICAgIGZvciAobGV0IGk9MCxsZW49Y2hhbmdlcy5sZW5ndGg7IGk8bGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hhbmdlLnR5cGUgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgIGlmICghYWRkc0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3ZhbHVlfSA9IGNoYW5nZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7b3V0cHV0VmFsdWVzLCBhZGRzQ29tcGxldGU6IF9hZGRzQ29tcGxldGV9ID0gc3RlcCh4Zm9ybSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlucHV0VG9PdXRwdXRWYWx1ZXMuc2V0KHZhbHVlLCBvdXRwdXRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MCxsZW49b3V0cHV0VmFsdWVzLmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGQob3V0cHV0VmFsdWVzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9hZGRzQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgIGFkZHNDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB4Zm9ybVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKFtdKS5mb3JFYWNoKGVuZFZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hZGQoZW5kVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS50eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgICAgICAgICBjb25zdCB7dmFsdWV9ID0gY2hhbmdlO1xuICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gaW5wdXRUb091dHB1dFZhbHVlcy5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICBpZiAoIWxpc3QpIHRocm93IG5ldyBFcnJvcigndmFsdWUgaGFkIG5vdCBiZWVuIGFkZGVkJyk7XG4gICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCh0cmFuc2Zvcm1lZFZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnJlbW92ZSh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlucHV0VG9PdXRwdXRWYWx1ZXMuZGVsZXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yKGVycikge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdWI7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==