fester/analysis/timeline_store.py

65 lines
1.6 KiB
Python

# analysis/timeline_store.py
class TimelineStore:
def __init__(self):
self.events = []
# -----------------------------
# APPEND EVENT (IMMUTABLE LOG)
# -----------------------------
def record(self, event):
"""
Every state transition in the system must go here.
"""
self.events.append(event)
# -----------------------------
# GET EVENTS FOR NODE
# -----------------------------
def get_node_events(self, node_name):
return [
e for e in self.events
if e.get("data", {}).get("node") == node_name
]
# -----------------------------
# GET TIMELINE SNAPSHOT
# -----------------------------
def snapshot_at(self, index):
if index < 0 or index >= len(self.events):
return None
return self.events[index]
# -----------------------------
# FIND LAST STATE BEFORE EVENT
# -----------------------------
def rewind_to_event(self, node_name, event_index):
history = []
for i in range(event_index + 1):
e = self.events[i]
if e.get("data", {}).get("node") == node_name:
history.append(e)
return history
# -----------------------------
# FIND LAST SCHEDULER DECISION
# -----------------------------
def last_scheduler_state(self, node_name, event_index):
for i in range(event_index, -1, -1):
e = self.events[i]
if e["type"] == "schedule_decision":
if e.get("data", {}).get("node") == node_name:
return e["data"]
return None