use std::mem::MaybeUninit;
pub fn transform_array<T, U, F: FnMut(T) -> U, const N: usize>(
source: [T; N],
mut mapper: F,
) -> [U; N] {
unsafe {
let mut result = MaybeUninit::uninit();
let start = result.as_mut_ptr() as *mut U;
for (pos, item) in IntoIterator::into_iter(source).enumerate() {
start.add(pos).write(mapper(item));
}
result.assume_init()
}
}
pub fn build_array<T, F: FnMut() -> T, const N: usize>(mut builder: F) -> [T; N] {
unsafe {
let mut result = MaybeUninit::uninit();
let start = result.as_mut_ptr() as *mut T;
for pos in 0..N {
start.add(pos).write(builder());
}
result.assume_init()
}
}