1use std::ops::{Deref, DerefMut};
2
3#[derive(Debug, Clone, Copy, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
4pub struct Takeable<T>(Option<T>);
5
6impl<T> Takeable<T> {
7 #[inline]
8 pub fn new(value: T) -> Takeable<T> {
9 Takeable(Some(value))
10 }
11
12 #[inline]
13 pub fn new_empty() -> Takeable<T> {
14 Takeable(None)
15 }
16
17 #[inline]
18 pub fn take(takeable: &mut Takeable<T>) -> T {
19 takeable.0.take().unwrap()
20 }
21
22 #[inline]
23 pub fn try_take(takeable: &mut Takeable<T>) -> Option<T> {
24 takeable.0.take()
25 }
26
27 #[inline]
28 pub fn new_take(takeable: &mut Takeable<T>) -> Takeable<T> {
29 Takeable::new(takeable.0.take().unwrap())
30 }
31
32 #[inline]
33 pub fn insert(takeable: &mut Takeable<T>, new_takeable: T) -> Option<T> {
34 let ret = takeable.0.take();
35 takeable.0 = Some(new_takeable);
36 ret
37 }
38
39 #[inline]
40 pub fn to_opt(takeable: Takeable<T>) -> Option<T> {
41 takeable.0
42 }
43}
44
45impl<T> From<Option<T>> for Takeable<T> {
46 #[inline]
47 fn from(op: Option<T>) -> Self {
48 Takeable(op)
49 }
50}
51
52impl<T> Deref for Takeable<T> {
53 type Target = T;
54 #[inline]
55 fn deref(&self) -> &Self::Target {
56 self.0.as_ref().unwrap()
57 }
58}
59
60impl<T> DerefMut for Takeable<T> {
61 #[inline]
62 fn deref_mut(&mut self) -> &mut Self::Target {
63 self.0.as_mut().unwrap()
64 }
65}