macro_rules! cartesian_array_map {
    ($([$($queue:expr),*]),*) => { ... };
    ($([$($queue:expr),*]),*; $wrapper:expr) => { ... };
    (@impl
        initial: $initial:tt;
        acc: [$(($($acc:tt)*))*];
        current: [];
        queue: [];
        wrapper: ;
    ) => { ... };
    (@impl
        initial: $initial:tt;
        acc: [$(($($acc:tt)*))*];
        current: [];
        queue: [];
        wrapper: $wrapper:expr;
    ) => { ... };
    (@impl
        initial: $initial:tt;
        acc: $acc:tt;
        current: [];
        queue: [$queue_head:tt $($queue_tail:tt)*];
        wrapper: $($wrapper:expr)?;
    ) => { ... };
    (@impl
        initial: [$(($($initial:tt)*))*];
        acc: [$($acc:tt)*];
        current: [$current_head:tt $($current_tail:tt)*];
        queue: $queue:tt;
        wrapper: $($wrapper:expr)?;
    ) => { ... };
}
Expand description

Same as cartesian_array! but mapping each element.

It is useful to use this macro instead of cartesian_array! followed by a .map because it avoids creating an intermediate array. Also, .map doesn’t work in const scenarious, while cartesian_array_map! does.

Example

Regular use

use cartesian_array_product::cartesian_array_map;

let mapped_product = cartesian_array_map!([1, 2], [3, 4]; |a, b| a + b);
let expected = [
    1 + 3,
    2 + 3,
    1 + 4,
    2 + 4,
];

assert_eq!(mapped_product, expected);

Const use

use cartesian_array_product::cartesian_array_map;

const fn sum(a: i32, b: i32) -> i32 {
    a + b
}

const mapped_product: [i32; 4] = cartesian_array_map!([1, 2], [3, 4]; sum);
const expected: [i32; 4] = [
    1 + 3,
    2 + 3,
    1 + 4,
    2 + 4,
];

assert_eq!(mapped_product, expected);

Tip: You can use caf! to create a const anonymous function

use cartesian_array_product::{cartesian_array_map, caf};

const mapped_product: [i32; 4] = cartesian_array_map!(
    [1, 2], [3, 4]; 
    caf!(|a: i32, b: i32| -> i32 { a + b })
);
 
const expected: [i32; 4] = [
    1 + 3,
    2 + 3,
    1 + 4,
    2 + 4,
];

assert_eq!(mapped_product, expected);