# # Copyright (c) 2024, Daily # # SPDX-License-Identifier: BSD 2-Clause License # from threading import Lock _COUNTS = {} _COUNTS_MUTEX = Lock() _ID = 0 _ID_MUTEX = Lock() def obj_id() -> int: global _ID, _ID_MUTEX with _ID_MUTEX: _ID += 1 return _ID def obj_count(obj) -> int: global _COUNTS, COUNTS_MUTEX name = obj.__class__.__name__ with _COUNTS_MUTEX: if name not in _COUNTS: _COUNTS[name] = 0 else: _COUNTS[name] += 1 return _COUNTS[name] def exp_smoothing(value: float, prev_value: float, factor: float) -> float: return prev_value + factor * (value - prev_value)