[fabric/core] Enhance VariantMatcher to support return type parameterization in match function
This commit is contained in:
parent
38e23ba095
commit
1886c52ece
@ -1,17 +1,21 @@
|
|||||||
import { Fn } from "../types/fn.js";
|
import { Fn } from "../types/fn.js";
|
||||||
import { TaggedVariant, VariantFromTag, VariantTag } from "./variant.js";
|
import { TaggedVariant, VariantFromTag, VariantTag } from "./variant.js";
|
||||||
|
|
||||||
export type VariantMatcher<TVariant extends TaggedVariant<string>> = {
|
export type VariantMatcher<TVariant extends TaggedVariant<string>, T> = {
|
||||||
[K in TVariant[VariantTag]]: Fn<VariantFromTag<TVariant, K>>;
|
[K in TVariant[VariantTag]]: Fn<VariantFromTag<TVariant, K>, T>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function match<const TVariant extends TaggedVariant<string>>(
|
export function match<const TVariant extends TaggedVariant<string>>(
|
||||||
v: TVariant,
|
v: TVariant,
|
||||||
) {
|
) {
|
||||||
return {
|
return {
|
||||||
case<const TMatcher extends VariantMatcher<TVariant>>(
|
case<
|
||||||
cases: TMatcher,
|
const TReturnType,
|
||||||
): ReturnType<TMatcher[TVariant[VariantTag]]> {
|
const TMatcher extends VariantMatcher<
|
||||||
|
TVariant,
|
||||||
|
TReturnType
|
||||||
|
> = VariantMatcher<TVariant, TReturnType>,
|
||||||
|
>(cases: TMatcher): TReturnType {
|
||||||
if (!(v[VariantTag] in cases)) {
|
if (!(v[VariantTag] in cases)) {
|
||||||
throw new Error("Non-exhaustive pattern match");
|
throw new Error("Non-exhaustive pattern match");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user