# multiple-dispatch

> mms for JavaScript and Node written in TypeScript

Latest version **1.0.0** (published 2022-06-16) · MIT license · 0 weekly downloads

## Install

```sh
npm install multiple-dispatch
pnpm add multiple-dispatch
yarn add multiple-dispatch
bun add multiple-dispatch
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.0 |
| Published | 2022-06-16 |
| First published | 2016-10-23 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 39 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 4 |
| Author | Carl Winkler |
| Maintainers | seikho |
| Keywords | multimethod, multiple, dispatch, typescript |

## Links

- npm: https://www.npmjs.com/package/multiple-dispatch
- Repository: https://github.com/seikho/multiple-dispatch
- Homepage: https://github.com/seikho/multiple-dispatch#readme
- Issues: https://github.com/seikho/multiple-dispatch/issues
- npm.io page: https://npm.io/package/multiple-dispatch

## Alternatives

- [@openai/codex-sdk](https://npm.io/package/@openai/codex-sdk.md) — 731.4K weekly downloads
- [babel-plugin-transform-react-jsx](https://npm.io/package/babel-plugin-transform-react-jsx.md) — 565.0K weekly downloads
- [babel-helper-remove-or-void](https://npm.io/package/babel-helper-remove-or-void.md) — 508.5K weekly downloads
- [@pnpm/store-controller-types](https://npm.io/package/@pnpm/store-controller-types.md) — 186.9K weekly downloads
- [react-native-signature-canvas](https://npm.io/package/react-native-signature-canvas.md) — 155.6K weekly downloads

## Recent versions

- 1.0.0 (latest) — 2022-06-16
- 0.3.7 — 2018-03-27
- 0.3.6 — 2018-03-27
- 0.3.5 — 2018-03-05
- 0.3.4 — 2018-03-05
- 0.3.3 — 2018-03-05
- 0.3.1 — 2018-03-05
- 0.3.0 — 2017-07-31
- 0.2.0 — 2017-07-31
- 0.1.1 — 2016-10-24
- 0.1.0 — 2016-10-23

## README

# Multiple Dispatch

mms for JavaScript and Node written in TypeScript

## Installation

```sh
> yarn add multiple-dispatch
> npm install muiltiple-dispatch --save
```

## Usage

```ts
import mm from 'multiple-dispatch';
import homeComponent from './components/home';
import * as store from './components/store';

const router = mm({
  name: 'router dispatcher',
  params: [
    {
      name: 'category',
      // This is the default behaviour if you don't have 'isa'
      isa: (dispatchedType: string, override: string) => dispatchedType === override
    },
    {
      name: 'item',
      isa: (dispatchedType: string, override: string) => dispatchedType === override
    }
  ],
  throw?: boolean;
});

// The 'types' are passed into the override handler, but don't need to be consumed
router.override(['home', 'main'], (category, item) => homeComponent);
router.override(['store', 'main'], () => store.main);
router.override(['store', 'drills'], () => store.drills);

router.dispatch('store', 'drills'); // Returns store.drills
router.dispatch('home', 'main'); // Returns homeComponent
router.dispatch('home', 'invalid'); // Returns null or throws

function requestHandler(params: { category: string, item: string }) {
  return router.dispatch(params.category, params.item);
}

```

## API

### Create

**Default export**

```ts
import mm from 'multiple-dispatch'

function create<TDispatch, TReturn>(options: DispatchOptions): Dispatcher<TDispatch, TReturn>

interface Dispatcher<TReturn, TDispatch> {
  name: string
  override(types: TDispatch[], callback: (...types: TDispatch[]) => TReturn): boolean
  dispatch(...types: TDispatch[]): TReturn | null
}

interface DispatchOptions<TDispatch> {
  name: string
  params: Array<{ name: string; isa?: (special: TDispatch, general: TDispatch) => boolean }>

  // Set to true if the desired behaviour is to throw exceptions with invalid usage or ambiguous dispatches.
  throw?: boolean
}

interface DispatchHandler<TReturn, TDispatch> {
  types: TDispatch[]
  handler: (...types: TDispatch[]) => TReturn
}
```

#### isa function

The `isa` property in `DispatchOptions` is for determining if parameter types passed into `dispatch` has a matching
`override` `DisatchHandler`.

During the comparison, the `SPECIAL` types passed into `dispatch(...)` are compared against every set of `GENERAL`
types that exist. These are created when `override(...)` is called.

E.g.:

```ts

// 'home' and 'main' are the GENERAL type during the comparison
// ['home', 'main'] will be added to the DispatchHandler set.
// Every type 'set' that exists will be used during comparison to the find the BEST type match.

router.override(['home', 'main'], handler);

function (category: string, item: string) {

  // category and item are the SPECIAL type
  return router.dispatch(category, item);
}




```

### Dispatcher

Dispatcher instance methods.
These can throw if `throw` is set to `true` in the `DispatchOptions`.

```ts
function override<TReturn, TDispatch>(types: string[], handler: DispatchHandler<TReturn, TDispatch>): boolean

function dispatch(...types: string[]): TReturn | null
```

---
_Source: https://npm.io/package/multiple-dispatch · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
