Skip to content

Commit affc1fc

Browse files
committed
Fix bug in seq where it didn't work with array results
1 parent 3de5a41 commit affc1fc

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/seq.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ export function seq<T1, T2, T3, T4, T5, T6, T7, T8>(
6060
* @param parsers Array of parsers to match
6161
*/
6262
export function seq(parsers: Parser<unknown>[]): Parser<unknown> {
63-
let parser = pair(parsers[0], parsers[1]);
63+
let parser: Parser<unknown[]> = pair(parsers[0], parsers[1]);
6464

6565
for (let i = 2; i < parsers.length; i++) {
66-
parser = pair(parser, parsers[i]);
66+
parser = pair(parser, parsers[i]).map(([previousSet, next]) => [
67+
...previousSet,
68+
next,
69+
]);
6770
}
6871

69-
return parser.map((result) => result.flat(parsers.length));
72+
return parser;
7073
}

tests/seq.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { boolean } from '../src/boolean';
22
import { ParseError } from '../src/error';
33
import { integer } from '../src/numbers';
4+
import { oneOrMore, text, zeroOrMore } from '../src/parser';
45
import { seq } from '../src/seq';
56
import { whitespace } from '../src/whitespace';
67
import { assertSuccessfulParse } from './util';
@@ -97,4 +98,15 @@ describe('seq', () => {
9798
assertSuccessfulParse(result);
9899
expect(result).toEqual([1, true, ' ', 2, false, ' ', 3, true]);
99100
});
101+
102+
test('allows mixing in array results', () => {
103+
const result = seq([
104+
integer,
105+
oneOrMore(text('x')),
106+
integer,
107+
zeroOrMore(text('y')),
108+
]).parseToEnd('1xxx2y');
109+
assertSuccessfulParse(result);
110+
expect(result).toEqual([1, ['x', 'x', 'x'], 2, ['y']]);
111+
});
100112
});

0 commit comments

Comments
 (0)