1pub struct Disposable<T> {
2 value: Option<T>,
3}
4
5impl<T> Disposable<T> {
6 pub fn new(value: T) -> Self {
7 Self { value: Some(value) }
8 }
9}
10
11impl<T> std::ops::Deref for Disposable<T> {
12 type Target = T;
13
14 fn deref(&self) -> &Self::Target {
15 self.value
16 .as_ref()
17 .expect("Attempted to use value after take")
18 }
19}
20
21impl<T> std::ops::DerefMut for Disposable<T> {
22 fn deref_mut(&mut self) -> &mut Self::Target {
23 self.value
24 .as_mut()
25 .expect("Attempted to use value after take")
26 }
27}
28
29impl<T> Disposable<T> {
30 pub fn take(&mut self) -> T {
36 self.value.take().expect("Attempted to take value twice")
37 }
38
39 pub fn try_take(&mut self) -> Option<T> {
43 self.value.take()
44 }
45}