use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
#[derive(Debug, Clone, Default)]
pub struct RedrawSignal {
dirty: Arc<AtomicBool>,
}
impl RedrawSignal {
pub fn new() -> Self {
Self::default()
}
pub fn request_redraw(&self) {
self.dirty.store(true, Ordering::Release);
}
pub fn is_redraw_requested(&self) -> bool {
self.dirty.load(Ordering::Acquire)
}
pub fn take_redraw_request(&self) -> bool {
self.dirty.swap(false, Ordering::AcqRel)
}
}
#[cfg(test)]
mod tests {
use super::RedrawSignal;
#[test]
fn redraw_signal_is_clean_by_default() {
let signal = RedrawSignal::new();
assert!(!signal.is_redraw_requested());
}
#[test]
fn redraw_signal_can_be_requested_and_taken() {
let signal = RedrawSignal::new();
signal.request_redraw();
assert!(signal.is_redraw_requested());
assert!(signal.take_redraw_request());
assert!(!signal.is_redraw_requested());
assert!(!signal.take_redraw_request());
}
}