@proem/variant
Version:
proem package for handling algebraic data types
22 lines • 1.41 kB
TypeScript
export interface Variant<Tag extends string> {
type: Tag;
}
export declare type VariantTags<V extends Variant<string>> = V extends Variant<infer Tags> ? Tags : never;
export declare function tags<Tags extends string[]>(...tags: Tags): Tags;
export declare function oneOf<V extends Variant<string>, Tags extends V['type']>(variant: V, tags: Tags[]): variant is OneOf<V, Tags>;
export declare type OneOf<V extends Variant<string>, Tag extends string> = V extends Variant<Tag> ? V : never;
export declare function map<V extends Variant<string>, A>(cases: Cases<V, A>): (variant: V) => A;
export declare function map<V extends Variant<string>, A>(cases: PartialCases<V, A>, or: (variant: V) => A): (variant: V) => A;
export declare type CaseBody<V extends Variant<string>, A> = (adt: V) => A;
export declare type Cases<V extends Variant<string>, A> = {
[P in V['type']]: CaseBody<OneOf<V, P>, A>;
};
export declare type PartialCases<V extends Variant<string>, A> = {
[P in V['type']]?: CaseBody<OneOf<V, P>, A>;
};
export declare function reducer<State, V extends Variant<string>>(caseReducers: CaseReducers<State, V>): Reducer<State, V>;
export declare type Reducer<State, V extends Variant<string>> = (state: State, variant: V) => State;
export declare type CaseReducers<State, V extends Variant<string>> = {
[P in VariantTags<V>]: Reducer<State, OneOf<V, P>>;
};
//# sourceMappingURL=index.d.ts.map