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}