diff options
Diffstat (limited to 'stdlib/util.ts')
| -rw-r--r-- | stdlib/util.ts | 22 |
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 |
