|
1 | 1 | from abc import ABC, abstractmethod |
2 | | -from collections.abc import Awaitable, Callable |
| 2 | +from collections.abc import Awaitable, Callable, Iterator |
3 | 3 | from typing import Any, Protocol, Self, runtime_checkable |
4 | 4 |
|
5 | 5 | import anyio |
@@ -30,69 +30,64 @@ def add_listeners(self, *listeners: Listener[I]) -> Self: |
30 | 30 |
|
31 | 31 |
|
32 | 32 | class BaseBus[I, O](BaseDispatcher[I, O], Bus[I, O], ABC): |
33 | | - __slots__ = ("__listeners",) |
| 33 | + __slots__ = ("__listeners", "__manager") |
34 | 34 |
|
35 | 35 | __listeners: list[Listener[I]] |
| 36 | + __manager: HandlerManager[I, O] |
36 | 37 |
|
37 | | - def __init__(self) -> None: |
| 38 | + def __init__(self, manager: HandlerManager[I, O]) -> None: |
38 | 39 | super().__init__() |
39 | 40 | self.__listeners = [] |
| 41 | + self.__manager = manager |
40 | 42 |
|
41 | 43 | def add_listeners(self, *listeners: Listener[I]) -> Self: |
42 | 44 | self.__listeners.extend(listeners) |
43 | 45 | return self |
44 | 46 |
|
| 47 | + def subscribe(self, input_type: type[I], factory: HandlerFactory[[I], O]) -> Self: |
| 48 | + self.__manager.subscribe(input_type, factory) |
| 49 | + return self |
| 50 | + |
| 51 | + def _handlers_from( |
| 52 | + self, |
| 53 | + input_type: type[I], |
| 54 | + ) -> Iterator[Callable[[I], Awaitable[O]]]: |
| 55 | + return self.__manager.handlers_from(input_type) |
| 56 | + |
45 | 57 | def _trigger_listeners(self, input_value: I, /, task_group: TaskGroup) -> None: |
46 | 58 | for listener in self.__listeners: |
47 | 59 | task_group.start_soon(listener, input_value) |
48 | 60 |
|
49 | 61 |
|
50 | 62 | class SimpleBus[I, O](BaseBus[I, O]): |
51 | | - __slots__ = ("__manager",) |
52 | | - |
53 | | - __manager: HandlerManager[I, O] |
| 63 | + __slots__ = () |
54 | 64 |
|
55 | 65 | def __init__(self, manager: HandlerManager[I, O] | None = None) -> None: |
56 | | - super().__init__() |
57 | | - self.__manager = manager or SingleHandlerManager() |
| 66 | + super().__init__(manager or SingleHandlerManager()) |
58 | 67 |
|
59 | 68 | async def dispatch(self, input_value: I, /) -> O: |
60 | 69 | async with anyio.create_task_group() as task_group: |
61 | 70 | self._trigger_listeners(input_value, task_group) |
62 | 71 |
|
63 | | - for handler in self.__manager.handlers_from(type(input_value)): |
| 72 | + for handler in self._handlers_from(type(input_value)): |
64 | 73 | return await self._invoke_with_middlewares(handler, input_value) |
65 | 74 |
|
66 | 75 | return NotImplemented |
67 | 76 |
|
68 | | - def subscribe(self, input_type: type[I], factory: HandlerFactory[[I], O]) -> Self: |
69 | | - self.__manager.subscribe(input_type, factory) |
70 | | - return self |
71 | | - |
72 | 77 |
|
73 | 78 | class TaskBus[I](BaseBus[I, None]): |
74 | | - __slots__ = ("__manager",) |
75 | | - |
76 | | - __manager: HandlerManager[I, None] |
| 79 | + __slots__ = () |
77 | 80 |
|
78 | 81 | def __init__(self, manager: HandlerManager[I, None] | None = None) -> None: |
79 | | - super().__init__() |
80 | | - self.__manager = manager or MultipleHandlerManager() |
| 82 | + super().__init__(manager or MultipleHandlerManager()) |
81 | 83 |
|
82 | 84 | async def dispatch(self, input_value: I, /) -> None: |
83 | 85 | async with anyio.create_task_group() as task_group: |
84 | 86 | self._trigger_listeners(input_value, task_group) |
85 | | - for handler in self.__manager.handlers_from(type(input_value)): |
| 87 | + |
| 88 | + for handler in self._handlers_from(type(input_value)): |
86 | 89 | task_group.start_soon( |
87 | 90 | self._invoke_with_middlewares, |
88 | 91 | handler, |
89 | 92 | input_value, |
90 | 93 | ) |
91 | | - |
92 | | - def subscribe( |
93 | | - self, |
94 | | - input_type: type[I], |
95 | | - factory: HandlerFactory[[I], None], |
96 | | - ) -> Self: |
97 | | - self.__manager.subscribe(input_type, factory) |
98 | | - return self |
0 commit comments