aerosol/src/join.rs
2018-10-29 01:36:58 +00:00

53 lines
1.1 KiB
Rust

#[doc(hidden)]
#[macro_export(local_inner_macros)]
macro_rules! join {
{
$caller:tt
sep = [{ $($sep:tt)* }]
} => {
$crate::tt_call::tt_return! {
$caller
joined = [{ }]
}
};
{
$caller:tt
sep = [{ $($sep:tt)* }]
item = [{ $($head:tt)* }]
$(
item = [{ $($tail:tt)* }]
)+
} => {
$crate::tt_call::tt_call! {
macro = [{ $crate::join }]
sep = [{ $($sep)* }]
$(
item = [{ $($tail)* }]
)+
~~> $crate::join! {
$caller
prepend = [{ $($head)* $($sep)* }]
}
}
};
{
$caller:tt
sep = [{ $($sep:tt)* }]
item = [{ $($head:tt)* }]
} => {
$crate::tt_call::tt_return! {
$caller
joined = [{ $($head)* }]
}
};
{
$caller:tt
prepend = [{ $($prepend:tt)* }]
joined = [{ $($joined:tt)* }]
} => {
$crate::tt_call::tt_return! {
$caller
joined = [{ $($prepend)* $($joined)* }]
}
};
}