elliptical-observe-inline
Version:
Dynamic sideways Data Loading for Elliptical
55 lines (44 loc) • 1.3 kB
JavaScript
import _ from 'lodash';
import Observable from 'zen-observable';
export default function createStore() {
var items = [];
var observer = void 0;
var data = new Observable(function (newObserver) {
observer = newObserver;
});
function fetchAndSubscribe(element, item) {
var fetched = element.type.fetch(element);
var subscription = fetched.subscribe({
next: function next(value) {
item.value = value;
if (observer) {
observer.next({ element: element, value: value });
}
}
});
if (item.subscription) {
item.subscription.unsubscribe();
}
item.subscription = subscription;
}
function register(element) {
var existing = _.find(items, function (item) {
return _.isEqual(element, item.element);
});
if (existing) {
var currentValue = existing.value;
return currentValue;
} else {
var newItem = { element: element, dirty: false };
items.push(newItem);
fetchAndSubscribe(element, newItem);
return newItem.value;
}
}
function remove(item) {
var index = items.indexOf(item);
var removed = items.splice(index, 1);
removed[0].subscription.unsubscribe();
}
return { data: data, register: register, items: items, remove: remove };
}