use std::{ops::Range, sync::Arc};
use leptos::prelude::*;
use crate::cache::Cache;
pub struct ItemWindow<T>
where
T: Send + Sync + 'static,
{
pub cache: Cache<T>,
pub range: Signal<Range<usize>>,
}
impl<T> Clone for ItemWindow<T>
where
T: Send + Sync + 'static,
{
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for ItemWindow<T> where T: Send + Sync + 'static {}
impl<T> ItemWindow<T>
where
T: Send + Sync + 'static,
{
#[inline]
pub fn update_item(&self, index: usize, item: T) {
self.cache.update_item(index, item);
}
#[inline]
pub fn insert_item(&self, index: usize, item: T) {
self.cache.insert_item(index, item);
}
#[inline]
pub fn remove_item(&self, index: usize) {
self.cache.remove_item(index);
}
}
pub struct WindowItem<T>
where
T: Send + Sync + 'static,
{
pub index: usize,
pub data: Arc<T>,
cache: Cache<T>,
}
impl<T> Clone for WindowItem<T>
where
T: Send + Sync + 'static,
{
fn clone(&self) -> Self {
Self {
index: self.index,
data: Arc::clone(&self.data),
cache: self.cache,
}
}
}
impl<T> WindowItem<T>
where
T: Send + Sync + 'static,
{
pub fn new(index: usize, data: Arc<T>, window: &ItemWindow<T>) -> Self {
Self {
index,
data,
cache: window.cache,
}
}
#[inline]
pub fn update(&self, new: T) {
self.cache.update_item(self.index, new);
}
#[inline]
pub fn remove(&self) {
self.cache.remove_item(self.index);
}
#[inline]
pub fn insert_before(&self, item: T) {
self.cache.insert_item(self.index, item);
}
#[inline]
pub fn insert_after(&self, item: T) {
self.cache.insert_item(self.index + 1, item);
}
#[inline]
pub fn insert(&self, index: usize, item: T) {
self.cache.insert_item(index, item);
}
}