use std::{
fmt::Display,
sync::atomic::{AtomicBool, Ordering},
};
#[derive(Debug)]
pub struct Selectable<T> {
value: T,
selected: AtomicBool,
}
impl<T: Display> Display for Selectable<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.value.to_string())
}
}
impl<T> Selectable<T> {
pub fn new(value: T) -> Self {
Self {
value,
selected: false.into(),
}
}
pub fn new_selected(value: T) -> Self {
Self {
value,
selected: true.into(),
}
}
pub fn value(&self) -> &T {
&self.value
}
pub fn value_mut(&mut self) -> &mut T {
&mut self.value
}
pub fn is_selected(&self) -> bool {
self.selected.load(Ordering::SeqCst)
}
pub fn set_selected(&self, selected: bool) {
self.selected.store(selected, Ordering::SeqCst);
}
pub fn toggle_selected(&self) {
self.selected.fetch_xor(true, Ordering::SeqCst);
}
pub fn into_inner(self) -> T {
self.value
}
}