Skip to main content

libsugar/
once_get.rs

1//! Get Once
2//! ```
3//! # use libsugar::once_get::*;
4//! let mut a = None;
5//! let b = a.get_or_init(|| 1);
6//! assert_eq!(*b, 1);
7//! ```
8
9/// Get Once
10pub trait OnceGet<T> {
11    /// Get ref, init it with f if was empty
12    fn get_or_init<F: FnOnce() -> T>(&mut self, f: F) -> &T;
13    /// Get mut ref, init it with f if was empty
14    fn get_mut_or_init<F: FnOnce() -> T>(&mut self, f: F) -> &mut T;
15}
16
17impl<T> OnceGet<T> for Option<T> {
18    fn get_or_init<F: FnOnce() -> T>(&mut self, f: F) -> &T {
19        if let Some(v) = self {
20            return v;
21        }
22        *self = Some(f());
23        self.as_ref().unwrap()
24    }
25
26    fn get_mut_or_init<F: FnOnce() -> T>(&mut self, f: F) -> &mut T {
27        if let Some(v) = self {
28            return v;
29        }
30        *self = Some(f());
31        self.as_mut().unwrap()
32    }
33}
34
35#[test]
36fn test() {
37    let mut a = None;
38    let b = a.get_or_init(|| 1);
39    assert_eq!(*b, 1);
40}