@consolidados/results
Version:
Result types, ease and simple
46 lines (43 loc) • 1.97 kB
text/typescript
import { R as Result, O as Option } from '../option-B_KKIecf.cjs';
type PrimitiveMembers<T> = Extract<T, PropertyKey>;
type ObjectKeys<T> = T extends object ? keyof T : never;
type ObjectPropertyType<T, K extends PropertyKey> = T extends object ? K extends keyof T ? T[K] : never : never;
type HandlerFor<T, K extends PropertyKey, R> = K extends PrimitiveMembers<T> ? () => R : K extends ObjectKeys<T> ? (value: ObjectPropertyType<T, K>) => R : never;
type MatchCases<T, R, HasDefault extends boolean = false> = (HasDefault extends true ? Partial<{
[K in PrimitiveMembers<T> | ObjectKeys<T>]: HandlerFor<T, K, R>;
}> : {
[K in PrimitiveMembers<T> | ObjectKeys<T>]: HandlerFor<T, K, R>;
}) & (HasDefault extends true ? {
default: () => R;
} : {});
declare function match<T, E, ROk, RErr>(matcher: Result<T, E>, cases: {
Ok: (value: T) => ROk;
Err: (error: E) => RErr;
}): ROk | RErr;
declare function match<T, RSome, RNone>(matcher: Option<T>, cases: {
Some: (value: T) => RSome;
None: () => RNone;
}): RSome | RNone;
declare function match<T extends PropertyKey | object, R>(matcher: T, cases: MatchCases<T, R, true>): R;
declare function match<T extends PropertyKey | object, R>(matcher: T, cases: MatchCases<T, R, false>): R;
declare function match<T extends {
[K in D]: string | number | symbol;
}, D extends keyof T, R>(matcher: T, cases: {
[K in T[D]]?: (value: Extract<T, {
[P in D]: K;
}>) => R;
} & {
default: (value: T) => R;
}, discriminant: D): R;
declare function match<T extends {
[K in D]: string | number | symbol;
}, D extends keyof T, R>(matcher: T, cases: {
[K in T[D]]: (value: Extract<T, {
[P in D]: K;
}>) => R;
}, discriminant: D): R;
declare function match<T extends PropertyKey, R>(matcher: T, cases: Partial<Record<T, () => R>> & {
default: () => R;
}): R;
declare function match<T extends PropertyKey, R>(matcher: T, cases: Record<T, () => R>): R;
export { match };