re_init_rc/
lib.rs

1use std::{
2    rc::{Rc, Weak as RcWeak},
3    sync::{Arc, Weak as ArcWeak},
4};
5
6#[derive(Debug, Clone)]
7pub struct ReInitArc<T, F> {
8    init_fn: F,
9    weak_ptr: ArcWeak<T>,
10}
11
12impl<F, T> ReInitArc<T, F>
13where
14    F: FnMut() -> T,
15{
16    pub fn new(init_fn: F) -> Self {
17        Self {
18            init_fn,
19            weak_ptr: ArcWeak::new(),
20        }
21    }
22
23    pub fn get(&mut self) -> Arc<T> {
24        self.weak_ptr.upgrade().unwrap_or_else(|| {
25            let arc = Arc::new((self.init_fn)());
26            self.weak_ptr = Arc::downgrade(&arc);
27            arc
28        })
29    }
30}
31
32#[derive(Debug, Clone)]
33pub struct ReInitRc<T, F> {
34    init_fn: F,
35    weak_ptr: RcWeak<T>,
36}
37
38impl<F, T> ReInitRc<T, F>
39where
40    F: FnMut() -> T,
41{
42    pub fn new(init_fn: F) -> Self {
43        Self {
44            init_fn,
45            weak_ptr: RcWeak::new(),
46        }
47    }
48
49    pub fn get(&mut self) -> Rc<T> {
50        self.weak_ptr.upgrade().unwrap_or_else(|| {
51            let rc = Rc::new((self.init_fn)());
52            self.weak_ptr = Rc::downgrade(&rc);
53            rc
54        })
55    }
56}