'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); }