use core::borrow::Borrow;
use core::ops::Deref;
use crate::weak::AnyWeakPointer;
pub trait AnySharedPointer<T: ?Sized>: AsRef<T> + Borrow<T> + Clone + Deref<Target = T> + Sized {
type Weak: AnyWeakPointer<T>;
fn downgrade(&self) -> Self::Weak;
fn from(value: T) -> Self;
}
pub type Downgraded<P, T> = <P as AnySharedPointer<T>>::Weak;