elliptical
Version:
Interactive natural-language interfaces
87 lines (68 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _unique = require('../unique');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const defaultProps = {
max: Number.MAX_SAFE_INTEGER,
min: 1,
unique: false
};
function* visit(option, _ref, traverse) {
let props = _ref.props;
let children = _ref.children;
props = _lodash2.default.defaults({}, props, defaultProps);
const child = children[0];
const modifications = {
result: [],
score: 1
};
const trueOption = _lodash2.default.assign({}, option, modifications);
yield* parseChild(0, trueOption, child, props, traverse);
}
function* parseChild(index, option, child, props, traverse) {
if (index > props.max) {
return;
}
if (index >= props.min) {
yield option;
}
if (index >= props.min && option.text == null) {
return;
}
if (index > 0 && props.separator) {
for (let sepOutput of traverse(props.separator, option)) {
const trueOutput = _lodash2.default.assign({}, sepOutput, { result: option.result });
yield* callParseChild(index, trueOutput, child, props, traverse);
}
} else {
yield* callParseChild(index, option, child, props, traverse);
}
}
function* callParseChild(index, option, child, props, traverse) {
const mods = {
qualifiers: [],
arguments: [],
categories: [],
annotations: []
};
const trueOption = _lodash2.default.assign({}, option, mods);
for (let output of traverse(child, trueOption)) {
if (props.unique && !(0, _unique.checkAgainstResultList)(option.result, output.result)) {
return;
}
const outputModifications = {
result: option.result.concat(output.result),
qualifiers: option.qualifiers.concat(output.qualifiers),
arguments: option.arguments.concat(output.arguments),
categories: option.categories.concat(output.categories),
annotations: option.annotations.concat(output.annotations)
};
const trueOutput = _lodash2.default.assign({}, output, outputModifications);
yield* parseChild(index + 1, trueOutput, child, props, traverse);
}
}
exports.default = { visit: visit };