Skip to content

Commit a17fe7f

Browse files
committed
chore: Improve observers visitor reusing the initial setup loop
1 parent e209c03 commit a17fe7f

2 files changed

Lines changed: 26 additions & 18 deletions

File tree

statemachine/statemachine.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,32 @@ def _setup(self, initial_transition: Transition):
154154
default_resolver = resolver_factory(machine, model)
155155

156156
register = partial(self._callbacks_registry.register, resolver=default_resolver)
157-
self._visit_states_and_transitions(lambda x: x._setup(register))
157+
158+
observer_visitor = self._build_observers_visitor(machine, model)
159+
160+
def setup_visitor(visited):
161+
visited._setup(register)
162+
observer_visitor(visited)
163+
164+
self._visit_states_and_transitions(setup_visitor)
158165

159166
initial_transition._setup(register)
160-
self.add_observer(machine, model)
167+
168+
def _build_observers_visitor(self, *observers):
169+
registry_callbacks = [
170+
(
171+
self._callbacks_registry.build_register_function_for_resolver(
172+
resolver_factory(observer)
173+
)
174+
)
175+
for observer in observers
176+
]
177+
178+
def _add_observer_for_resolver(visited):
179+
for register in registry_callbacks:
180+
visited._add_observer(register)
181+
182+
return _add_observer_for_resolver
161183

162184
def add_observer(self, *observers):
163185
"""Add an observer.
@@ -170,18 +192,8 @@ def add_observer(self, *observers):
170192
:ref:`observers`.
171193
"""
172194

173-
resolvers = [resolver_factory(ObjectConfig.from_obj(o)) for o in observers]
174-
175-
def _add_observer_for_resolver(x):
176-
for resolver in resolvers:
177-
register = (
178-
self._callbacks_registry.build_register_function_for_resolver(
179-
resolver
180-
)
181-
)
182-
x._add_observer(register)
183-
184-
self._visit_states_and_transitions(lambda x: _add_observer_for_resolver(x))
195+
visitor = self._build_observers_visitor(*observers)
196+
self._visit_states_and_transitions(visitor)
185197
return self
186198

187199
def _repr_html_(self):

tests/test_profiling.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ def after_receive_payment(self):
4343
def exercise_order():
4444
order = Order()
4545
order.state_machine.waiting_for_payment.is_active
46-
# order.state_machine.add_to_order(10)
47-
# order.state_machine.receive_payment(10)
48-
# order.state_machine.process_order()
49-
# order.state_machine.ship_order()
5046

5147

5248
def test_setup_performance(benchmark):

0 commit comments

Comments
 (0)