[fabric/core] Enhance VariantMatcher to support return type parameterization in match function

This commit is contained in:
Pablo Baleztena 2024-10-15 07:59:35 -03:00
parent 38e23ba095
commit 1886c52ece

View File

@ -1,17 +1,21 @@
import { Fn } from "../types/fn.js";
import { TaggedVariant, VariantFromTag, VariantTag } from "./variant.js";
export type VariantMatcher<TVariant extends TaggedVariant<string>> = {
[K in TVariant[VariantTag]]: Fn<VariantFromTag<TVariant, K>>;
export type VariantMatcher<TVariant extends TaggedVariant<string>, T> = {
[K in TVariant[VariantTag]]: Fn<VariantFromTag<TVariant, K>, T>;
};
export function match<const TVariant extends TaggedVariant<string>>(
v: TVariant,
) {
return {
case<const TMatcher extends VariantMatcher<TVariant>>(
cases: TMatcher,
): ReturnType<TMatcher[TVariant[VariantTag]]> {
case<
const TReturnType,
const TMatcher extends VariantMatcher<
TVariant,
TReturnType
> = VariantMatcher<TVariant, TReturnType>,
>(cases: TMatcher): TReturnType {
if (!(v[VariantTag] in cases)) {
throw new Error("Non-exhaustive pattern match");
}