# `Mojentic.Router`
[🔗](https://github.com/svetzal/mojentic-ex/blob/v1.2.0/lib/mojentic/router.ex#L1)

Routes events to agents based on event type.

The Router maintains a mapping from event types (modules) to lists of agents
that should receive those events. When an event is dispatched, the router
determines which agents should process it.

## Usage

    router = Router.new()
    router = Router.add_route(router, QuestionEvent, fact_checker_agent)
    router = Router.add_route(router, QuestionEvent, answer_generator_agent)

    agents = Router.get_agents(router, %QuestionEvent{...})
    #=> [fact_checker_agent, answer_generator_agent]

## Examples

    # Create a router
    router = Router.new()

    # Add routes for different event types
    router = router
    |> Router.add_route(QuestionEvent, fact_checker)
    |> Router.add_route(QuestionEvent, answer_generator)
    |> Router.add_route(FactCheckEvent, aggregator)
    |> Router.add_route(AnswerEvent, aggregator)

    # Get agents for an event
    agents = Router.get_agents(router, question_event)

# `t`

```elixir
@type t() :: %Mojentic.Router{routes: %{required(module()) =&gt; [pid() | module()]}}
```

# `add_route`

Adds a route mapping an event type to an agent.

Multiple agents can be registered for the same event type.
When an event of that type is dispatched, all registered agents
will receive it.

## Parameters

- `router` - The router to update
- `event_type` - The event module to route
- `agent` - The agent (pid or module) to receive events of this type

## Examples

    iex> router = Router.new()
    iex> router = Router.add_route(router, QuestionEvent, my_agent)
    iex> Router.get_agents(router, %QuestionEvent{})
    [my_agent]

# `get_agents`

Gets all agents registered to handle a specific event.

## Parameters

- `router` - The router to query
- `event` - The event struct to find handlers for

## Returns

A list of agents (pids or modules) that handle this event type.
Returns an empty list if no agents are registered.

## Examples

    iex> router = Router.new()
    iex> router = Router.add_route(router, QuestionEvent, agent1)
    iex> router = Router.add_route(router, QuestionEvent, agent2)
    iex> Router.get_agents(router, %QuestionEvent{})
    [agent1, agent2]

# `new`

Creates a new empty router.

## Examples

    iex> Router.new()
    %Router{routes: %{}}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
