1- from collections .abc import AsyncGenerator , Awaitable , Callable , Iterator
1+ from collections .abc import AsyncGenerator , Awaitable , Callable
22from dataclasses import dataclass , field
33from typing import Self
44
1212class MiddlewareGroup [** P , T ]:
1313 __middlewares : list [Middleware [P , T ]] = field (default_factory = list , init = False )
1414
15- @property
16- def __stack (self ) -> Iterator [Middleware [P , T ]]:
17- return iter (self .__middlewares )
18-
1915 def add (self , * middlewares : Middleware [P , T ]) -> Self :
2016 self .__middlewares .extend (reversed (middlewares ))
2117 return self
@@ -27,7 +23,16 @@ async def invoke(
2723 * args : P .args ,
2824 ** kwargs : P .kwargs ,
2925 ) -> T :
30- return await self .__apply_stack (handler , self .__stack )(* args , ** kwargs )
26+ return await self .__apply_stack (handler )(* args , ** kwargs )
27+
28+ def __apply_stack (
29+ self ,
30+ handler : Callable [P , Awaitable [T ]],
31+ ) -> Callable [P , Awaitable [T ]]:
32+ for middleware in self .__middlewares :
33+ handler = self .__apply_middleware (handler , middleware )
34+
35+ return handler
3136
3237 @classmethod
3338 def __apply_middleware (
@@ -62,15 +67,3 @@ async def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
6267 return value
6368
6469 return wrapper
65-
66- @classmethod
67- def __apply_stack (
68- cls ,
69- handler : Callable [P , Awaitable [T ]],
70- stack : Iterator [Middleware [P , T ]],
71- ) -> Callable [P , Awaitable [T ]]:
72- for middleware in stack :
73- new_handler = cls .__apply_middleware (handler , middleware )
74- return cls .__apply_stack (new_handler , stack )
75-
76- return handler
0 commit comments