import type { parseNonNegativeInteger, Scanner } from "@ark/util"; import type { s, State } from "./state.ts"; export type parseBuiltinQuantifier = s["root"] extends "" ? s.error> : quantifyBuiltin ? lazyUnscanned : unscanned>; type quantifyBuiltin = quantifier extends "?" ? s.pushQuantifier : quantifier extends "+" ? s.pushQuantifier : quantifier extends "*" ? s.pushQuantifier : never; type ParsedRange = { min: number; max: number | null; unscanned: string; }; declare namespace ParsedRange { type from = r; } type skipPossibleQuestionMark = unscanned extends `?${infer next}` ? next : unscanned; type parsePossibleRangeString = unscanned extends (`${infer l extends `${number}`},${infer r extends `${number}`}}${infer next}`) ? ParsedRange.from<{ min: parseNonNegativeInteger; max: parseNonNegativeInteger; unscanned: skipPossibleQuestionMark; }> : unscanned extends `${infer l extends `${number}`},}${infer next}` ? ParsedRange.from<{ min: parseNonNegativeInteger; max: null; unscanned: skipPossibleQuestionMark; }> : unscanned extends `${infer l extends `${number}`}}${infer next}` ? ParsedRange.from<{ min: parseNonNegativeInteger; max: parseNonNegativeInteger; unscanned: skipPossibleQuestionMark; }> : null; type parseQuantifier = unscanned extends `${infer range}${parsed["unscanned"]}` ? `{${range}` : never; export type parsePossibleRange> = parsed extends ParsedRange ? s["root"] extends "" ? s.error>> : [parsed["min"], parsed["max"]] extends ([ never, unknown ] | [unknown, never]) ? s.error>> : s.pushQuantifier ? lazyUnscanned : parsed["unscanned"]> : s.shiftQuantifiable; export type quantify = tryFastPath; type tryFastPath = max extends 0 ? "" : string extends pattern ? string : `${number}` extends pattern ? `${number}` : min extends 0 ? max extends 1 ? "" | pattern : max extends number ? loopFromZero : // max is null, all we can do is append ${string} "" | `${pattern}${string}` : loopUntilMin; type loopFromZero = repetitions["length"] extends max ? acc : loopFromZero; type loopUntilMin = repetitions["length"] extends min ? max extends number ? loopUntilMax : repetitions["length"] extends 0 ? acc | `${acc}${base}${string}` : `${acc}${string}` : loopUntilMin; type loopUntilMax = repetitions["length"] extends max ? acc : loopUntilMax; export type QuantifyingChar = "*" | "+" | "?"; export declare const writeUnmatchedQuantifierError: (quantifier: quantifier) => writeUnmatchedQuantifierError; export type writeUnmatchedQuantifierError = `Quantifier ${quantifier} requires a preceding token`; export declare const writeUnnaturalNumberQuantifierError: (quantifier: quantifier) => writeUnnaturalNumberQuantifierError; export type writeUnnaturalNumberQuantifierError = `Quantifier ${quantifier} must use natural numbers`; export {};