macro_rules! repeat_macro {
(
$macro:tt =>
$( $current_names:ident $( : $current_types:ident )? ),*
| $next_name:ident $( : $next_type:ident )?
$(, $queued_names:ident $( : $queued_types:ident )? )* $(,)?
) => {
$macro!($( $current_names $(: $current_types)? ),*);
repeat_macro!(
$macro =>
$( $current_names $(: $current_types)?, )*
$next_name $(: $next_type)?
| $($queued_names $(: $queued_types)? ),*
);
};
( $macro:tt => $( $current_names:ident $( : $current_types:ident )? ),* |) => {
$macro!($( $current_names $(: $current_types)? ),*);
};
( $macro:tt => $( $current_names:ident $( : $current_types:ident )? ),* $(,)*) => {
repeat_macro!($macro => | $( $current_names $(: $current_types)? ),*);
}
}