[object Object]

← back to Exo

refactor: Add safe state mutation method .apply()

0b6aadf57694a2e96ec77af4e32d1e66aac2d988 · 2025-07-03 12:33:29 +0100 · Arbion Halili

Files touched

Diff

commit 0b6aadf57694a2e96ec77af4e32d1e66aac2d988
Author: Arbion Halili <99731180+ToxicPine@users.noreply.github.com>
Date:   Thu Jul 3 12:33:29 2025 +0100

    refactor: Add safe state mutation method .apply()
---
 shared/types/events/common.py | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/shared/types/events/common.py b/shared/types/events/common.py
index 82fa3bc8..fd2e0842 100644
--- a/shared/types/events/common.py
+++ b/shared/types/events/common.py
@@ -108,8 +108,8 @@ class PersistedEvent(BaseModel, Generic[TEventType]):
     sequence_number: int = Field(gt=0)
 
 
-class State(BaseModel, Generic[EventTypeT]):
-    event_types: tuple[EventTypeT, ...] = get_args(EventTypeT)
+class State(BaseModel, Generic[TEventType]):
+    event_types: tuple[TEventType, ...] = get_args(TEventType)
     sequence_number: int = Field(default=0, ge=0)
 
 
@@ -128,11 +128,21 @@ EffectHandler = Callable[[StateAndEvent[EventTypeT], State[EventTypeT]], None]
 EventPublisher = Callable[[Event[EventTypeT]], None]
 
 
+class MutableState(Protocol, Generic[EventTypeT]):
+    def apply(
+        self,
+        event: Event[TEventType],
+        applicator: Applicator[EventTypeT, TEventType],
+        effect_handlers: Sequence[EffectHandler[TEventType]],
+    ) -> None: ...
+
+
 class EventOutbox(Protocol):
     def send(self, events: Sequence[Event[EventTypeT]]) -> None: ...
 
 
 class EventProcessor(Protocol):
+    # TODO: is .update() an anti-pattern?
     def update(
         self,
         state: State[EventTypeT],
@@ -140,6 +150,10 @@ class EventProcessor(Protocol):
         effect_handlers: Sequence[EffectHandler[EventTypeT]],
     ) -> State[EventTypeT]: ...
 
+    def get_events_to_apply(
+        self, state: State[TEventType]
+    ) -> Sequence[Event[TEventType]]: ...
+
 
 def get_saga_effect_handler(
     sagas: Saga[EventTypeT], event_publisher: EventPublisher[EventTypeT]

← f8039e20 feature: Add pretty_name to ModelMetadata  ·  back to Exo  ·  refactor: Remove timestamp from Wrapped Events c4569343 →