takeable_option/
lib.rs

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}