import matches from "../matches.ts";import { IParser, OnParse, ParserInto } from "./interfaces.ts";import { Parser } from "./parser.ts";import { any } from "./simple-parsers.ts";
export class DeferredParser<B> implements IParser<unknown, B> { private parser?: Parser<unknown, B>; static create<B>(): DeferredParser<B> { return new DeferredParser<B>(); } private constructor( readonly description = { name: "Deferred", children: [], extras: [], } as const, ) {} setParser(parser: IParser<unknown, B>) { this.parser = new Parser(parser); return this; } parse<C, D>(a: unknown, onParse: OnParse<unknown, B, C, D>): C | D { if (!this.parser) { return onParse.invalid({ value: "Not Set Up", keys: [], parser: this, }); } return this.parser.parse(a, onParse); }}
export function deferred<B = never>() { const deferred = DeferredParser.create<B>(); function setParser(parser: IParser<unknown, B>) { deferred.setParser(parser); } return [new Parser(deferred), setParser] as const;}