shadow_nft_common/
array_from_fn.rs1use core::mem::MaybeUninit;
7
8pub fn from_fn<T, F: FnMut(usize) -> T, const L: usize>(mut f: F) -> [T; L] {
10 let mut array: [MaybeUninit<T>; L] = [(); L].map(|_| MaybeUninit::uninit());
12
13 for i in 0..L {
15 array[i].write(f(i));
16 }
17 unsafe { array.map(|ui| ui.assume_init()) }
21}
22
23#[test]
24fn test_stable_array_from_fn() {
25 let result = from_fn(|i| i);
27 let expected = [0, 1, 2, 3, 4, 5];
28 assert_eq!(result, expected);
29
30 let result = from_fn(|i| i * i);
32 let expected = [0, 1, 4, 9, 16, 25];
33 assert_eq!(result, expected);
34
35 let some_other_array = [5, 4, 3, 2, 1];
37 let result = from_fn(|i| some_other_array[i]);
38 assert_eq!(result, some_other_array);
39
40 let some_other_array = [5, 4, 3, 2, 1];
42 let result = from_fn(move |i| some_other_array[i]);
43 assert_eq!(result, some_other_array);
44
45 let mut some_other_array = [5, 4, 3, 2, 1, 0];
47 let result = from_fn(|i| {
48 some_other_array[i] = i;
49 i * i
50 });
51 let expected_some = [0, 1, 2, 3, 4, 5];
52 let expected_result = [0, 1, 4, 9, 16, 25];
53 assert_eq!(some_other_array, expected_some);
54 assert_eq!(result, expected_result);
55}