use std::cell::RefCell;
use std::rc::Rc;
use yew::prelude::*;
pub struct UseMutLatestHandle<T> {
inner: Rc<RefCell<Rc<RefCell<T>>>>,
}
impl<T> UseMutLatestHandle<T> {
pub fn current(&self) -> Rc<RefCell<T>> {
self.inner.borrow().clone()
}
}
impl<T> Clone for UseMutLatestHandle<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<T> PartialEq for UseMutLatestHandle<T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
*self.inner == *other.inner
}
}
pub struct UseLatestHandle<T> {
inner: Rc<RefCell<Rc<T>>>,
}
impl<T> UseLatestHandle<T> {
pub fn current(&self) -> Rc<T> {
self.inner.borrow().clone()
}
}
impl<T> Clone for UseLatestHandle<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<T> PartialEq for UseLatestHandle<T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
*self.inner == *other.inner
}
}
#[hook]
pub fn use_mut_latest<T>(value: T) -> UseMutLatestHandle<T>
where
T: 'static,
{
let value_rc = Rc::new(RefCell::new(value));
let inner = use_mut_ref(|| value_rc.clone());
*inner.borrow_mut() = value_rc;
UseMutLatestHandle { inner }
}
#[hook]
pub fn use_latest<T>(value: T) -> UseLatestHandle<T>
where
T: 'static,
{
let value_rc = Rc::new(value);
let inner = use_mut_ref(|| value_rc.clone());
*inner.borrow_mut() = value_rc;
UseLatestHandle { inner }
}