1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use crate::Array;
use core::{mem::MaybeUninit, ptr};

/// Creates an array `[T; N]` where each array element `T` is returned by the `cb` call.
#[inline]
pub fn create_array<A, F>(mut cb: F) -> A
where
  A: Array,
  F: FnMut(usize) -> A::Item,
{
  unsafe {
    let mut array: MaybeUninit<A> = MaybeUninit::uninit();
    for (idx, value_ptr) in (&mut *array.as_mut_ptr()).slice_mut().iter_mut().enumerate() {
      ptr::write(value_ptr, cb(idx));
    }
    array.assume_init()
  }
}