From b6213f660b6a706f48289b492f305bc2f4620f80 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 10 Aug 2023 14:18:02 +0530 Subject: feat: style injection --- src/utils/adt.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/utils/adt.ts (limited to 'src/utils/adt.ts') 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 extends Tag ? V : never + +export const match = + >(pattern: { + [key in T['tag'] | '_']?: (v: TagValue) => R + }) => + (tag: T): R => + ((pattern as any)[tag.tag] || (pattern._ as any))(tag.value) + +type Tag = { tag: N; value: V } +export type Enum = { [N in keyof T]: Tag }[keyof T] + +export const constructors = >(): { + [N in T['tag']]: TagValue extends null | never + ? (value?: null | never) => T + : (value: TagValue) => T +} => + new Proxy( + {}, + { + get(_, k) { + return (value: any) => ({ tag: k, value }) + }, + }, + ) as any + -- cgit v1.3.1