-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtypes.ts
More file actions
127 lines (119 loc) · 3.55 KB
/
types.ts
File metadata and controls
127 lines (119 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
type GetYield<T, Result> = T extends {
next(...args: [unknown]): IteratorResult<infer A, Result>;
}
? A
: never;
const internal = Symbol('internal');
export class YieldedValue<T = never, S extends string = string> {
constructor(stringValue: S) {
this[internal] = stringValue;
}
get value(): T {
return this[internal];
}
get index(): number {
return 0;
}
*[Symbol.iterator](): IterableIterator<S> {
const a: Array<S> = this[internal];
yield* a;
}
}
export type PrimitiveYield<T, S extends string> =
| S
| RegExp
// | (() => Omit<Generator<unknown, T, unknown>, "next" | "return" | "throw">)
// | (() => Omit<Generator<unknown, boolean, unknown>, "next" | "return" | "throw">)
| (() => {
[Symbol.iterator](): {
next: {
(result: unknown): IteratorResult<unknown, unknown | boolean>;
// (result: unknown): IteratorResult<unknown, boolean>
};
};
})
| ReadonlyArray<PrimitiveYield<T, S>>;
type Next<T extends object | number | boolean, Result> = {
// next: {
// (s: string): IteratorResult<string, Result>;
// (matches: [string]): IteratorResult<RegExp, Result>;
// };
next: {
// <S extends string = string>(result: YieldedValue<T, S>): IteratorResult<
// PrimitiveYield<T, S> | (() => Generator<unknown, boolean, unknown>),
// Result
// >;
<S2 extends string>(result: YieldedValue<T, S2 | string>): IteratorResult<
typeof result extends YieldedValue<T, infer Z>
? S2 extends Z
? PrimitiveYield<T, string>
: PrimitiveYield<T, string>
: PrimitiveYield<T, string>,
Result
>;
// (result: YieldedValue<T, string>): IteratorResult<
// typeof result extends YieldedValue<T, infer Z>
// ? PrimitiveYield<T, Z>
// : PrimitiveYield<T, string>,
// Result
// >;
// (result: 42): IteratorResult<42, Result>;
// (result: YieldedValue<T>): IteratorResult<PrimitiveYield<T>, Result>;
// <A extends string | [string]>(result: A): A extends string
// ? IteratorResult<string, Result>
// : A extends Iterable<string>
// ? IteratorResult<RegExp, Result>
// : never;
};
};
// | {
// next(
// ...args: [boolean]
// ): IteratorResult<() => Generator<unknown, boolean>, Result>;
// }
// | {
// next(...args: [T]): IteratorResult<() => Generator<unknown, T>, Result>;
// }
// & {
// next(s: string): IteratorResult<string, Result>;
// }
// & {
// next(matches: [string]): IteratorResult<RegExp, Result>;
// }
// & {
// next(): IteratorResult<unknown, Result>;
// };
// type Next<T, Result> = GetYield<T, Result> extends RegExp ? {
// next(
// ...args: [[string] & ReadonlyArray<string>]
// ): IteratorResult<RegExp, Result>;
// } : GetYield<T, Result> extends string ? {
// next(
// ...args: [string]
// ): IteratorResult<string, Result>;
// } : never;
// type Next<T> = {
// next(
// ...args: [[string] & ReadonlyArray<string>]
// ): IteratorResult<RegExp, ParsedMediaAnds>;
// next(
// ...args: [string]
// ): IteratorResult<string, ParsedMediaAnds>;
// };
// type Next<T> = T extends RegExp ? {
// next(
// ...args: [[string] & ReadonlyArray<string>]
// ): IteratorResult<RegExp, ParsedMediaAnds>;
// }
// : T extends string ? {
// next(
// ...args: [string]
// ): IteratorResult<string, ParsedMediaAnds>;
// }
// : never;
export type ParserGenerator<
Result,
NextValue extends object | number | boolean = never
> = {
[Symbol.iterator](): Next<NextValue, Result>;
};