1pub trait OnceGet<T> {
11 fn get_or_init<F: FnOnce() -> T>(&mut self, f: F) -> &T;
13 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}