elliptical-observe-inline
Version:
Dynamic sideways Data Loading for Elliptical
131 lines (105 loc) • 4.13 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
exports.default = createProcessor;
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function createProcessor(register, processor) {
function observe(source) {
if (processor) {
source = processor(source);
}
return register(source);
}
function process(element) {
var newElement = _lodash2.default.assign({}, element, { observe: observe });
// Don't worry about builtins, or Phrases with a visit
if (_lodash2.default.isString(element.type) || !element.type.describe) {
return newElement;
}
function describeAndTrackObserve() {
var sources = [];
var values = [];
function trackedObserve(source) {
if (processor) {
source = processor(source);
}
var value = register(source);
sources.push(source);
values.push(value);
return value;
}
var description = element.type.describe(_lodash2.default.assign({}, element, { observe: trackedObserve }));
return { description: description, sources: sources, values: values };
}
var _describeAndTrackObse = describeAndTrackObserve();
var firstDescription = _describeAndTrackObse.description;
var firstSources = _describeAndTrackObse.sources;
var firstValues = _describeAndTrackObse.values;
var firstRun = true;
// If it never called observe, it never WILL call observe during
// a normal describe. It may with 'dynamic' or a child value,
// but we can't track and optimize that - so we'll just
// pass a naive observe
if (firstSources.length === 0) {
return newElement;
} else {
var _ret = function () {
var visit = function visit(option, e, traverse) {
var sources = void 0,
values = void 0,
description = void 0;
if (firstRun) {
sources = firstSources;
values = firstValues;
description = firstDescription;
firstRun = false;
} else {
;
var _describeAndTrackObse2 = describeAndTrackObserve();
sources = _describeAndTrackObse2.sources;
values = _describeAndTrackObse2.values;
description = _describeAndTrackObse2.description;
}
if (oldDescription == null && description != null || values.length !== oldValues.length || // perf opt
_lodash2.default.some(_lodash2.default.unzip([values, oldValues]), function (_ref) {
var _ref2 = (0, _slicedToArray3.default)(_ref, 2);
var a = _ref2[0];
var b = _ref2[1];
return a !== b;
}) || _lodash2.default.some(_lodash2.default.unzip([sources, oldSources]), function (_ref3) {
var _ref4 = (0, _slicedToArray3.default)(_ref3, 2);
var a = _ref4[0];
var b = _ref4[1];
return !_lodash2.default.isEqual(a, b);
})) {
oldValues = values;
oldSources = sources;
oldDescription = description;
}
return traverse(oldDescription, option);
};
var oldValues = firstValues;
var oldSources = firstSources;
var oldDescription = firstDescription;
var type = _lodash2.default.assign({}, element.type, {
visit: visit,
_oldVisit: element.type.visit,
describe: undefined
});
return {
v: _lodash2.default.assign({}, newElement, { type: type })
};
}();
if ((typeof _ret === 'undefined' ? 'undefined' : (0, _typeof3.default)(_ret)) === "object") return _ret.v;
}
}
process.observe = observe;
return process;
}