aerosol/src/join.rs

54 lines
1.1 KiB
Rust
Raw Normal View History

2018-09-18 11:39:15 +01:00
#[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)* }]
}
};
}