import { Token, TokenType, Items, Item } from './tokens.js'; import { Pos } from './position.js'; import { List, ArrayList } from './list.js'; export type ItemContext = string | null; export type ItemList = List; export type PatternResult = [T, ItemList] | null; export type Pattern = (i: ItemList) => PatternResult; export type PatternTypeArg

= P extends Pattern ? T : never; export declare function match(p: Pattern, items: Items, failure: F, context: ItemContext): T | F; export declare const noItems: (c: ItemContext) => ArrayList; export declare const fail: Pattern; export declare function succeed(t: T): Pattern; export declare const discard: Pattern; export declare const rest: Pattern; export declare const end: Pattern; export declare const pos: Pattern; export declare const newline: Pattern; export declare function skipSpace(i: ItemList): ItemList; export declare function collectSpace(i: ItemList, acc: Array): ItemList; export declare function withoutSpace(p: Pattern): Pattern; export declare function not(p: Pattern, v?: undefined): Pattern; export declare function follows(p: Pattern): Pattern; export declare function seq(...patterns: Pattern[]): Pattern; export declare function seqTuple[]]>(...patterns: Patterns): Pattern<{ [I in keyof Patterns]: PatternTypeArg; } & { length: Patterns['length']; }>; export declare function alt(...alts: Pattern[]): Pattern; export declare function scope(pf: (scope: T) => Pattern): Pattern; export declare function value(pf: (scope: { value: T; }) => Pattern): Pattern; export declare function bind(target: T, key: K, pattern: Pattern): Pattern; export declare function exec(thunk: (i: ItemList) => void): Pattern; export declare function map(p: Pattern, f: (t: T) => R): Pattern; export declare function mapm(p: Pattern, f: (t: T) => Pattern): Pattern; export interface ItemOptions { skipSpace?: boolean; advance?: boolean; } export interface GroupOptions extends ItemOptions { } export interface TokenOptions extends ItemOptions { tokenType?: TokenType; } export declare function group(opener: string, items: Pattern, options?: GroupOptions): Pattern; export declare function atomString(text: T, options?: TokenOptions): Pattern; export declare function atom(text?: string, options?: TokenOptions): Pattern; export declare function anything(options?: ItemOptions): Pattern; export declare function upTo(p: Pattern): Pattern; export declare function separatedBy(itemPattern: Pattern, separator: Pattern): Pattern; export declare function separatedOrTerminatedBy(itemPattern: Pattern, separator: Pattern): Pattern; export interface RepeatOptions { min?: number; max?: number; separator?: Pattern; } export declare function repeat(p: Pattern, options?: RepeatOptions): Pattern; export declare function option(p: Pattern): Pattern; export declare function replace(items: Items, outerContext: ItemContext, p: Pattern, f: (t: T, start: Pos, end: Pos) => Items, end?: Pos): Items;