UNPKG

elliptical

Version:

Interactive natural-language interfaces

87 lines (68 loc) 2.29 kB
'use strict'; 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 };