aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stdlib/util.ts22
1 files changed, 22 insertions, 0 deletions
diff --git a/stdlib/util.ts b/stdlib/util.ts
new file mode 100644
index 0000000..832b0cb
--- /dev/null
+++ b/stdlib/util.ts
@@ -0,0 +1,22 @@
+import { Kind1 } from './io'
+
+export type Let<f extends (...args: any) => any> = ReturnType<f>
+
+export type Apply<K extends Kind1, Val> = (K & { input: Val })['return']
+
+export interface Id extends Kind1 {
+ return: this['input']
+}
+
+type ADTTT = { _type: string; value: any }
+
+interface ADTConstructor<A extends ADTTT> extends Kind1<A['value']> {
+ return: this['input'] extends infer Inp ? A & { value: Inp } : A
+}
+
+type Pat = Record<string, ADTTT>
+export type ADT<D extends Record<string, any>> = {
+ [k in keyof D]: { _type: k; value: D[k] }
+} extends infer Rec extends Pat
+ ? Rec[keyof Rec] & { [k in keyof Rec]: ADTConstructor<Rec[k]> }
+ : never