aboutsummaryrefslogtreecommitdiff
path: root/src/utils/adt.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/adt.ts')
-rw-r--r--src/utils/adt.ts22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/utils/adt.ts b/src/utils/adt.ts
index 45d9e50..3ae387c 100644
--- a/src/utils/adt.ts
+++ b/src/utils/adt.ts
@@ -7,6 +7,28 @@ export const match = <R, T extends Tag<string, any>>(
},
): R => ((pattern as any)[tag.tag] || (pattern._ as any))(tag.value)
+// type TagValues<
+// T extends Tag<any, string>,
+// Keys extends Array<string>,
+// Values extends Array<any> = [],
+// > = Keys extends []
+// ? Values
+// : Keys extends [
+// infer key extends string,
+// ...infer restOfKeys extends string[],
+// ]
+// ? TagValues<T, restOfKeys, [...Values, TagValue<T, key>]>
+// : never
+//
+// export const ifLet = <T extends Tag<string, any>, Keys extends Array<T['tag']>>(
+// tag: T,
+// kinds: Keys,
+// cb: (...values: TagValues<T, Keys>) => void,
+// ): void => {
+// const values = kinds.map(k => (tag.tag === k ? tag.value : undefined))
+// ;(cb as any)(...values)
+// }
+
export const matchString = <R, T extends string = string>(
key: T,
pattern: {