import CharParser from "./base/CharParser";
import RegexParser from "./base/RegexParser";
import AnyOfParser from "./combinators/AnyOfParser";
import EitherParser from "./combinators/EitherParser";
import IntoParser from "./combinators/IntoParser";
import NamedParser from "./combinators/NamedParser";
import OptionalParser from "./combinators/OptionalParser";
import SequenceParser from "./combinators/SequenceParser";
import ZeroOrMoreParser from "./combinators/ZeroOrMoreParser";
import Parser from "./Parser";
export function opt<T>(p: () => Parser<T>): Parser<T | null> {
return new OptionalParser(p);
}
export function either<L, R>(l: () => Parser<L>, r: () => Parser<R>): Parser<L | R> {
return new EitherParser(l, r);
}
export function anyOf<T>(options: Array<() => Parser<T>>): Parser<T> {
return new AnyOfParser(options);
}
export function zeroOrMore<T>(p: () => Parser<T>): Parser<T[]> {
return new ZeroOrMoreParser(p);
}
export function seq<T>(ps: Array<() => Parser<T>>): Parser<T[]> {
return new SequenceParser(ps);
}
export function regex(r: RegExp): Parser<string> {
return new RegexParser(r);
}
export function matchChar(ch: string): Parser<string> {
return new CharParser(ch);
}
export function into<F, T>(p: () => Parser<F>, t: (from: F) => T): Parser<T> {
return new IntoParser(p, t);
}
export function named<T>(name: string, p: () => Parser<T>): Parser<T> {
return new NamedParser(name, p);
}