orx-concurrent-iter 3.3.0

A thread-safe and ergonomic concurrent iterator trait and efficient lock-free implementations.
Documentation
use super::chunk_seq_iter::ArrayChunkSeqIter;
use super::con_iter::ArrayConIter;
use crate::pullers::ChunkPuller;

pub struct ArrayChunkPuller<'i, C>
where
    C: ArrayConIter,
{
    con_iter: &'i C,
    chunk_size: usize,
}

impl<'i, C> ArrayChunkPuller<'i, C>
where
    C: ArrayConIter,
{
    pub(crate) fn new(con_iter: &'i C, chunk_size: usize) -> Self {
        Self {
            con_iter,
            chunk_size,
        }
    }
}

impl<'i, C> ChunkPuller for ArrayChunkPuller<'i, C>
where
    C: ArrayConIter,
{
    type ChunkItem = C::Item;

    type Chunk<'c>
        = ArrayChunkSeqIter<'i, C::Item>
    where
        Self: 'c;

    fn chunk_size(&self) -> usize {
        self.chunk_size
    }

    fn pull(&mut self) -> Option<Self::Chunk<'_>> {
        self.con_iter
            .progress_and_get_chunk_pointers(self.chunk_size)
            .map(|x| ArrayChunkSeqIter::new(x.first, x.last))
    }

    fn pull_with_idx(&mut self) -> Option<(usize, Self::Chunk<'_>)> {
        self.con_iter
            .progress_and_get_chunk_pointers(self.chunk_size)
            .map(|x| (x.begin_idx, ArrayChunkSeqIter::new(x.first, x.last)))
    }
}