use crate::error::Result;
#[allow(clippy::len_without_is_empty)]
pub trait DataLoader<I, L> {
fn load(&mut self, idx: usize) -> Result<(I, L)>;
fn len(&self) -> Option<usize> {
None
}
}
pub struct IterableDataLoader<T, I, L, C: Fn(&T) -> Result<(I, L)>> {
items: Box<[T]>,
collator: C
}
impl<T, I, L, C: Fn(&T) -> Result<(I, L)>> DataLoader<I, L> for IterableDataLoader<T, I, L, C> {
fn load(&mut self, idx: usize) -> Result<(I, L)> {
(self.collator)(&self.items[idx])
}
fn len(&self) -> Option<usize> {
Some(self.items.len())
}
}
pub fn iterable_data_loader<T, I, L, C: Fn(&T) -> Result<(I, L)>>(iterable: impl Iterator<Item = T>, collator: C) -> IterableDataLoader<T, I, L, C> {
IterableDataLoader {
items: iterable.collect::<Vec<T>>().into_boxed_slice(),
collator
}
}
impl<I, L, F: FnMut(usize) -> Result<(I, L)>> DataLoader<I, L> for F {
fn load(&mut self, idx: usize) -> Result<(I, L)> {
(self)(idx)
}
fn len(&self) -> Option<usize> {
None
}
}