#![allow(dead_code, deprecated, unused_variables, unused_mut)] #![feature(array_into_iter_constructors)] #![feature(maybe_uninit_uninit_array_transpose)] use std::array::IntoIter; use std::mem::MaybeUninit; fn next_chunk( it: &mut impl Iterator, ) -> Result<[T; N], IntoIter> { let mut buffer = [const { MaybeUninit::uninit() }; N]; let mut i = 0; while i < N { match it.next() { Some(x) => { buffer[i].write(x); i += 1; } None => { unsafe { return Err(IntoIter::new_unchecked(buffer, 0..i)); } } } } unsafe { Ok(buffer.transpose().assume_init()) } } fn main() { let r: [_; 4] = next_chunk(&mut (10..16)).unwrap(); assert_eq!(r, [10, 11, 12, 13]); let r: IntoIter<_, 40> = next_chunk(&mut (10..16)).unwrap_err(); assert_eq!(r.collect::< Vec < _ >> (), vec![10, 11, 12, 13, 14, 15]); }