use std::cell::{Ref, RefCell};
use std::cmp::Ordering;
use std::rc::Rc;
use yew::prelude::*;
use super::use_update;
pub struct UseListHandle<T> {
inner: Rc<RefCell<Vec<T>>>,
update: Rc<dyn Fn()>,
}
impl<T> UseListHandle<T> {
pub fn current(&'_ self) -> Ref<'_, Vec<T>> {
self.inner.borrow()
}
pub fn set(&self, elements: Vec<T>) {
*self.inner.borrow_mut() = elements;
(self.update)();
}
pub fn insert(&self, index: usize, element: T) {
self.inner.borrow_mut().insert(index, element);
(self.update)();
}
pub fn update(&self, index: usize, element: T) {
if let Some(elem) = self.inner.borrow_mut().get_mut(index) {
*elem = element;
}
(self.update)();
}
pub fn remove(&self, index: usize) -> T {
let elem = self.inner.borrow_mut().remove(index);
(self.update)();
elem
}
pub fn push(&self, value: T) {
self.inner.borrow_mut().push(value);
(self.update)();
}
pub fn pop(&self) -> Option<T> {
let value = self.inner.borrow_mut().pop();
(self.update)();
value
}
pub fn retain<F>(&self, f: F)
where
F: FnMut(&T) -> bool,
{
self.inner.borrow_mut().retain(f);
(self.update)();
}
pub fn reverse(&self) {
self.inner.borrow_mut().reverse();
(self.update)();
}
pub fn append(&self, other: &mut Vec<T>) {
self.inner.borrow_mut().append(other);
(self.update)();
}
pub fn sort(&self)
where
T: Ord,
{
self.inner.borrow_mut().sort();
(self.update)();
}
pub fn sort_by<F>(&self, compare: F)
where
F: FnMut(&T, &T) -> Ordering,
{
self.inner.borrow_mut().sort_by(compare);
(self.update)();
}
pub fn swap(&self, a: usize, b: usize) {
self.inner.borrow_mut().swap(a, b);
(self.update)();
}
pub fn clear(&self) {
self.inner.borrow_mut().clear();
(self.update)();
}
}
impl<T> Clone for UseListHandle<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
update: self.update.clone(),
}
}
}
impl<T> PartialEq for UseListHandle<T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
*self.inner == *other.inner
}
}
#[hook]
pub fn use_list<T>(initial_value: Vec<T>) -> UseListHandle<T>
where
T: 'static,
{
let inner = use_mut_ref(|| initial_value);
let update = use_update();
UseListHandle { inner, update }
}