1pub 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}