You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

33 lines
773 B
JavaScript

'use strict';
function flattenSegmentTree(stacks, segments) {
segments.forEach((segment) => {
stacks = flattenSegment(stacks, segment);
});
return stacks;
}
function flattenSegment(stacks, segment) {
if (segment.type === "identifier" || segment.type === "wildcard") {
return stacks.map((stack) => {
return stack.concat([segment]);
});
} else if (segment.type === "group") {
let newStacks = [];
segment.items.forEach((groupItem) => {
newStacks = newStacks.concat(flattenSegmentTree(stacks, groupItem));
});
return newStacks;
} else if (segment.type === "empty") {
return stacks;
} else {
throw new Error(`Unknown segment type '${segment.type}'`)
}
}
module.exports = function (queryTree) {
return flattenSegmentTree([[]], queryTree);
}