use std::ops::Range;
#[inline(always)]
pub fn range_portion(i: usize, k: usize, r: Range<usize>) -> Range<usize> {
let n = r.len();
let base_size = n / k;
let num_one_larger = n % k;
let num_before = base_size * i + i.min(num_one_larger);
let our_size = base_size + (i < num_one_larger) as usize;
r.start + num_before..r.start + num_before + our_size
}
pub fn flatten<T: Clone, R: AsRef<[T]>>(bufs: &[R], len: Option<usize>) -> Vec<T> {
let len = len.unwrap_or_else(|| bufs.iter().map(|b| b.as_ref().len()).sum());
let mut out = Vec::with_capacity(len);
for b in bufs {
out.extend_from_slice(b.as_ref());
}
out
}