-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathstring.ts
29 lines (26 loc) · 888 Bytes
/
string.ts
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
import { Type, Kind, Parser, String as _String, NaturalNumber } from "..";
export type _$string<
STATE extends Parser._$state,
TARGET extends string,
SLICED_INPUT extends string = _String._$slice<STATE["input"], STATE["index"]>,
MATCH_RESULT extends string = SLICED_INPUT extends `${TARGET}${string}`
? TARGET
: never,
NEW_INDEX extends number = NaturalNumber._$add<
STATE["index"],
_String._$length<MATCH_RESULT>
>,
NEW_STATE extends Parser._$state = MATCH_RESULT extends never
? never
: {
input: STATE["input"];
index: NEW_INDEX;
result: MATCH_RESULT;
}
> = NEW_STATE;
interface String_T<S extends string> extends Parser.Parser {
f(x: Type._$cast<this[Kind._], Parser._$state>): _$string<typeof x, S>;
}
export interface String extends Kind.Kind {
f(x: Type._$cast<this[Kind._], string>): String_T<typeof x>;
}