use std::cell::{Ref, RefCell};
use std::collections::VecDeque;
use std::hash::Hash;
use std::rc::Rc;
use yew::prelude::*;
use super::use_update;
pub struct UseQueueHandle<T> {
inner: Rc<RefCell<VecDeque<T>>>,
update: Rc<dyn Fn()>,
}
impl<T> UseQueueHandle<T> {
pub fn current(&'_ self) -> Ref<'_, VecDeque<T>> {
self.inner.borrow()
}
pub fn set(&self, queue: VecDeque<T>) {
*self.inner.borrow_mut() = queue;
(self.update)();
}
pub fn push_back(&self, value: T)
where
T: Eq + Hash,
{
self.inner.borrow_mut().push_back(value);
(self.update)();
}
pub fn pop_front(&self) -> Option<T>
where
T: Eq + Hash,
{
let v = self.inner.borrow_mut().pop_front();
(self.update)();
v
}
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 UseQueueHandle<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
update: self.update.clone(),
}
}
}
impl<T> PartialEq for UseQueueHandle<T>
where
T: Eq + Hash,
{
fn eq(&self, other: &Self) -> bool {
*self.inner == *other.inner
}
}
#[hook]
pub fn use_queue<T>(initial_value: VecDeque<T>) -> UseQueueHandle<T>
where
T: 'static,
{
let inner = use_mut_ref(|| initial_value);
let update = use_update();
UseQueueHandle { inner, update }
}