diff options
| author | Akshay Nair <phenax5@gmail.com> | 2023-08-10 14:18:02 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2023-08-10 14:18:02 +0530 |
| commit | b6213f660b6a706f48289b492f305bc2f4620f80 (patch) | |
| tree | 4fde7988ca4b3640abfa01a8b473a2e768572514 /src/utils/adt.ts | |
| parent | 5a659a47c6e4823c2e29dd03eb8988270157de43 (diff) | |
| download | css-everything-b6213f660b6a706f48289b492f305bc2f4620f80.tar.gz css-everything-b6213f660b6a706f48289b492f305bc2f4620f80.zip | |
feat: style injection
Diffstat (limited to 'src/utils/adt.ts')
| -rw-r--r-- | src/utils/adt.ts | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/utils/adt.ts b/src/utils/adt.ts new file mode 100644 index 0000000..c19398b --- /dev/null +++ b/src/utils/adt.ts @@ -0,0 +1,26 @@ +type TagValue<T, N> = T extends Tag<N, infer V> ? V : never + +export const match = + <R, T extends Tag<string, any>>(pattern: { + [key in T['tag'] | '_']?: (v: TagValue<T, key>) => R + }) => + (tag: T): R => + ((pattern as any)[tag.tag] || (pattern._ as any))(tag.value) + +type Tag<N, V> = { tag: N; value: V } +export type Enum<T> = { [N in keyof T]: Tag<N, T[N]> }[keyof T] + +export const constructors = <T extends Tag<string, any>>(): { + [N in T['tag']]: TagValue<T, N> extends null | never + ? (value?: null | never) => T + : (value: TagValue<T, N>) => T +} => + new Proxy( + {}, + { + get(_, k) { + return (value: any) => ({ tag: k, value }) + }, + }, + ) as any + |
