pub struct Disposable<T> {
value: Option<T>,
}
impl<T> Disposable<T> {
pub fn new(value: T) -> Self {
Self { value: Some(value) }
}
}
impl<T> std::ops::Deref for Disposable<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.value
.as_ref()
.expect("Attempted to use value after take")
}
}
impl<T> std::ops::DerefMut for Disposable<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.value
.as_mut()
.expect("Attempted to use value after take")
}
}
impl<T> Disposable<T> {
pub fn take(&mut self) -> T {
self.value.take().expect("Attempted to take value twice")
}
pub fn try_take(&mut self) -> Option<T> {
self.value.take()
}
}