blob: cf19589ccf8eac3ab7bb8cdb07313d67a48ef9a9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import { Kind1 } from './effect'
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 ADTDescr = { _type: string; value: any }
interface ADTConstructor<A extends ADTDescr> extends Kind1<A['value']> {
return: this['input'] extends infer Inp ? A & { value: Inp } : A
}
type Pat = Record<string, ADTDescr>
export type ADT<D extends Record<string, any>> = {
[k in keyof D]: { _type: k; value: D[k] }
} extends infer Rec extends Pat
? { t: Rec[keyof Rec] } & { [k in keyof Rec]: ADTConstructor<Rec[k]> }
: never
|