@@ -45,7 +45,7 @@ class Store(Generic[State, Action, Event], SerializationMixin):
45
45
"""Redux store for managing state and side effects."""
46
46
47
47
def __init__ (
48
- self : Store [ State , Action , Event ] ,
48
+ self : Store ,
49
49
reducer : ReducerType [State , Action , Event ],
50
50
options : CreateStoreOptions [Action , Event ] | None = None ,
51
51
) -> None :
@@ -109,7 +109,12 @@ def _call_listeners(self: Store[State, Action, Event], state: State) -> None:
109
109
self ._create_task (result )
110
110
111
111
def _run_actions (self : Store [State , Action , Event ]) -> None :
112
- action = self ._actions .pop (0 )
112
+ while True :
113
+ if len (self ._actions ) == 0 :
114
+ return
115
+ action = self ._actions .pop (0 )
116
+ if action is not None :
117
+ break
113
118
result = self .reducer (self ._state , action )
114
119
if is_complete_reducer_result (result ):
115
120
self ._state = result .state
@@ -123,7 +128,12 @@ def _run_actions(self: Store[State, Action, Event]) -> None:
123
128
self .dispatch (cast (Event , FinishEvent ()))
124
129
125
130
def _run_event_handlers (self : Store [State , Action , Event ]) -> None :
126
- event = self ._events .pop (0 )
131
+ while True :
132
+ if len (self ._events ) == 0 :
133
+ return
134
+ event = self ._events .pop (0 )
135
+ if event is not None :
136
+ break
127
137
for event_handler in self ._event_handlers [type (event )].copy ():
128
138
self ._event_handlers_queue .put_nowait ((event_handler , event ))
129
139
@@ -139,6 +149,10 @@ def run(self: Store[State, Action, Event]) -> None:
139
149
140
150
def clean_up (self : Store [State , Action , Event ]) -> None :
141
151
"""Clean up the store."""
152
+ self ._event_handlers_queue .join ()
153
+ for _ in range (self .store_options .threads ):
154
+ self ._event_handlers_queue .put_nowait (None )
155
+ self ._event_handlers_queue .join ()
142
156
for worker in self ._workers :
143
157
worker .join ()
144
158
self ._workers .clear ()
@@ -165,13 +179,21 @@ def dispatch(
165
179
if isinstance (item , BaseAction ):
166
180
action = cast (Action , item )
167
181
for action_middleware in self ._action_middlewares :
168
- action = action_middleware (action )
169
- self ._actions .append (action )
182
+ action_ = action_middleware (action )
183
+ if action_ is None :
184
+ break
185
+ action = action_
186
+ else :
187
+ self ._actions .append (action )
170
188
if isinstance (item , BaseEvent ):
171
189
event = cast (Event , item )
172
190
for event_middleware in self ._event_middlewares :
173
- event = event_middleware (event )
174
- self ._events .append (event )
191
+ event_ = event_middleware (event )
192
+ if event_ is None :
193
+ break
194
+ event = event_
195
+ else :
196
+ self ._events .append (event )
175
197
176
198
if self .store_options .scheduler is None and not self ._is_running .locked ():
177
199
self .run ()
@@ -226,19 +248,14 @@ def wait_for_store_to_finish(self: Store[State, Action, Event]) -> None:
226
248
and self ._event_handlers_queue .qsize () == 0
227
249
):
228
250
time .sleep (self .store_options .grace_time_in_seconds )
229
- self ._event_handlers_queue .join ()
230
- for _ in range (self .store_options .threads ):
231
- self ._event_handlers_queue .put_nowait (None )
232
- self ._event_handlers_queue .join ()
233
251
self .clean_up ()
234
252
if self .store_options .on_finish :
235
253
self .store_options .on_finish ()
236
254
break
237
255
time .sleep (0.1 )
238
256
239
257
def _handle_finish_event (self : Store [State , Action , Event ]) -> None :
240
- thread = Thread (target = self .wait_for_store_to_finish )
241
- thread .start ()
258
+ Thread (target = self .wait_for_store_to_finish ).start ()
242
259
243
260
def autorun (
244
261
self : Store [State , Action , Event ],
0 commit comments