Feature: Basic Events, Models and Projections #2
@ -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");
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user