diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index 4c8df71d..f8a6e411 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -826,11 +826,13 @@ export function reify(thing) { } return pure(thing); } + // Basic functions for combining patterns export function stack(...pats) { - const reified = pats.map((pat) => reify(pat)); - const query = (state) => flatten(reified.map((pat) => pat.query(state))); + // Array test here is to avoid infinite recursions.. + pats = pats.map((pat) => (Array.isArray(pat) ? sequence(...pat) : reify(pat))); + const query = (state) => flatten(pats.map((pat) => pat.query(state))); return new Pattern(query); } @@ -839,7 +841,7 @@ export function slowcat(...pats) { // successively, one per cycle. // Array test here is to avoid infinite recursions.. - pats = pats.map(pat => Array.isArray(pat) ? sequence(...pat) : reify(pat)); + pats = pats.map((pat) => (Array.isArray(pat) ? sequence(...pat) : reify(pat))); const query = function (state) { const span = state.span; diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs index 17385c78..46308912 100644 --- a/packages/core/test/pattern.test.mjs +++ b/packages/core/test/pattern.test.mjs @@ -247,6 +247,12 @@ describe('Pattern', function () { ['a', 'b', 'c'], ); }); + it('Can stack subpatterns', function () { + sameFirst( + stack('a', ['b','c']), + stack('a', sequence('b', 'c')), + ); + }); }); describe('_fast()', function () { it('Makes things faster', function () {