use std::cell::{Ref, RefCell};
use std::collections::HashSet;
use std::hash::Hash;
use std::rc::Rc;
use yew::prelude::*;
use super::use_update;
pub struct UseSetHandle<T> {
inner: Rc<RefCell<HashSet<T>>>,
update: Rc<dyn Fn()>,
}
impl<T> UseSetHandle<T> {
pub fn current(&self) -> Ref<HashSet<T>> {
self.inner.borrow()
}
pub fn set(&self, set: HashSet<T>) {
*self.inner.borrow_mut() = set;
(self.update)();
}
pub fn insert(&self, value: T) -> bool
where
T: Eq + Hash,
{
let present = self.inner.borrow_mut().insert(value);
(self.update)();
present
}
pub fn replace(&self, value: T) -> Option<T>
where
T: Eq + Hash,
{
let v = self.inner.borrow_mut().replace(value);
(self.update)();
v
}
pub fn remove(&self, value: &T) -> bool
where
T: Eq + Hash,
{
let present = self.inner.borrow_mut().remove(value);
(self.update)();
present
}
pub fn retain<F>(&self, f: F)
where
T: Eq + Hash,
F: FnMut(&T) -> bool,
{
self.inner.borrow_mut().retain(f);
(self.update)();
}
pub fn clear(&self) {
self.inner.borrow_mut().clear();
(self.update)();
}
}
impl<T> Clone for UseSetHandle<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
update: self.update.clone(),
}
}
}
impl<T> PartialEq for UseSetHandle<T>
where
T: Eq + Hash,
{
fn eq(&self, other: &Self) -> bool {
*self.inner == *other.inner
}
}
#[hook]
pub fn use_set<T>(initial_value: HashSet<T>) -> UseSetHandle<T>
where
T: 'static,
{
let inner = use_mut_ref(|| initial_value);
let update = use_update();
UseSetHandle { inner, update }
}