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