#[macro_export]
macro_rules! eager{
(
$($all:tt)*
)=>{
eager_internal!{
@check_expansion[
[[][]]
]
$($all)*
}
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! eager_internal{
( // From macro expansion
@from_macro[ $prefix:tt $($rest:tt)* ]
$($input:tt)*
)=>{
eager_internal!{
@check_expansion[
[$prefix []]
$($rest)*
]
$($input)*
}
};
( // If the next token is a block, check it (brace type)
@check_expansion[
[[$($prefix:tt)*][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
{$($body:tt)*} $($rest:tt)*
)=>{
eager_internal!{
@check_expansion[
[[][]]
[[$($prefix)*][$($rest)*]{}]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)*
}
};
( @check_expansion[
[[$($prefix:tt)*][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
($($body:tt)*) $($rest:tt)*
)=>{
eager_internal!{
@check_expansion[
[[][]]
[[$($prefix)*][$($rest)*]()]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)*
}
};
( @check_expansion[
[[$($prefix:tt)*][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
eager!{$($body:tt)*} $($rest:tt)*
)=>{
eager_internal!{
@check_expansion[
[[$($prefix)*][]]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)* $($rest)*
}
};
( @check_expansion[
[[$($prefix:tt)*][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
eager!($($body:tt)*) $($rest:tt)*
)=>{
eager_internal!{
@check_expansion[
[[$($prefix)*][]]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)* $($rest)*
}
};
( @check_expansion[
[[$($prefix:tt)*][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
$next:tt $($rest:tt)*
)=>{
eager_internal!{
@check_expansion[
[[$next $($prefix)*][]]
$([$prefix_rest $postfix_rest $block_type])*
]
$($rest)*
}
};
( @check_expansion[
[[! $macro_name:tt $($prefix:tt)*][$($postfix:tt)*]{$($body:tt)*}]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
)=>{
$macro_name!{
@eager[
[$($postfix)*] [$($prefix)*]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)*
}
};
( @check_expansion[
[[! $macro_name:tt $($prefix:tt)*][$($postfix:tt)*]($($body:tt)*)]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
)=>{
$macro_name!{
@eager[
[$($postfix)*] [$($prefix)*]
$([$prefix_rest $postfix_rest $block_type])*
]
$($body)*
}
};
( @check_expansion[
[[$last:tt $($last_rest:tt)*][]]
[$prefix:tt $postfix:tt {$($body:tt)*}]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
)=>{
eager_internal!{
@check_expansion[
[[$($last_rest)*][]]
[$prefix $postfix {$last $($body)*}]
$([$prefix_rest $postfix_rest $block_type])*
]
}
};
( @check_expansion[
[[$last:tt $($last_rest:tt)*][]]
[$prefix:tt $postfix:tt ($($body:tt)*)]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])*
]
)=>{
eager_internal!{
@check_expansion[
[[$($last_rest)*][]]
[$prefix $postfix ($last $($body)*)]
$([$prefix_rest $postfix_rest $block_type])*
]
}
};
( @check_expansion[
[[][]]
$([$prefix_rest:tt $postfix_rest:tt $block_type:tt])+
]
)=>{
eager_internal!{
@check_expansion[
$([$prefix_rest $postfix_rest $block_type])+
]
}
};
( @check_expansion[
[[$($result:tt)*][]]
]
)=>{
reverse_tt!{ [$($result)*] }
};
( @check_expansion[
[[$($prefix:tt)*][$($postfix:tt)*]{$($body:tt)*}]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@promote[
[[{} $($prefix)*][$($postfix)*]{$($body)*}]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
}
};
( @check_expansion[
[[$($prefix:tt)*][$($postfix:tt)*]($($body:tt)*)]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@promote[
[[() $($prefix)*][$($postfix)*]($($body)*)]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
}
};
( @promote[
[[{$($other:tt)*} $($prefix:tt)*][$($postfix:tt)*]{$next:tt $($body:tt)*}]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@promote[
[[{$($other)* $next} $($prefix)*][$($postfix)*]{$($body)*}]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
}
};
( @promote[
[[($($other:tt)*) $($prefix:tt)*][$($postfix:tt)*]($next:tt $($body:tt)*)]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@promote[
[[($($other)* $next) $($prefix)*][$($postfix)*]($($body)*)]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
}
};
( @promote[
[[$promoted:tt $($prefix:tt)*][$($postfix:tt)*]{}]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@check_expansion[
[[$promoted $($prefix)*][]]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
$($postfix)*
}
};
( @promote[
[[$promoted:tt $($prefix:tt)*][$($postfix:tt)*]()]
$([$prefix_rest:tt $postfix_rest:tt $block_type_rest:tt])*
]
)=>{
eager_internal!{
@check_expansion[
[[$promoted $($prefix)*][]]
$([$prefix_rest $postfix_rest $block_type_rest])*
]
$($postfix)*
}
};
}