Feature: Basic Events, Models and Projections #2

Merged
piarrot merged 37 commits from feat-base-projections into main 2024-10-15 15:20:25 -03:00
Showing only changes of commit 1886c52ece - Show all commits

View File

@ -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");
} }