Skip to content

Commit

Permalink
seq()の型定義 (#8)
Browse files Browse the repository at this point in the history
* fix seq()のselect引数有りの場合の型定義

* selectなし

* wip

* remove test code

* 三項演算子使うのやめたら型エラー消えた

* ごみ処理(space -> tab)

* 関数分割

* selectへ明示的に突っ込まれたundefinedは考慮しないように

* fix type
  • Loading branch information
ThinaticSystem committed Aug 6, 2022
1 parent e1e1cd1 commit 4f286e6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
5 changes: 3 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 14 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,15 @@ export function regexp(pattern: RegExp): Parser<string> {
});
}

export function seq<T extends Parser<any>[]>(parsers: T): Parser<any[]>
export function seq<T extends Parser<any>[]>(parsers: T, select: number): Parser<any>
export function seq<T extends Parser<any>[]>(parsers: T, select?: number): Parser<any[] | any> {
type SeqResultItem<T> = T extends Parser<infer R> ? R : never;
type SeqResult<T> = T extends [infer Head, ...infer Tail] ? [SeqResultItem<Head>, ...SeqResult<Tail>] : [];
export function seq<T extends Parser<any>[]>(parsers: [...T]): Parser<SeqResult<[...T]>>;
export function seq<T extends Parser<any>[], U extends number>(parsers: [...T], select: U): T[U];
export function seq(parsers: Parser<any>[], select?: number) {
return (select == null) ? seqInternal(parsers) : seqInternalWithSelect(parsers, select);
}

function seqInternal<T extends Parser<any>[]>(parsers: [...T]): Parser<SeqResult<[...T]>> {
return new Parser((input, index, state) => {
let result;
let latestIndex = index;
Expand All @@ -138,10 +144,14 @@ export function seq<T extends Parser<any>[]>(parsers: T, select?: number): Parse
latestIndex = result.index;
accum.push(result.value);
}
return success(latestIndex, (select != null ? accum[select] : accum));
return success(latestIndex, (accum as SeqResult<[...T]>));
});
}

function seqInternalWithSelect<T extends Parser<any>[], U extends number>(parsers: [...T], select: U): T[U] {
return seqInternal(parsers).map(values => values[select]);
}

export function alt<T extends Parser<unknown>[]>(parsers: T): T[number] {
return new Parser((input, index, state) => {
let result;
Expand Down

0 comments on commit 4f286e6

Please sign in to comment.