use std::sync::Mutex;
use std::collections::HashSet;
pub struct SuspensionState {
pub is_suspended: bool,
pub changed_entities: HashSet<String>,
pub suspension_depth: i32,
}
lazy_static::lazy_static! {
static ref SUSPENSION_STATE: Mutex<SuspensionState> = Mutex::new(SuspensionState {
is_suspended: false,
changed_entities: HashSet::new(),
suspension_depth: 0,
});
}
pub fn suspend() -> Result<(), String> {
let mut state = SUSPENSION_STATE.lock().unwrap();
state.suspension_depth += 1;
if state.suspension_depth == 1 {
state.is_suspended = true;
state.changed_entities.clear();
}
Ok(())
}
pub fn resume() -> Result<(), String> {
let mut state = SUSPENSION_STATE.lock().unwrap();
if state.suspension_depth == 0 {
return Err("Cannot resume: not suspended".to_string());
}
state.suspension_depth -= 1;
if state.suspension_depth == 0 {
state.is_suspended = false;
}
Ok(())
}
pub fn is_suspended() -> bool {
SUSPENSION_STATE.lock().unwrap().is_suspended
}
pub fn record_change(entity_name: &str) {
if is_suspended() {
SUSPENSION_STATE.lock().unwrap().changed_entities.insert(entity_name.to_string());
}
}
pub fn get_changed_entities() -> Vec<String> {
SUSPENSION_STATE.lock().unwrap()
.changed_entities
.iter()
.cloned()
.collect()
}
pub fn clear_changed_entities() {
SUSPENSION_STATE.lock().unwrap().changed_entities.clear();
}
pub fn enqueue_suspended_changes() -> Result<(), String> {
let entities = get_changed_entities();
for entity in entities {
crate::queue::enqueue_refresh(&entity, 0);
}
clear_changed_entities();
Ok(())
}
pub fn force_resume() {
let mut state = SUSPENSION_STATE.lock().unwrap();
state.suspension_depth = 0;
state.is_suspended = false;
}