const_tools/
scan.rs

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}