#[macro_export]
macro_rules! cascade {
(let _ : $t:ty = $e: expr; $($tail: tt)*) => {
cascade!(let __tmp: $t = $e; $($tail)*)
};
(let $i:ident : $t:ty = $e: expr; $($tail: tt)*) => {
{
let mut $i: $t = $e;
cascade!(@line $i, $($tail)*)
}
};
(let $i:ident = $e: expr; $($tail: tt)*) => {
{
let mut $i = $e;
cascade!(@line $i, $($tail)*)
}
};
($e: expr; $($tail: tt)*) => {
cascade!(let __tmp = $e; $($tail)*)
};
(@line $i: ident, .. $v: ident = $e: expr; $($tail: tt)*) => {
{
$i.$v = $e;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, .. $v:ident += $e:expr; $($tail:tt)*) => {
{
$i.$v += $e;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, .. $v:ident -= $e:expr; $($tail:tt)*) => {
{
$i.$v -= $e;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, .. $v:ident *= $e:expr; $($tail:tt)*) => {
{
$i.$v *= $e;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, .. $($q: ident ($($e: expr),*)).+; $($tail: tt)*) => {
{
$i.$($q($($e),*)).+;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, .. $($q: ident ($($e: expr),*)).+?; $($tail: tt)*) => {
{
$i.$($q($($e),*)).+?;
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, { $($t:tt)* }; $($tail: tt)*) => {
{
{ $crate::cascade!(@line $i, $($t)*); }
$crate::cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, $s: stmt; $($tail: tt)*) => {
{
$s
cascade!(@line $i, $($tail)*)
}
};
(@line $i:ident, { $($t:tt)* }) => {
{ $crate::cascade!(@line $i, $($t)*) }
};
(@line $i:ident, .. $($q: ident ($($e: expr),*)).+) => {
$i.$($q($($e),*)).+
};
(@line $i:ident, $e:expr) => {
$e
};
(@line $i:ident,) => {
$i
};
() => {}
}