macro_rules! either {
(match $val:tt { $($body:tt)+ }) => {
either!(@collect $val; []; []; $($body)+)
};
(@collect $val:expr; [$($arms:tt)*]; [$($depth:tt)*]; $pat:pat => $expr:expr, $($rest:tt)+) => {
either!(@collect $val;
[$($arms)* $pat => either!(@left [$($depth)*] $expr),];
[$($depth)* R];
$($rest)+)
};
(@collect $val:expr; [$($arms:tt)*]; [$($depth:tt)*]; $pat:pat => $expr:expr $(,)?) => {
match $val {
$($arms)*
$pat => either!(@right [$($depth)*] $expr),
}
};
(@left [] $expr:expr) => { ::either::Either::Left($expr) };
(@left [R $($rest:tt)*] $expr:expr) => {
::either::Either::Right(either!(@left [$($rest)*] $expr))
};
(@right [] $expr:expr) => { $expr };
(@right [R $($rest:tt)*] $expr:expr) => {
::either::Either::Right(either!(@right [$($rest)*] $expr))
};
}