diff options
Diffstat (limited to 'src/utils.ts')
| -rw-r--r-- | src/utils.ts | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/utils.ts b/src/utils.ts index 15d5fb0..66c4c53 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,19 +3,22 @@ export const eq = (b: T): boolean => a === b -type TagValue<T, N> = T extends Tag<N, infer V> ? V : never; +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[tag.tag] || pattern._ as any)(tag.value) + <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] -export const constructors = <T extends Record<string, any>>(): { - [N in keyof T]: (value: T[N]) => Union<T> // Tag<N, T[N]> +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( {}, @@ -27,4 +30,3 @@ export const constructors = <T extends Record<string, any>>(): { ) as any export const jlog = (x: any) => console.log(JSON.stringify(x, null, 2)) - |
