summaryrefslogtreecommitdiff
path: root/src/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.ts')
-rw-r--r--src/utils.ts9
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]