multindex 0.1.3

Index slices with multiple const indices/ranges.
Documentation
#[doc(hidden)]
#[macro_export]
macro_rules! new_IndexArgumentsAndStats{
    (@initialize
        prenorm = $prenorm:ident,
        ind_args = $ind_args:ident$(,)*
        error_handling(|$err:ident| $err_handling:expr ),
    )=>{{
        use $crate::pmr::{IndexArgument, IndexArgumentStats, IndexArgumentsAndStats};

        let mut stats = IndexArgumentStats::NEW;

        $crate::for_range!{ i in 0..$prenorm.len() =>
            let (elem, nstats) = match IndexArgument::from_prenorm(&$prenorm, i as _, stats) {
                Ok(x)=>x,
                Err($err)=>$err_handling,
            };
            stats = nstats;
            $ind_args[i] = elem;
        }

        IndexArgumentsAndStats{ $ind_args, stats }
    }};
    (@from_index_macro; $($index:expr),* $(,)?)=>{{
        const __PRENORM: &[$crate::pmr::PrenormIndex] =
            &$crate::prenorm_indices_from!($($index,)*);

        let mut ind_args = [$crate::pmr::IndexArgument::EMPTY; __PRENORM.len()];
        let mut ret_err = Ok(());

        let iaas = $crate::new_IndexArgumentsAndStats!{
            @initialize
            prenorm = __PRENORM,
            ind_args = ind_args,
            error_handling(|e|{
                ret_err = $crate::pmr::Err(e);
                break;
            }),
        };

        $crate::pmr::ComputedConstants{
            err: ret_err,
            err_tuple: $crate::pmr::ErrorTuple::OK,
            stats: iaas.stats,
            ind_args: iaas.ind_args,
        }
    }};
}

#[doc(hidden)]
#[macro_export]
macro_rules! prenorm_indices_from{
    ($($index:expr),* $(,)? )=>{
        [
            $( $crate::pmr::IntoPrenormIndex($index).call(), )*
        ]
    }
}