parjs
Version:
A parser-combinator library for JavaScript.
42 lines (38 loc) • 1.31 kB
text/typescript
/**
* @module parjs/combinators
*/
/** */
import {ParsingState} from "../state";
import {ResultKind} from "../result";
import {ParjsCombinator} from "../../index";
import {defineCombinator} from "./combinator";
import {ParjserBase} from "../parser";
/**
* Applies the source parser exactly `count` times, and yields all the results in an array.
* @param count The number of times to apply the source parser.
*/
export function exactly<T>(count: number)
: ParjsCombinator<T, T[]>;
export function exactly(count: number) {
return defineCombinator(source => {
return new class Exactly extends ParjserBase {
type = "exactly";
expecting = source.expecting;
_apply(ps: ParsingState): void {
let arr = [] as any[];
for (let i = 0; i < count; i++) {
source.apply(ps);
if (!ps.isOk) {
if (ps.kind === ResultKind.SoftFail && i > 0) {
ps.kind = ResultKind.HardFail;
}
// fail because the inner parser has failed.
return;
}
arr.push(ps.value);
}
ps.value = arr;
}
}();
});
}