use std::mem::MaybeUninit;
pub(crate) fn collect_exact<T, const N: usize>(
mut iter: impl Iterator<Item = T>,
) -> Result<[T; N], crate::Error> {
let array = collect_exact_prefix(&mut iter)?;
if iter.next().is_some() {
return Err(crate::Error::TooManyItems);
}
Ok(array)
}
pub(crate) fn collect_exact_prefix<T, const N: usize>(
mut iter: impl Iterator<Item = T>,
) -> Result<[T; N], crate::PrefixError> {
let mut array = MaybeUninit::<[T; N]>::uninit();
let start_ptr = array.as_mut_ptr().cast::<T>();
for i in 0..N {
if let Some(item) = iter.next() {
unsafe { start_ptr.add(i).write(item) };
} else {
for j in 0..i {
unsafe { start_ptr.add(j).drop_in_place() };
}
return Err(crate::PrefixError);
}
}
let array = unsafe { array.assume_init() };
Ok(array)
}