cartesian_array_product 1.1.1

Arrays of the cartesian product of a set of items.
Documentation
#![cfg(test)]

use const_anonymous_functions::caf;

use crate::{cartesian_array, cartesian_array_map};

#[test]
fn prod_0() {
    assert_eq!(cartesian_array!(), [()])
}

#[test]
fn one_dimension() {
    assert_eq!(
        cartesian_array!([1, 2, 3, 4, 5, 8, 13, 69420]),
        [1, 2, 3, 4, 5, 8, 13, 69420]
    )
}

#[test]
fn prod_2x2() {
    let expected = [(1, 3), (2, 3), (1, 4), (2, 4)];

    assert_eq!(cartesian_array!([1, 2], [3, 4]), expected)
}

#[test]
fn prod_3x4() {
    let expected = [
        (1, 1),
        (2, 1),
        (3, 1),
        (1, 2),
        (2, 2),
        (3, 2),
        (1, 3),
        (2, 3),
        (3, 3),
        (1, 4),
        (2, 4),
        (3, 4),
    ];

    assert_eq!(cartesian_array!([1, 2, 3], [1, 2, 3, 4]), expected)
}

#[test]
fn prod_2x2x2() {
    let expected = [
        (1, 3, 5),
        (2, 3, 5),
        (1, 4, 5),
        (2, 4, 5),
        (1, 3, 6),
        (2, 3, 6),
        (1, 4, 6),
        (2, 4, 6),
    ];

    assert_eq!(cartesian_array!([1, 2], [3, 4], [5, 6]), expected)
}

#[test]
fn prod_2x3x4() {
    let expected = [
        (1, 1, 1),
        (2, 1, 1),
        (1, 2, 1),
        (2, 2, 1),
        (1, 3, 1),
        (2, 3, 1),
        (1, 1, 2),
        (2, 1, 2),
        (1, 2, 2),
        (2, 2, 2),
        (1, 3, 2),
        (2, 3, 2),
        (1, 1, 3),
        (2, 1, 3),
        (1, 2, 3),
        (2, 2, 3),
        (1, 3, 3),
        (2, 3, 3),
        (1, 1, 4),
        (2, 1, 4),
        (1, 2, 4),
        (2, 2, 4),
        (1, 3, 4),
        (2, 3, 4),
    ];

    assert_eq!(cartesian_array!([1, 2], [1, 2, 3], [1, 2, 3, 4]), expected)
}

#[test]
fn prod_2x2_map() {
    let expected = [1 + 3, 2 + 3, 1 + 4, 2 + 4];

    assert_eq!(cartesian_array_map!([1, 2], [3, 4]; |a, b| a + b), expected)
}

#[test]
fn prod_2x2_const_map() {
    let expected = [1 + 3, 2 + 3, 1 + 4, 2 + 4];

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

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

    assert_eq!(ARRAY, expected)
}

#[test]
fn prod_2x2_const_map_caf() {
    let expected = [1 + 3, 2 + 3, 1 + 4, 2 + 4];

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

    assert_eq!(ARRAY, expected)
}

#[test]
fn more_complicated_exprs() {
    let expected = [1 + 3, 2 + 3, 1 + 4, 2 + 4];

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

    assert_eq!(array, expected)
}

#[test]
fn recursive_macro() {
    let expected = [
        (vec![1, 2], vec![5, 6]),
        (vec![3, 4], vec![5, 6]),
        (vec![1, 2], vec![7, 8]),
        (vec![3, 4], vec![7, 8]),
    ];

    let array = cartesian_array_map!(
        [vec![1, 2], vec![3, 4]], [vec![5, 6], vec![7, 8]]
    );

    let array_2 = cartesian_array!(
        [vec![1, 2], vec![3, 4]], [vec![5, 6], vec![7, 8]]
    );

    assert_eq!(array, expected);
    assert_eq!(array_2, expected);
}