The persisted inspector's render loop (sui-2uz): a GenServer holding
one immutable message list and the point in it the panes are showing.
StatifierUI.Kino.Updater is its live sibling. The two differ in
exactly one thing - where the messages come from. The updater re-reads
a StatifierUI.Trace.Subscriber on every render because the stream is
still growing; a persisted trace is complete when the widget is built,
so this holds the list and re-renders only when the selection moves.
Both ask StatifierUI.Inspector where a move lands and what each pane
should say, so the stepping vocabulary is one definition rather than
two.
Started via Kino.start_child/1, so re-evaluating the cell terminates
it. There is nothing to detach: no session, no subscriber, no monitor.
Summary
Functions
Returns a specification to start this module under a supervisor.
Renders every pane now.
Moves the selection one scrubber step (:first, :prev, :next,
:live) and re-renders. On a persisted trace :live is the end of the
recording rather than a tip that moves.
Jumps straight to macrostep n - what the "Jump to" select does, and
what a scrubber alone cannot do on a long recording.
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec refresh(GenServer.server()) :: :ok
Renders every pane now.
@spec scrub(GenServer.server(), :live | :first | :prev | :next) :: :ok
Moves the selection one scrubber step (:first, :prev, :next,
:live) and re-renders. On a persisted trace :live is the end of the
recording rather than a tip that moves.
@spec select(GenServer.server(), non_neg_integer()) :: :ok
Jumps straight to macrostep n - what the "Jump to" select does, and
what a scrubber alone cannot do on a long recording.