Rust split any iterator into fixed-size Vec batches
Rust
use std::num::NonZeroUsize;
fn chunk_iter<I, T>(iter: I, size: NonZeroUsize) -> Vec<Vec<T>>
where
I: IntoIterator<Item = T>,
{
let size = size.get();
let mut out = Vec::new();
let mut batch = Vec::with_capacity(size);
for item in iter {
batch.push(item);
if batch.len() == size {
out.push(std::mem::take(&mut batch));
}
}
if !batch.is_empty() {
out.push(batch);
}
out
}