Skip to content

Instantly share code, notes, and snippets.

@sonhanguyen
Last active September 20, 2019 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sonhanguyen/a7cde2544d279f7b550561e80528dc08 to your computer and use it in GitHub Desktop.
Save sonhanguyen/a7cde2544d279f7b550561e80528dc08 to your computer and use it in GitHub Desktop.
OverloadBuilder
type Func = (..._) => any
const overload = <Default extends Func>(defaultFunc: Default): OverloadBuilder<Default> => {
// @ts-ignore
const match = cases => Object.assign(
(...args) => {
const matcher = cases.find(([ guard ]) => guard(args))
const func = matcher
? matcher[1]
: defaultFunc
return func(...args)
},
{ case: (matcher, handler) =>
match([ ...cases, [ matcher, handler ] ])
}
)
return match([]) as any
}
type OverloadBuilder<Default extends Func> = Default & {
case<Overload extends Func>(
guard: (args: any) => args is Parameters<Overload>,
handler: Overload
): OverloadBuilder<Default & Overload>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment