import type { ParsingState } from "../state"; import { Issues } from "../issues"; import type { Parjser } from "../parjser"; import { ParjserBase } from "../parser"; /** A parser with logic to be determined later. Useful for defining some kinds of recursive parsers. */ export interface DelayedParjser extends Parjser { init(resolved: Parjser): void; } class Late extends ParjserBase implements DelayedParjser { type = "later"; _resolved!: ParjserBase; get expecting() { return !this._resolved ? "unbound delayed parser" : this._resolved.expecting; } init(resolved: Parjser) { if (this._resolved) Issues.delayedParserAlreadyInit(); this._resolved = resolved as ParjserBase; } _apply(ps: ParsingState): void { if (!this._resolved) { Issues.delayedParserNotInit(""); } this._resolved.apply(ps); } } /** * Returns a parser that has no logic by itself and must be initialized with another parser by * calling the parser's `init` function. */ export function later(): DelayedParjser { return new Late(); }