"""Helpers for GUI-side runtime history management.""" from __future__ import annotations from collections import deque from python_app.models.dataset_model import ResultCollection from python_app.models.run_config_model import RunConfigModel def record_result_history( result_history: deque[ResultCollection], collection: ResultCollection, ) -> bool: """Append new result or replace existing entry by stable collection key.""" for index in range(len(result_history) - 1, -1, -1): existing = result_history[index] if ( existing.collection_id == collection.collection_id and existing.monotonic_ns == collection.monotonic_ns ): result_history[index] = collection return True result_history.append(collection) return True def build_run_history_signature( config: RunConfigModel, ) -> tuple[object, ...]: """Build deterministic signature to detect run-settings changes (excluding live processing params).""" combos_signature = tuple((int(combo.input), int(combo.output)) for combo in config.combos) return ( str(config.radar.driver_mode), str(config.radar.serial), float(config.radar.sweep.start_hz), float(config.radar.sweep.stop_hz), int(config.radar.sweep.points), float(config.radar.sweep.if_bandwidth_hz), float(config.radar.sweep.power_dbm), str(config.input_switch.driver_mode), str(config.input_switch.driver), int(config.input_switch.positions), bool(config.input_switch.invert_logic), str(config.output_switch.driver_mode), str(config.output_switch.driver), int(config.output_switch.positions), bool(config.output_switch.invert_logic), str(config.preprocess.calibration_set), str(config.preprocess.reference_set), combos_signature, )