#![allow(async_fn_in_trait)]
use crate::ColumnSort;
use std::collections::VecDeque;
use std::fmt::Debug;
use std::ops::Range;
pub trait TableDataProvider<Row, Column, Err: Debug = String> {
const CHUNK_SIZE: Option<usize> = None;
async fn get_rows(&self, range: Range<usize>) -> Result<(Vec<Row>, Range<usize>), Err>;
async fn row_count(&self) -> Option<usize> {
None
}
#[allow(unused_variables)]
fn set_sorting(&mut self, sorting: &VecDeque<(Column, ColumnSort)>) {
}
fn track(&self) {
}
}
pub trait PaginatedTableDataProvider<Row, Column, Err: Debug = String> {
const PAGE_ROW_COUNT: usize;
async fn get_page(&self, page_index: usize) -> Result<Vec<Row>, Err>;
async fn row_count(&self) -> Option<usize> {
self.page_count().await.map(|pc| pc * Self::PAGE_ROW_COUNT)
}
async fn page_count(&self) -> Option<usize> {
None
}
#[allow(unused_variables)]
fn set_sorting(&mut self, sorting: &VecDeque<(Column, ColumnSort)>) {
}
fn track(&self) {
}
}
impl<Row, Column, Err, D> TableDataProvider<Row, Column, Err> for D
where
D: PaginatedTableDataProvider<Row, Column, Err>,
Err: Debug,
{
const CHUNK_SIZE: Option<usize> = Some(D::PAGE_ROW_COUNT);
async fn get_rows(&self, range: Range<usize>) -> Result<(Vec<Row>, Range<usize>), Err> {
let Range { start, end } = range;
debug_assert_eq!(start % D::PAGE_ROW_COUNT, 0);
debug_assert_eq!(end - start, D::PAGE_ROW_COUNT);
self.get_page(start / D::PAGE_ROW_COUNT).await.map(|rows| {
let len = rows.len();
(rows, start..start + len)
})
}
async fn row_count(&self) -> Option<usize> {
PaginatedTableDataProvider::<Row, Column, Err>::row_count(self).await
}
fn set_sorting(&mut self, sorting: &VecDeque<(Column, ColumnSort)>) {
PaginatedTableDataProvider::<Row, Column, Err>::set_sorting(self, sorting)
}
fn track(&self) {
PaginatedTableDataProvider::<Row, Column, Err>::track(self)
}
}
pub fn get_vec_range_clamped<T: Clone>(vec: &[T], range: Range<usize>) -> (Vec<T>, Range<usize>) {
if vec.is_empty() {
return (vec![], 0..0);
}
let start = range.start.min(vec.len() - 1);
let end = range.end.min(vec.len());
let return_range = start..end;
(vec[return_range.clone()].to_vec(), return_range)
}