#[macro_export]
macro_rules! map_on {
( ($type_name:tt), $mac:ident $(, $args:tt)* ) => {
$mac!($type_name $(, $args)*);
};
( ($first_type:tt, $($rest_type:tt),+), $mac:ident $(, $args:tt)* ) => {
$crate::map_on!(($first_type), $mac $(, $args)*);
$crate::map_on!(($($rest_type),+), $mac $(, $args)*);
};
($tokens:tt, $($macro_arms:tt)+) => {
const _: () = {
macro_rules! __map_on_inliner {
$($macro_arms)+
}
$crate::map_on!(@expand_tokens $tokens);
};
};
(@expand_tokens ($first:tt $(, $rest:tt)*)) => {
__map_on_inliner!($first);
$crate::map_on!(@expand_tokens ($($rest),*))
};
(@expand_tokens ($last:tt)) => {
__map_on_inliner!($last);
};
(@expand_tokens ()) => {};
( ( $(($a:tt, $b:tt)),* $(,)? ), ($($params:tt)*) => $body:block ) => {
const _: () = {
macro_rules! __map_on_inliner {
($($params)*) => $body
}
$(
__map_on_inliner!($a, $b);
)*
};
};
( ($($types:tt),+), $mac:ident $(, $args:tt)* ) => {
$(
$mac!($types $(, $args)*);
)+
};
}