chj_rustbin/
chunks.rs

1//! Somehow chunks from itertools 0.11.0 is not Send, thus try my own.
2
3pub trait ChunksOp<T>: Iterator<Item = T> {
4    fn chunks(self, max_items: usize) -> Chunks<T, Self>
5    where
6        Self: Sized;
7}
8
9pub struct Chunks<T, I: Iterator<Item = T>> {
10    max_items: usize,
11    iter: I,
12    exhausted: bool,
13}
14
15impl<T, I: Iterator<Item = T>> Iterator for Chunks<T, I> {
16    type Item = Vec<T>;
17
18    fn next(&mut self) -> Option<Self::Item> {
19        if self.exhausted {
20            return None;
21        }
22        let mut vs = Vec::with_capacity(self.max_items);
23        loop {
24            if let Some(v) = self.iter.next() {
25                vs.push(v);
26            } else {
27                self.exhausted = true;
28                break;
29            }
30            if vs.len() >= self.max_items {
31                break;
32            }
33        }
34        if vs.is_empty() {
35            None
36        } else {
37            Some(vs)
38        }
39    }
40}
41
42impl<T, I: Iterator<Item = T>> ChunksOp<T> for I {
43    fn chunks(self, max_items: usize) -> Chunks<T, Self>
44    where
45        Self: Sized,
46    {
47        Chunks {
48            max_items,
49            iter: self,
50            exhausted: false,
51        }
52    }
53}