use std::sync::Mutex;
type BackCallback = Box<dyn Fn() -> bool + Send + Sync>;
struct BackHandlerEntry {
id: u64,
callback: BackCallback,
}
static BACK_STACK: Mutex<Vec<BackHandlerEntry>> = Mutex::new(Vec::new());
static NEXT_ID: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(1);
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct BackHandlerHandle(u64);
pub fn push_back_handler<F>(callback: F) -> BackHandlerHandle
where
F: Fn() -> bool + Send + Sync + 'static,
{
let id = NEXT_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
let entry = BackHandlerEntry {
id,
callback: Box::new(callback),
};
BACK_STACK.lock().unwrap().push(entry);
BackHandlerHandle(id)
}
pub fn pop_back_handler(handle: BackHandlerHandle) {
let mut stack = BACK_STACK.lock().unwrap();
stack.retain(|e| e.id != handle.0);
}
pub fn dispatch_back() -> bool {
let stack = BACK_STACK.lock().unwrap();
for entry in stack.iter().rev() {
if (entry.callback)() {
return true;
}
}
false
}