elliptical-extend
Version:
Linguistic Extension for Elliptical phrases
95 lines (76 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; /** @jsx createElement */
exports.default = createProcessor;
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _elliptical = require('elliptical');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var compareTypes = function compareTypes(element) {
return function (extension) {
// if the two refer to the same object
if (_lodash2.default.includes(extension.extends, element.type)) {
return true;
}
return _lodash2.default.find(extension.extends, function (extended) {
return extended.id && element.type && element.type.id && extended.id === element.type.id;
});
};
};
function createProcessor(extensions) {
return function process(element) {
// you can't extend builtins
if (_lodash2.default.isString(element)) return element;
var theseExtensions = _lodash2.default.chain(extensions).filter(compareTypes(element)).map(function (extension) {
var newProps = _lodash2.default.assign({}, element.props, { id: undefined });
return _lodash2.default.assign({}, element, { type: extension }, { props: newProps });
}).map(function (extension) {
var final = extension;
if (element.type.mapResult) {
var map = function map(option) {
var result = element.type.mapResult(option.result, extension);
return _lodash2.default.assign({}, option, { result: result });
};
final = (0, _elliptical.createElement)(
'map',
{ outbound: map, skipIncomplete: true },
final
);
}
if (element.type.filterResult) {
var filter = function filter(option) {
return element.type.filterResult(option.result, extension);
};
final = (0, _elliptical.createElement)(
'filter',
{ outbound: filter, skipIncomplete: true },
final
);
}
return final;
}).value();
if (theseExtensions.length) {
var _ret = function () {
var describe = function describe(model) {
return (0, _elliptical.createElement)(
'choice',
null,
newElement,
theseExtensions
);
};
var newPhrase = _lodash2.default.assign({}, element.type, { id: undefined }); // to prevent duplicate extension
var newProps = _lodash2.default.assign({}, element.props, { id: undefined }); // to prevent problems with choices/sequences
var newElement = _lodash2.default.assign({}, element, { type: newPhrase }, { props: newProps });
return {
v: _lodash2.default.assign({}, element, { type: { describe: describe } })
};
}();
if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
} else {
return element;
}
};
}