1use std::{
2 cell::{Ref, RefCell, RefMut},
3 rc::Rc,
4};
5
6pub struct Owned<T> {
11 inner: Rc<RefCell<T>>,
12}
13
14impl<T> Clone for Owned<T> {
15 fn clone(&self) -> Self {
16 Self {
17 inner: Rc::clone(&self.inner),
18 }
19 }
20}
21
22impl<T> Owned<T> {
23 pub fn new(value: T) -> Self {
24 Self {
25 inner: Rc::new(RefCell::new(value)),
26 }
27 }
28
29 pub fn with<R>(&self, f: impl FnOnce(&T) -> R) -> R {
31 let borrow = self.inner.borrow();
32 f(&*borrow)
33 }
34
35 pub fn update<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
37 let mut borrow = self.inner.borrow_mut();
38 f(&mut *borrow)
39 }
40
41 pub fn borrow(&self) -> Ref<'_, T> {
43 self.inner.borrow()
44 }
45
46 pub fn borrow_mut(&self) -> RefMut<'_, T> {
48 self.inner.borrow_mut()
49 }
50
51 pub fn replace(&self, new_value: T) {
53 *self.inner.borrow_mut() = new_value;
54 }
55}