## Dispatcher · class

Simple route matcher and dispatcher.

Example usage:

```ts
import * as route from 'aberdeen/route';
import { Dispatcher, MATCH_REST } from 'aberdeen/dispatcher';

const dispatcher = new Dispatcher();

dispatcher.addRoute("user", Number, "stream", String, (id, stream) => {
   console.log(`User ${id}, stream ${stream}`);
});

dispatcher.dispatch(["user", "42", "stream", "music"]);
// Logs: User 42, stream music

dispatcher.addRoute("search", MATCH_REST, (terms: string[]) => {
    console.log("Search terms:", terms);
});

dispatcher.dispatch(["search", "classical", "piano"]);
// Logs: Search terms: [ 'classical', 'piano' ]
```

### dispatcher.addRoute · method

Add a route with matchers and a handler function.

**Signature:** `<T extends Matcher[], H extends (...args: ParamsFromMatchers<T>) => void>(...args: [...T, H]) => void`

**Parameters:**

- `args: [...T, H]` - An array of matchers followed by a handler function. Each matcher can be:
- A string: matches exactly that string.
- A function: takes a string segment and returns a value (of any type) if it matches, or `MATCH_FAILED` if it doesn't match. The return value (if not `MATCH_FAILED` and not `NaN`) is passed as a parameter to the handler function. The standard JavaScript functions `Number` and `String` can be used to match numeric and string segments respectively.
- The special `MATCH_REST` symbol: matches the rest of the segments as an array of strings. Only one `MATCH_REST` is allowed.

### dispatcher.dispatch · method

Dispatches the given segments to the first route handler that matches.

**Signature:** `(segments: string[]) => boolean`

**Parameters:**

- `segments: string[]` - Array of string segments to match against the added routes. When using this class with the Aberdeen `route` module, one would typically pass `route.current.p`.

**Returns:** True if a matching route was found and handled, false otherwise.
