import { Parser, SubParsers, Result } from '../parser'; import { union } from './union'; import { sequence } from './sequence'; export function inits

(parsers: Parser.SubParsers

): P; export function inits(parsers: SubParsers): Parser { assert(parsers.every(f => f)); switch (parsers.length) { case 0: assert(false); return (_, output) => output.context; case 1: return parsers[0]; default: return parsers.reduceRight((acc, parser, i) => sequence([ parser, i !== 0 ? acc : union([ acc, recovery, ]), ])); } } const recovery: Parser = (_, output) => { if (output.state) { output.state = true; // @ts-expect-error output.context ??= Result.succ; } return output.context; };