1#[macro_export]
2macro_rules! map {
3 (@parse [zip!($($iae:expr),* $(,)?), |($($iip:pat_param),* $(,)?)| $($body:tt)*] $($cb:tt)*) => {
5 $crate::__zip_left!(
6 [$(($iae, $iip, ))*]
7 [(ia0) (ia1) (ia2) (ia3) (ia4) (ia5) (ia6) (ia7) (ia8) (ia9) (ia10) (ia11)]
8 "unsupported number of inputs"
9 $($cb)*([$($body)*] <>)
10 )
11 };
12 (@parse [zip!($($iae:expr),* $(,)?), $fn:expr] $($cb:tt)*) => {
13 $crate::__zip_left!(
14 [$(($iae, ))*]
15 [(ii0, ia0) (ii1, ia1) (ii2, ia2) (ii3, ia3) (ii4, ia4) (ii5, ia5) (ii6, ia6) (ii7, ia7) (ii8, ia8) (ii9, ia9) (ii10, ia10) (ii11, ia11)]
16 "unsupported number of inputs"
17 $crate::map!(@parse_fn [$fn] <> $($cb)*)
18 )
19 };
20 (@parse [$iae:expr, |$iip:pat_param| $($body:tt)*] $($cb:tt)*) => {
21 $crate::__call!($($cb)*([$($body)*] [($iae, $iip, ia0)]))
22 };
23 (@parse [$iae:expr, $fn:expr] $($cb:tt)*) => {
24 $crate::__call!($($cb)*([$fn(ii)] [($iae, ii, ia)]))
25 };
26 (@parse_fn [$fn:expr] [$(($iae:expr, $ii:ident, $ia:ident))*] $($cb:tt)*) => {
28 $crate::__call!($($cb)*([$fn(($($ii,)*))] [$(($iae, $ii, $ia))*]))
29 };
30 (@expand [$body:expr] [$(($iae:expr, $iip:pat_param, $ia:ident))*]) => {{
32 let mut oa = $crate::__maybe_uninit_array_uninit();
33 $(
34 let $ia = ::core::mem::ManuallyDrop::new($iae);
35 let $ia = $crate::__manually_drop_inner_ref(&$ia);
36 )*
37 let len = $crate::__same_len!(&oa $(,$ia)*);
38 let mut index = 0;
39 while index < len {
40 $(
41 let $iip = unsafe { ::core::ptr::read(&$ia[index]) };
42 )*
43 oa[index].write($body);
44 index += 1;
45 }
46 assert!(
47 index == len,
48 "break is not allowed because a value must be written into every array element"
49 );
50 unsafe { $crate::__maybe_uninit_array_assume_init(oa) }
51 }};
52 ($($map_args:tt)*) => {
53 $crate::map!(@parse [$($map_args)*] $crate::map!(@expand <>))
54 };
55}