pub use guard::TakenGuard;
mod guard;
pub trait Ownable {
type Item;
fn take(&mut self) -> TakenGuard<Self, Self::Item>
where
Self: Sized;
fn read(&self) -> Option<&Self::Item>;
fn put_back(&mut self, val: Self::Item);
fn is_available(&self) -> bool;
}
pub enum OwnableCell<T> {
Available(T),
Taken,
}
impl<T> Ownable for OwnableCell<T> {
type Item = T;
fn take(&mut self) -> TakenGuard<Self, Self::Item> {
match std::mem::replace(self, Self::Taken) {
Self::Available(v) => TakenGuard::new(self, Some(v)),
Self::Taken => TakenGuard::new(self, None),
}
}
fn read(&self) -> Option<&Self::Item> {
let Self::Available(v) = self else {
return None;
};
Some(&v)
}
fn put_back(&mut self, val: Self::Item) {
*self = Self::Available(val);
}
fn is_available(&self) -> bool {
matches!(self, Self::Available(_))
}
}