diff options
| author | Akshay Nair <phenax5@gmail.com> | 2022-01-08 19:31:29 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2022-01-08 19:32:42 +0530 |
| commit | a9f13b737ba89f79409f12f0678b07d34b974ab1 (patch) | |
| tree | da86b7a47fd3a5ad3ed47da94d2861caced4a203 /src/utils.ts | |
| parent | d19a1e4e02c6743f057d03caa9337a5b47bfa9cd (diff) | |
| download | elxr-a9f13b737ba89f79409f12f0678b07d34b974ab1.tar.gz elxr-a9f13b737ba89f79409f12f0678b07d34b974ab1.zip | |
fix: fixes pattern matching type
Diffstat (limited to '')
| -rw-r--r-- | src/utils.ts | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/utils.ts b/src/utils.ts index 8e3abb9..15d5fb0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,10 +3,13 @@ export const eq = (b: T): boolean => a === b +type TagValue<T, N> = T extends Tag<N, infer V> ? V : never; + export const match = - <R, K extends string>(pattern: { [key in K | '_']: () => R }) => - (k: K): R => - (pattern[k] || pattern._)() + <R, T extends Tag<string, any>> + (pattern: { [key in T['tag'] | '_']?: (v: TagValue<T, key>) => R }) => + (tag: T): R => + (pattern[tag.tag] || pattern._ as any)(tag.value) type Tag<N, V> = { tag: N; value: V } export type Union<T> = { [N in keyof T]: Tag<N, T[N]> }[keyof T] |
