Skip to content

Instantly share code, notes, and snippets.

@gordonbrander
Created August 3, 2024 19:38
Show Gist options
  • Save gordonbrander/c0c33e82941fa47a3adb9b10ec7d5250 to your computer and use it in GitHub Desktop.
Save gordonbrander/c0c33e82941fa47a3adb9b10ec7d5250 to your computer and use it in GitHub Desktop.
multidispatch.ts
export const multidispatch = <T>() => {
const routes = new Map<
(...args: unknown[]) => boolean,
(...args: unknown[]) => T
>();
const call = (...args: unknown[]) => {
for (const [isMatch, handler] of routes.entries()) {
if (isMatch(...args)) {
return handler(...args);
}
}
throw new TypeError(`No handler for ${args}`);
};
call.register = <Args extends unknown[]>(
isMatch: (...args: unknown[]) => boolean,
handler: (...args: Args) => T,
) => {
routes.set(isMatch, handler as (...args: unknown[]) => T);
return call;
};
return call;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment