Skip to main content
Module

x/ts_matches/src/parsers/some-parser.ts

Being able to pattern match in typescript
Go to Latest
File
import { Parser } from "./index.ts";import { EnsureParser, IParser, OrParser } from "./interfaces.ts";import { any } from "./simple-parsers.ts";
// prettier-ignore// deno-fmt-ignoreexport type SomeParsers<T> = T extends [] | readonly [] ? IParser<unknown, any> : T extends [infer A] | readonly [infer A] ? EnsureParser<A> : T extends [infer A, ...infer B] | readonly [infer A, ...infer B] ? OrParser<A, SomeParsers<B>> : T extends Array<infer A> | ReadonlyArray<infer A> ? A : never/** * Union is a good tool to make sure that the validated value * is in the union of all the validators passed in. Basically an `or` * operator for validators. */export function some<RestParsers extends Parser<unknown, unknown>[]>( ...parsers: RestParsers): SomeParsers<RestParsers> { if (parsers.length <= 0) { return any as any; } const first = parsers.splice(0, 1)[0]; return parsers.reduce((left, right) => left.orParser(right), first) as any;}