Support subpattern sequences in stack like slowcat in ref #87

This commit is contained in:
alex 2022-04-23 09:47:12 +01:00
parent 9df20fcbc5
commit a4cacc079e
2 changed files with 11 additions and 3 deletions

View file

@ -826,11 +826,13 @@ export function reify(thing) {
} }
return pure(thing); return pure(thing);
} }
// Basic functions for combining patterns // Basic functions for combining patterns
export function stack(...pats) { export function stack(...pats) {
const reified = pats.map((pat) => reify(pat)); // Array test here is to avoid infinite recursions..
const query = (state) => flatten(reified.map((pat) => pat.query(state))); 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); return new Pattern(query);
} }
@ -839,7 +841,7 @@ export function slowcat(...pats) {
// successively, one per cycle. // successively, one per cycle.
// Array test here is to avoid infinite recursions.. // 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 query = function (state) {
const span = state.span; const span = state.span;

View file

@ -247,6 +247,12 @@ describe('Pattern', function () {
['a', 'b', 'c'], ['a', 'b', 'c'],
); );
}); });
it('Can stack subpatterns', function () {
sameFirst(
stack('a', ['b','c']),
stack('a', sequence('b', 'c')),
);
});
}); });
describe('_fast()', function () { describe('_fast()', function () {
it('Makes things faster', function () { it('Makes things faster', function () {