1#[macro_export]
2macro_rules! scan {
3 (zip!($($iae:expr),* $(,)?), $init:expr, |$acc:pat_param, ($($iip:pat_param),* $(,)?)| $body:expr) => {{
4 let mut acc = $init;
5 $crate::map!(zip!($($iae),*), |($($iip,)*)| {
6 let $acc = &mut acc;
7 $body
8 })
9 }};
10 (zip!($($iae:expr),* $(,)?), $init:expr, $fn:expr) => {
11 $crate::__zip_left!(
12 [$(($iae, ))*]
13 [(ii0) (ii1) (ii2) (ii3) (ii4) (ii5) (ii6) (ii7) (ii8) (ii9) (ii10) (ii11)]
14 "unsupported number of inputs"
15 $crate::scan!(@zip_function <> [$init] [$fn])
16 )
17 };
18 ($iae:expr, $init:expr, |$acc:pat_param, $iip:pat_param| $body:expr) => {{
19 let mut acc = $init;
20 $crate::map!($iae, |$iip| {
21 let $acc = &mut acc;
22 $body
23 })
24 }};
25 ($iae:expr, $init:expr, $fn:expr) => {{
26 let mut acc = $init;
27 $crate::map!($iae, |item| {
28 $fn(&mut acc, item)
29 })
30 }};
31 (@zip_function [$(($iae:expr, $ii:ident))*] [$init:expr] [$fn:expr]) => {
32 $crate::scan!(zip!($($iae),*), $init, |acc, ($($ii,)*)| $fn(acc, ($($ii,)*)))
33 };
34}