use parking_lot::Mutex;
use std::sync::LazyLock;
use std::time::{Duration, Instant};
use throbber_widgets_tui::ThrobberState;
pub const MIN_THROBBER_UPDATE_GAP: Duration = Duration::from_millis(300);
struct GlobalThrobberData {
state: ThrobberState,
last_update: Instant,
}
impl Default for GlobalThrobberData {
fn default() -> Self {
Self {
state: ThrobberState::default(),
last_update: Instant::now(),
}
}
}
static GLOBAL_THROBBER: LazyLock<Mutex<GlobalThrobberData>> =
LazyLock::new(|| Mutex::new(GlobalThrobberData::default()));
pub fn get_current_state() -> ThrobberState {
GLOBAL_THROBBER.lock().state.clone()
}
pub fn tick() {
let mut data = GLOBAL_THROBBER.lock();
if data.last_update.elapsed() >= MIN_THROBBER_UPDATE_GAP {
data.state.calc_next();
data.last_update = Instant::now();
}
}