use super::CloneName;
use std::cell::RefCell;
use std::rc::{Rc, Weak};
#[allow(clippy::upper_case_acronyms)]
pub type RRC<T> = Rc<RefCell<T>>;
#[allow(clippy::upper_case_acronyms)]
#[derive(Debug)]
pub struct WRC<T> {
pub(super) internal: Weak<RefCell<T>>,
}
impl<T> WRC<T> {
pub fn upgrade(&self) -> RRC<T> {
self.internal
.upgrade()
.expect("Weak reference points to nothing")
}
}
impl<T> From<&RRC<T>> for WRC<T> {
fn from(internal: &RRC<T>) -> Self {
Self {
internal: Rc::downgrade(internal),
}
}
}
impl<T> Clone for WRC<T> {
fn clone(&self) -> Self {
Self {
internal: Weak::clone(&self.internal),
}
}
}
impl<T: CloneName> CloneName for RRC<T> {
fn clone_name(&self) -> super::Id {
self.borrow().clone_name()
}
}