elliptical-observe-inline
Version:
Dynamic sideways Data Loading for Elliptical
67 lines (50 loc) • 1.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createStore;
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _zenObservable = require('zen-observable');
var _zenObservable2 = _interopRequireDefault(_zenObservable);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createStore() {
const items = [];
let observer;
const data = new _zenObservable2.default(newObserver => {
observer = newObserver;
});
function fetchAndSubscribe(element, item) {
const fetched = element.type.fetch(element);
const subscription = fetched.subscribe({
next(value) {
item.value = value;
if (observer) {
observer.next({ element, value });
}
}
});
if (item.subscription) {
item.subscription.unsubscribe();
}
item.subscription = subscription;
}
function register(element) {
const existing = _lodash2.default.find(items, item => _lodash2.default.isEqual(element, item.element));
if (existing) {
const currentValue = existing.value;
return currentValue;
} else {
const newItem = { element, dirty: false };
items.push(newItem);
fetchAndSubscribe(element, newItem);
return newItem.value;
}
}
function remove(item) {
const index = items.indexOf(item);
const removed = items.splice(index, 1);
removed[0].subscription.unsubscribe();
}
return { data, register, items, remove };
}