Skip to content
Permalink
master
Go to file
756 lines (691 sloc) 27.6 KB
type IncludesNever<T extends any[]> =
T extends readonly [infer F, ...infer R] ? (F extends never ? true : IncludesNever<R>) : false;
type Lazy<T> = () => T;
declare global {
namespace Fs {
export { Lazy };
export { O, R, L, S, U, G, E, P, N, M, Z };
}
}
declare namespace O {
const SOME_SYMBOL: unique symbol;
const NONE_SYMBOL: unique symbol;
export type Option<T> = Some<T> | None;
export interface Some<T> { [SOME_SYMBOL]: T; }
export interface None { [NONE_SYMBOL]: never; }
type Zip<A> = ZipRec<A, []>;
type ZipRec<A, T extends any[]> = A extends readonly [Option<infer U>, ...infer Rest]
? ZipRec<Rest, [...T, U]>
: Option<T>;
type ZipL<A> = ZipRecL<A, []>;
type ZipRecL<A, T extends any[]> = A extends readonly [Lazy<Option<infer U>>, ...infer Rest]
? ZipRecL<Rest, [...T, U]>
: Option<T>;
const some: <T>(value: T) => Some<T>;
const none: () => None;
const unwrap: <T>(option: Some<T>) => T;
const isSome: <T>(option: Option<T>) => option is Some<T>;
const isNone: (option: Option<unknown>) => option is None;
const andThen: <T, U>(option: Option<T>, fn: (value: T) => Option<U>) => Option<U>;
const orElse: <T, U>(option: Option<T>, fn: () => Option<U>) => Option<T | U>;
const match: <T, P, Q>(option: Option<T>, onSome: (value: T) => P, onNone: () => Q) => P | Q;
const expect: <T>(option: Option<T>, formatter: () => string) => T;
const withDefault: <T>(option: Option<T>, value: T) => T;
const map: <T, U>(option: Option<T>, fn: (value: T) => U) => Option<U>;
const zip: <A extends readonly Option<any>[]>(options: readonly [...A]) => Zip<A>;
const zipL: <A extends readonly Lazy<Option<any>>[]>(options: readonly [...A]) => ZipL<A>;
export { some, none, unwrap, isSome, isNone, andThen, orElse, match, expect, withDefault, map, zip, zipL };
}
declare namespace R {
const OK_SYMBOL: unique symbol;
const ERR_SYMBOL: unique symbol;
export type Result<T, E> = Ok<T> | Err<E>;
export interface Ok<T> { [OK_SYMBOL]: T; }
export interface Err<E> { [ERR_SYMBOL]: E; }
type All<A> = AllRec<A, [], never>;
type AllRec<A, T extends any[], E> = A extends readonly [Result<infer U, infer F>, ...infer Rest]
? AllRec<Rest, [...T, U], E | F>
: Result<T, E>;
type Any<A> = AnyRec<A, never, []>;
type AnyRec<A, T, E extends any[]> = A extends readonly [Result<infer U, infer F>, ...infer Rest]
? AnyRec<Rest, T | U, [...E, F]>
: Result<T, E>;
type AllL<A> = AllRecL<A, [], never>;
type AllRecL<A, T extends any[], E> = A extends readonly [Lazy<Result<infer U, infer F>>, ...infer Rest]
? AllRecL<Rest, [...T, U], E | F>
: Result<T, E>;
type AnyL<A> = AnyRecL<A, never, []>;
type AnyRecL<A, T, E extends any[]> = A extends readonly [Lazy<Result<infer U, infer F>>, ...infer Rest]
? AnyRecL<Rest, T | U, [...E, F]>
: Result<T, E>;
const ok: <T>(value: T) => Ok<T>;
const err: <E>(error: E) => Err<E>;
const unwrap: <T>(result: Ok<T>) => T;
const unwrapErr: <E>(result: Err<E>) => E;
const isOk: <T>(result: Result<T, unknown>) => result is Ok<T>;
const isErr: <E>(result: Result<unknown, E>) => result is Err<E>;
const andThen: <T, U, E, F>(result: Result<T, E>, fn: (value: T) => Result<U, F>) => Result<U, E | F>;
const orElse: <T, U, E, F>(result: Result<T, E>, fn: (error: E) => Result<U, F>) => Result<T | U, F>;
const match: <T, E, P, Q>(result: Result<T, E>, onOk: (value: T) => P, onErr: (error: E) => Q) => P | Q;
const expect: <T, E>(result: Result<T, E>, formatter: (error: E) => string) => T;
const attempt: <T>(fn: () => T) => Result<T, unknown>;
const mapBoth: <T, U, E, F>(result: Result<T, E>, mapOk: (value: T) => U, mapErr: (error: E) => F) => Result<U, F>;
const map: <T, U, E>(result: Result<T, E>, fn: (value: T) => U) => Result<U, E>;
const mapErr: <T, E, F>(result: Result<T, E>, fn: (error: E) => F) => Result<T, F>;
const all: <A extends readonly Result<any, any>[]>(results: readonly [...A]) => All<A>;
const any: <A extends readonly Result<any, any>[]>(results: readonly [...A]) => Any<A>;
const allL: <A extends readonly Lazy<Result<any, any>>[]>(results: readonly [...A]) => AllL<A>;
const anyL: <A extends readonly Lazy<Result<any, any>>[]>(results: readonly [...A]) => AnyL<A>;
export { ok, err, unwrap, unwrapErr, isOk, isErr, andThen, orElse, match, expect, attempt, mapBoth, map, mapErr, all, any, allL, anyL };
}
declare namespace L {
const NIL_SYMBOL: unique symbol;
const CONS_SYMBOL: unique symbol;
export type List<T> = Nil | Cons<T>;
export interface Nil { [NIL_SYMBOL]: never; }
export interface Cons<T> { [CONS_SYMBOL]: T; }
const nil: () => Nil;
const cons: <T>(x: T, xs: List<T>) => Cons<T>;
const singleton: <T>(x: T) => Cons<T>;
const empty: (list: List<unknown>) => list is Nil;
const head: <T>(list: Cons<T>) => T;
const tail: <T>(list: Cons<T>) => List<T>;
const match: <T, P, Q>(list: List<T>, onNil: () => P, onCons: (x: T, xs: List<T>) => Q) => P | Q;
const find: <T>(list: List<T>, fn: (x: T) => boolean) => T | undefined;
const some: <T>(list: List<T>, fn: (x: T) => boolean) => boolean;
const every: <T>(list: List<T>, fn: (x: T) => boolean) => boolean;
const reverse: <T>(list: List<T>) => List<T>;
const reduce: <T, A>(list: List<T>, fn: (acc: A, x: T) => A, value: A) => A;
const reduceRight: <T, A>(list: List<T>, fn: (acc: A, x: T) => A, value: A) => A;
const map: <T, U>(list: List<T>, fn: (x: T) => U) => List<U>;
const toArray: <T>(list: List<T>) => T[];
export { nil, cons, singleton, empty, head, tail, match, find, some, every, reverse, reduce, reduceRight, map, toArray };
}
declare namespace S {
const ellipsis: (s: string, length: number) => string;
const debug: (value: unknown, replacer?: (value: unknown) => unknown) => string;
export { ellipsis, debug };
}
declare namespace U {
type ArgsSerializer<F extends (...args: any[]) => any> = (args: Parameters<F>) => string | number;
type EqualFn<F extends (...args: any[]) => any> = (a: Parameters<F>, b: Parameters<F>) => boolean;
const simpleEqual: <T>(a: T, b: T) => boolean;
const memo: <F extends (...args: any[]) => any>(fn: F, size: number, serialize?: ArgsSerializer<F>) => F;
const memo1: <F extends (...args: any[]) => any>(fn: F, eq?: EqualFn<F>) => F;
const memoW: <F extends (obj: object) => any>(fn: F) => F;
export { simpleEqual, memo, memo1, memoW };
}
declare namespace G {
const PARSER_SYMBOL: unique symbol;
export type Source = ArrayLike<unknown>;
export type Context<S> = {
source: S;
position: number;
};
export type PartialParser<S, T, E> = { [PARSER_SYMBOL]: [S, T, E]; };
export type Parser<S, T, E> = (source: S, position?: number) => R.Result<[T, number], E>;
export type SimpleParser<S, T, E> = (source: S) => R.Result<T, E>;
export type ParseOptions = {
noCache?: boolean;
};
export type TokenError<S, C> = {
type: 'token';
context: Context<S>;
cause: C;
};
export type EoiError<S> = {
type: 'eoi';
context: Context<S>;
};
export type AndError<S, E> = {
type: 'and';
context: Context<S>;
error: E;
};
export type NotError<S, T> = {
type: 'not';
context: Context<S>;
value: T;
};
export type ValidationError<S, V> = {
type: 'validation';
context: Context<S>;
cause: V;
};
export type AcceptToken<S, T, C> = (source: S, position: number) => R.Result<[T, number], C>;
export type SeqOf<P> = SeqOfRec<P, unknown, [], never>;
type SeqOfRec<P, S, T extends any[], E> =
P extends readonly [PartialParser<infer R, infer U, infer F>, ...infer Rest]
? SeqOfRec<Rest, S & R, [...T, U], E | F>
: PartialParser<S, IncludesNever<T> extends true ? never : T, E>;
export type OneOf<P> = OneOfRec<P, unknown, never, []>;
type OneOfRec<P, S, T, E extends any[]> =
P extends readonly [PartialParser<infer R, infer U, infer F>, ...infer Rest]
? OneOfRec<Rest, S & R, T | U, [...E, F]>
: PartialParser<S, T, IncludesNever<E> extends true ? never : E>;
export type Validator<T, U, V> = (value: T) => R.Result<U, V>;
export type ErrorFormatter<E> = (error: E) => string;
const token: <S, T, C>(accept: AcceptToken<S, T, C>) => PartialParser<S, T, TokenError<S, C>>;
const eoi: <S>() => PartialParser<S, null, EoiError<S>>;
const succeed: <S, T>(value: T) => PartialParser<S, T, never>;
const fail: <S, E>(error: E) => PartialParser<S, never, E>;
const andThen: <S, T, U, E, F>(
parser: PartialParser<S, T, E>,
fn: (value: T) => PartialParser<S, U, F>,
) => PartialParser<S, U, E | F>;
const orElse: <S, T, U, E, F>(
parser: PartialParser<S, T, E>,
fn: (error: E) => PartialParser<S, U, F>,
) => PartialParser<S, T | U, F>;
const if_: <S, T, U, V, E, F, G>(
cond: PartialParser<S, T, E>,
then: (value: T) => PartialParser<S, U, F>,
else_: (error: E) => PartialParser<S, V, G>,
) => PartialParser<S, U, F> | PartialParser<S, V, G>;
const map: <S, T, U, E>(parser: PartialParser<S, T, E>, fn: (value: T) => U) => PartialParser<S, U, E>;
const mapError: <S, T, E, F>(parser: PartialParser<S, T, E>, fn: (error: E) => F) => PartialParser<S, T, F>;
const seqOf: <P extends readonly PartialParser<any, any, any>[]>(parsers: readonly [...P]) => SeqOf<P>;
const oneOf: <P extends readonly PartialParser<any, any, any>[]>(parsers: readonly [...P]) => OneOf<P>;
const optional: <S, P>(parser: PartialParser<S, P, unknown>) => PartialParser<S, O.Option<P>, never>;
const many: <S, P>(parser: PartialParser<S, P, unknown>) => PartialParser<S, P[], never>;
const many1: <S, P, E>(parser: PartialParser<S, P, E>) => PartialParser<S, P[], E>;
const and: <S, T, E, F>(
pred: PartialParser<S, unknown, F>,
parser: PartialParser<S, T, E>,
) => PartialParser<S, T, E | AndError<S, F>>;
const not: <S, T, U, E>(
pred: PartialParser<S, U, unknown>,
parser: PartialParser<S, T, E>,
) => PartialParser<S, T, E | NotError<S, U>>;
const ref: <S, T, U>(getter: () => PartialParser<S, T, U>) => PartialParser<S, T, U>;
const validate: <S, T, U, E, V>(parser: PartialParser<S, T, E>, validator: Validator<T, U, V>)
=> PartialParser<S, U, E | ValidationError<S, V>>;
const memo: <S, T, E>(parser: PartialParser<S, T, E>) => PartialParser<S, T, E>;
const make: <S extends Source, T, E>(parser: PartialParser<S, T, E>, options?: ParseOptions) => Parser<S, T, E>;
const mk: <S extends Source, T, E>(parser: PartialParser<S, T, E>, options?: ParseOptions) => SimpleParser<S, T, E>;
const parse: <S extends Source, T, E>(source: S, parser: SimpleParser<S, T, E>, errorFormatter?: ErrorFormatter<E>) => T;
const makeDefaultErrorFormatter: <C, V>(
tokenErrorFormatter: ErrorFormatter<C>,
validationErrorFormatter: ErrorFormatter<V>,
) => ErrorFormatter<unknown>;
const defaultErrorFormatter: ErrorFormatter<unknown>;
export {
token,
eoi,
succeed,
fail,
andThen,
orElse,
if_ as if,
map,
mapError,
seqOf,
oneOf,
optional,
many,
many1,
and,
not,
ref,
validate,
memo,
make,
mk,
parse,
makeDefaultErrorFormatter,
defaultErrorFormatter,
};
}
declare namespace E {
const NUMBER: unique symbol;
const BOOLEAN: unique symbol;
const ANY: unique symbol;
type TypeMap = {
[NUMBER]: number;
[BOOLEAN]: boolean;
[ANY]: unknown;
};
export type Type = keyof TypeMap;
export type Eval<T> = T extends Type ? TypeMap[T] : never;
export type Term = 'number' | 'boolean' | 'identifier';
export type UnaryOperator = '+' | '-' | '!';
export type BinaryOperator = '+' | '-' | '*' | '/' | '%' | '**' | '===' | '!==' | '<=' | '>=' | '<' | '>' | '&&' | '||';
export type OtherSymbol = '(' | ')' | '[' | ']' | ',' | '.' | '?' | ':';
export type Unknown = 'unknown';
export type PseudoToken = 'expression';
export type Whitespace = 'whitespace';
export type Symbol = UnaryOperator | BinaryOperator | OtherSymbol;
export type TokenType = Term | Symbol | Unknown;
export type ExtTokenType = TokenType | PseudoToken;
export type LexTokenType = TokenType | Whitespace;
export type Token<T> = {
type: T;
text: string;
position?: number;
};
export type AnyToken = Token<TokenType>;
export type NumberToken = Token<'number'>;
export type BooleanToken = Token<'boolean'>;
export type IdentifierToken = Token<'identifier'>;
export type UnknownToken = Token<'unknown'>;
export type NumberNode = {
type: 'number';
value: NumberToken;
};
export type BooleanNode = {
type: 'boolean';
value: BooleanToken;
};
export type IdentifierNode = {
type: 'identifier';
name: IdentifierToken;
};
export type MemberAccessNode = {
type: 'member-access';
object: AstNode;
property: IdentifierNode;
};
export type ElementAccessNode = {
type: 'element-access';
array: AstNode;
index: AstNode;
};
export type FunctionCallNode = {
type: 'function-call';
callee: AstNode;
args: AstNode[];
};
export type UnaryOperatorNode = {
type: 'unary-operator';
operator: Token<UnaryOperator>;
expr: AstNode;
};
export type BinaryOperatorNode = {
type: 'binary-operator';
operator: Token<BinaryOperator>;
lhs: AstNode;
rhs: AstNode;
};
export type ConditionalOperatorNode = {
type: 'conditional-operator';
if: AstNode;
then: AstNode;
else: AstNode;
};
export type AstNode =
| NumberNode
| BooleanNode
| IdentifierNode
| MemberAccessNode
| ElementAccessNode
| FunctionCallNode
| UnaryOperatorNode
| BinaryOperatorNode
| ConditionalOperatorNode;
export type ParseError = TokenError | EoiError;
export type TokenError = G.TokenError<string, ExtTokenType>;
export type EoiError = G.EoiError<string>;
export type RuntimeError =
| ReferenceError
| PropertyError
| RangeError
| TypeError
| SecurityError;
export type ReferenceError = {
type: 'reference';
name: string;
};
export type PropertyError = {
type: 'property';
property: string;
};
export type RangeError = {
type: 'range';
index: number;
};
export type TypeError = {
type: 'type';
expected: 'number' | 'integer' | 'boolean' | 'object' | 'function' | 'array';
actual: unknown;
};
export type SecurityError = {
type: 'security';
target: string;
};
export type CompileError = ParseError;
export type CompileResult<T> = R.Result<Evaluator<T>, CompileError>;
export type Tokenizer<T> = G.PartialParser<string, Token<T>, T>;
export type Parser = G.PartialParser<string, AstNode, TokenError>;
export type Evaluator<T> = (env: object) => R.Result<Eval<T>, RuntimeError>;
export type CompileErrorFormatter = (error: CompileError) => string;
export type RuntimeErrorFormatter = (error: RuntimeError) => string;
const Lexer: { [T in LexTokenType]: Tokenizer<T> };
const parser: Parser;
const parse: (source: string) => R.Result<AstNode, ParseError>;
const build: <T extends Type>(type: T, node: AstNode) => Evaluator<T>;
const compile: <T extends Type>(type: T, source: string) => CompileResult<T>;
const expect: <T>(result: CompileResult<T>, errorFormatter?: CompileErrorFormatter) => Evaluator<T>;
const run: <T>(evaluator: Evaluator<T>, env: object, errorFormatter?: RuntimeErrorFormatter) => Eval<T>;
const interpret: <T extends Type>(
type: T,
source: string,
env: object,
compileErrorFormatter?: CompileErrorFormatter,
runtimeErrorFormatter?: RuntimeErrorFormatter,
) => Eval<T>;
const defaultCompileErrorFormatter: CompileErrorFormatter;
const defaultRuntimeErrorFormatter: RuntimeErrorFormatter;
export {
NUMBER,
BOOLEAN,
ANY,
Lexer,
parser,
parse,
build,
compile,
expect,
run,
interpret,
defaultCompileErrorFormatter,
defaultRuntimeErrorFormatter,
};
}
declare namespace P {
export type Parser<T, E> = (s: string) => R.Result<T, E>;
export type EntryParser<K extends string, T, E> = (object: object) => R.Result<[K, T], E>;
export type FormatError<K> = {
type: 'format';
source: string;
expected: K;
};
export type JsonError = {
type: 'json';
source: string;
inner: Error;
};
export type ExpressionError = {
type: 'expression';
source: string;
cause: E.CompileError;
};
export type ValidationError<V> = {
type: 'validation';
source: string;
cause: V;
};
export type Expression<T> = (env: object) => E.Eval<T>;
export type Archetype = Parser<any, any> | readonly [Archetype] | { [key: string]: Archetype; };
export type Validator<T, U, V> = (value: T) => R.Result<U, V>;
export type ErrorFormatter<E> = (error: E) => string;
type Struct<P> = StructRec<P, {}, never>;
type StructRec<P, T, E> = P extends [EntryParser<infer K, infer U, infer F>, ...infer Rest]
? StructRec<Rest, T & Record<K, U>, E | F>
: Parser<T, E | JsonError | FormatError<"struct">>;
type Make<A> = Parser<MakeValue<A>, MakeError<A>>;
type MakeValue<A> =
A extends Parser<infer T, any> ? T :
A extends readonly [Archetype] ? MakeValue<A[0]>[] :
A extends { [key: string]: Archetype; } ? { [K in keyof A]: MakeValue<A[K]> } : never;
type MakeError<A> =
A extends Parser<any, infer E> ? E :
A extends readonly [Archetype] ? MakeError<A[0]> | JsonError | FormatError<"array"> :
A extends { [key: string]: Archetype; } ? MakeError<A[keyof A]> | JsonError | FormatError<"struct"> : never;
const succeed: <T>(value: T) => Parser<T, never>;
const fail: <E>(error: E) => Parser<never, E>;
const andThen: <T, U, E, F>(parser: Parser<T, E>, fn: (value: T) => Parser<U, F>) => Parser<U, E | F>;
const orElse: <T, U, E, F>(parser: Parser<T, E>, fn: (error: E) => Parser<U, F>) => Parser<T | U, F>;
const map: <T, U, E>(parser: Parser<T, E>, fn: (value: T) => U) => Parser<U, E>;
const mapError: <T, E, F>(parser: Parser<T, E>, fn: (error: E) => F) => Parser<T, F>;
const withDefault: <T, E>(parser: Parser<T, E>, value: T) => Parser<T, E>;
const validate: <T, U, E, V>(parser: Parser<T, E>, validator: Validator<T, U, V>) => Parser<U, E | ValidationError<V>>;
const empty: Parser<undefined, FormatError<"empty">>;
const integer: Parser<number, FormatError<"integer">>;
const number: Parser<number, FormatError<"number">>;
const string: Parser<string, never>;
const boolean: Parser<boolean, FormatError<"boolean">>;
const custom: <T, K>(fn: (s: string) => R.Result<T, K>) => Parser<T, FormatError<K>>;
const json: Parser<unknown, JsonError>;
const array: <T, E>(parser: Parser<T, E>) => Parser<T[], E | JsonError | FormatError<"array">>;
const struct: <P extends readonly EntryParser<any, any, any>[]>(parsers: readonly [...P]) => Struct<P>;
const entry: <K extends string, T, E>(key: K, parser: Parser<T, E>) => EntryParser<K, T, E>;
const expression: <T extends E.Type>(type: T, errorFormatter?: E.RuntimeErrorFormatter)
=> Parser<Expression<T>, ExpressionError>;
const make: <A extends Archetype>(archetype: A) => Make<A>;
const parse: <T, E>(s: string, parser: Parser<T, E>, errorFormatter?: ErrorFormatter<E>) => T;
const parseAll: <P extends { [key: string]: Parser<any, any>; }>(
args: { [K in keyof P]: string },
parsers: P,
errorFormatter?: ErrorFormatter<P[keyof P] extends Parser<any, infer E> ? E : never>
) => { [K in keyof P]: P[K] extends Parser<infer T, any> ? T : never };
const makeDefaultErrorFormatter: <V>(validationErrorFormatter: ErrorFormatter<V>) => ErrorFormatter<unknown>;
const defaultErrorFormatter: ErrorFormatter<unknown>;
export {
succeed,
fail,
andThen,
orElse,
map,
mapError,
withDefault,
validate,
empty,
integer,
number,
string,
boolean,
custom,
json,
array,
struct,
entry,
expression,
make,
parse,
parseAll,
makeDefaultErrorFormatter,
defaultErrorFormatter,
};
}
declare namespace N {
type Source = string;
export type PartialParser<T, E> = G.PartialParser<Source, T, E>;
export type Parser<T, E> = G.SimpleParser<Source, T, E>;
export type TokenError<C> = G.TokenError<Source, C>;
export type EoiError = G.EoiError<Source>;
export type ValidationError<V> = G.ValidationError<Source, V>;
export type SymbolError = {
type: 'symbol';
source: Source;
start: number;
symbol: string;
};
export type RegexpError = {
type: 'regexp';
source: Source;
start: number;
name: string;
regexp: RegExp;
};
export type ExpressionError = {
type: 'expression';
source: Source;
start: number;
cause: E.Parser extends PartialParser<any, infer E> ? E : never;
};
export type Expression<T> = (env: object) => E.Eval<T>;
export type Validator<T, U, V> = G.Validator<T, U, V>;
export type ErrorFormatter<E> = G.ErrorFormatter<E>;
type SeqOf<P> = G.SeqOf<P>;
type OneOf<P> = G.OneOf<P>;
type Join<P, F> = SeqOf<P> extends PartialParser<infer T, infer E> ? PartialParser<T, E | F> : never;
const succeed: <T>(value: T) => PartialParser<T, never>;
const fail: <E>(error: E) => PartialParser<never, E>;
const map: <T, U, E>(parser: PartialParser<T, E>, fn: (value: T) => U) => PartialParser<U, E>;
const mapError: <T, E, F>(parser: PartialParser<T, E>, fn: (error: E) => F) => PartialParser<T, F>;
const seqOf: <P extends readonly PartialParser<any, any>[]>(parsers: readonly [...P]) => SeqOf<P>;
const oneOf: <P extends readonly PartialParser<any, any>[]>(parsers: readonly [...P]) => OneOf<P>;
const validate: <T, U, E, V>(parser: PartialParser<T, E>, validator: Validator<T, U, V>)
=> PartialParser<U, E | ValidationError<V>>;
const symbol: <S extends string>(symbol: S) => PartialParser<S, TokenError<SymbolError>>;
const regexp: <T = string>(name: string, re: RegExp, fn?: (...captures: string[]) => T)
=> PartialParser<T, TokenError<RegexpError>>;
const expression: <T extends E.Type>(type: T, errorFormatter?: E.RuntimeErrorFormatter)
=> PartialParser<Expression<T>, TokenError<ExpressionError>>;
const spacing: PartialParser<string, never>;
const spaces: PartialParser<string, TokenError<RegexpError>>;
const natural: PartialParser<number, TokenError<RegexpError>>;
const integer: PartialParser<number, TokenError<RegexpError>>;
const number: PartialParser<number, TokenError<RegexpError>>;
const boolean: PartialParser<boolean, TokenError<RegexpError>>;
const text: PartialParser<string, TokenError<RegexpError>>;
const margin: <T, E>(parser: PartialParser<T, E>) => PartialParser<T, E>;
const group: <T, E, F, G>(parser: PartialParser<T, E>, begin: PartialParser<unknown, F>, end: PartialParser<unknown, G>)
=> PartialParser<T, E | F | G>;
const parens: <T, E>(parser: PartialParser<T, E>) => PartialParser<T, E | TokenError<SymbolError | RegexpError>>;
const braces: <T, E>(parser: PartialParser<T, E>) => PartialParser<T, E | TokenError<SymbolError | RegexpError>>;
const brackets: <T, E>(parser: PartialParser<T, E>) => PartialParser<T, E | TokenError<SymbolError | RegexpError>>;
const endWith: <T, E>(parser: PartialParser<T, E>) => PartialParser<T, E | EoiError>;
const withDefault: <T, E>(parser: PartialParser<T, E>, value: T) => PartialParser<T, E>;
const chain: <T>(item: PartialParser<T, unknown>, delimiter: PartialParser<unknown, unknown>) => PartialParser<T[], never>;
const chain1: <T, E>(item: PartialParser<T, E>, delimiter: PartialParser<unknown, unknown>) => PartialParser<T[], E>;
const join: <P extends readonly PartialParser<any, any>[], F>(items: readonly [...P], delimiter: PartialParser<unknown, F>)
=> Join<P, F>;
const list: <T>(parser: PartialParser<T, unknown>) => PartialParser<T[], never>;
const tuple: <P extends readonly PartialParser<any, any>[]>(parsers: readonly [...P]) => Join<P, TokenError<RegexpError>>;
const make: <T, E>(parser: PartialParser<T, E>) => Parser<T, E>;
const parse: <T, E>(source: Source, parser: Parser<T, E>, errorFormatter?: ErrorFormatter<E>) => T;
const defaultTokenErrorFormatter: ErrorFormatter<unknown>;
const makeDefaultErrorFormatter: <V>(validationErrorFormatter: ErrorFormatter<V>) => ErrorFormatter<unknown>;
const defaultErrorFormatter: ErrorFormatter<unknown>;
export {
succeed,
fail,
map,
mapError,
seqOf,
oneOf,
validate,
symbol,
regexp,
expression,
spacing,
spaces,
natural,
integer,
number,
boolean,
text,
margin,
group,
parens,
braces,
brackets,
endWith,
withDefault,
chain,
chain1,
join,
list,
tuple,
make,
parse,
defaultTokenErrorFormatter,
makeDefaultErrorFormatter,
defaultErrorFormatter,
};
}
declare namespace M {
export type Meta = { [key: string]: string | true; };
export type Parser<T, E> = (meta: Meta) => R.Result<O.Option<T>, E>;
export type MetaParser<T> = (meta: Meta) => T;
export type AttrParser<T, C> = (source: string) => R.Result<T, C>;
export type NotationError = {
type: 'notation';
expected: 'flag' | 'attr';
name: string;
value: string | true;
};
export type AttributeError<C> = {
type: 'attribute';
name: string;
source: string;
cause: C;
};
export type Archetype = Parser<any, any> | readonly [Archetype, ...Archetype[]] | { [key: string]: Archetype; };
export type ErrorFormatter<E> = (error: E) => string;
type OneOf<P> = OneOfRec<P, never, never>;
type OneOfRec<P, T, E> = P extends readonly [Parser<infer U, infer F>, ...infer Rest]
? OneOfRec<Rest, T | U, E | F>
: Parser<T, E>;
type Make<A> = Parser<MakeValue<A>, MakeError<A>>;
type MakeValue<A> =
A extends Parser<infer T, any> ? T :
A extends object ? { [K in keyof A]: MakeValue<A[K]> } : never;
type MakeError<A> =
A extends Parser<any, infer E> ? E :
A extends readonly [infer F, ...infer R] ? MakeError<F> | MakeError<R> :
A extends { [key: string]: Archetype; } ? MakeError<A[keyof A]> : never;
const flag: (name: string) => Parser<boolean, NotationError>;
const attr: <T, C>(name: string, parser: AttrParser<T, C>) => Parser<T, NotationError | AttributeError<C>>;
const attrN: <T, C>(name: string, parser: N.PartialParser<T, C>) => Parser<T, NotationError | AttributeError<C>>;
const succeed: <T>(value: T) => Parser<T, never>;
const miss: () => Parser<never, never>;
const fail: <E>(error: E) => Parser<never, E>;
const andThen: <T, U, E, F>(parser: Parser<T, E>, fn: (value: T) => Parser<U, F>) => Parser<U, E | F>;
const orElse: <T, U, E, F>(parser: Parser<T, E>, fn: () => Parser<U, F>) => Parser<T | U, E | F>;
const map: <T, U, E>(parser: Parser<T, E>, fn: (value: T) => U) => Parser<U, E>;
const mapError: <T, E, F>(parser: Parser<T, E>, fn: (error: E) => F) => Parser<T, F>;
const withDefault: <T, E>(parser: Parser<T, E>, value: T) => Parser<T, E>;
const oneOf: <P extends readonly Parser<any, any>[]>(parsers: readonly [...P]) => OneOf<P>;
const make: <A extends Archetype>(archetype: A) => Make<A>;
const parse: <T, E>(meta: Meta, parser: Parser<T, E>, errorFormatter?: ErrorFormatter<E>) => T;
const meta: <T, E>(parser: Parser<T, E>, errorFormatter?: ErrorFormatter<E>) => MetaParser<T>;
const makeDefaultErrorFormatter: <C>(attributeErrorFormatter: ErrorFormatter<C>) => ErrorFormatter<unknown>;
const defaultErrorFormatter: ErrorFormatter<unknown>;
export {
flag,
attr,
attrN,
succeed,
miss,
fail,
andThen,
orElse,
map,
mapError,
withDefault,
oneOf,
make,
parse,
meta,
makeDefaultErrorFormatter,
defaultErrorFormatter,
};
}
declare namespace Z {
export type Define<T, D extends Partial<T>> = (base: (this_: T) => T) => D & ThisType<T>;
export type ExtProp<T> = {
get: (owner: unknown) => T;
set: (owner: unknown, value: T) => void;
};
export type WeakExtProp<T> = ExtProp<T> & { delete: (owner: unknown) => void; };
export type FullExtProp<T> = WeakExtProp<T> & { clear: () => void; };
export type Swapper<K extends string> = <O extends { [P in K]: any }, R>(owner: O, value: O[K], block: () => R) => R;
export type Context<T> = {
enter<R>(owner: unknown, value: T, block: () => R): R;
value(owner: unknown): T;
exists(owner: unknown): boolean;
};
const pluginName: () => string | undefined;
const redef: <T, D>(target: T, define: Define<T, D>) => void;
const extProp: (<T>(defaultValue: T, nonWeak?: false) => WeakExtProp<T>)
& (<T>(defaultValue: T, nonWeak: true) => FullExtProp<T>);
const extend: <T>(target: unknown, name: string, prop: ExtProp<T>) => void;
const swapper: <K extends string>(key: K) => Swapper<K>;
const context: <T>(defaultValue: T) => Context<T>;
const defer: (cleanup: () => void) => <R>(block: () => R) => R;
const enclose: <R>(begin: () => void, end: () => void, block: () => R) => R;
export { pluginName, redef, extProp, extend, swapper, context, defer, enclose };
}
export { };