summaryrefslogtreecommitdiff
path: root/internal/statsengine/engine.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-13 19:41:44 +0300
committerPaul Buetow <paul@buetow.org>2026-05-13 19:41:44 +0300
commit0b454f367374e8cb97927627dacd0f1b216fe5ad (patch)
tree7e99ee96ee24ad31fe67e0fee0b4824f16425163 /internal/statsengine/engine.go
parent7b4f74ab11a2504d107372afebdfd77dec59ea42 (diff)
introduce Accumulator interface in statsengine to separate ingestion from snapshot-building
Define statsengine.Accumulator (Ingest + Reset) to represent the event-accumulation responsibility separately from runtime.SnapshotSource (Snapshot), which handles the read side. This reduces the SRP violation in Engine: callers that only push events now hold an Accumulator; callers that only read statistics hold a SnapshotSource. - Add Accumulator interface and compile-time assertion in statsengine/engine.go - Add EventIngester type alias (= statsengine.Accumulator) in runtime/runtime.go with a compile-time assertion, so callers in the runtime layer can reference the ingestion contract without importing statsengine directly - Split tuiRuntime.engine field into accumulator + snapSource so the event-loop callback holds Accumulator and wireRuntimeBindings passes SnapshotSource to SetDashboardSnapshotSource — making each consumer's dependency explicit - Simplify resetDashboardSnapshotSource in tui.go to cast for interface{ Reset() } independently of Snapshot(), removing the combined ad-hoc interface check Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/statsengine/engine.go')
-rw-r--r--internal/statsengine/engine.go16
1 files changed, 16 insertions, 0 deletions
diff --git a/internal/statsengine/engine.go b/internal/statsengine/engine.go
index f9602a9..b7d93fa 100644
--- a/internal/statsengine/engine.go
+++ b/internal/statsengine/engine.go
@@ -23,6 +23,22 @@ const (
DefaultTopN = 64
)
+// Accumulator is the event-ingestion side of the stats engine.
+// It accepts incoming event pairs (Ingest) and supports resetting all
+// accumulated state back to zero (Reset). Snapshot building is a separate
+// responsibility expressed by runtime.SnapshotSource; separating the two
+// satisfies SRP — callers that only push events hold an Accumulator, while
+// callers that only read statistics hold a SnapshotSource.
+type Accumulator interface {
+ // Ingest records one event pair into the in-memory aggregates.
+ Ingest(pair *event.Pair)
+ // Reset clears all accumulated stats and restarts series baselines.
+ Reset()
+}
+
+// compile-time assertion: *Engine must satisfy Accumulator.
+var _ Accumulator = (*Engine)(nil)
+
// Engine aggregates streaming syscall data into immutable snapshots.
type Engine struct {
mu sync.Mutex