#[macro_export]
macro_rules! punct_decompose {
(expand = $($expand:ident)::*, fallback = $_:tt, =) => { $($expand)::*!(= '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, <) => { $($expand)::*!(< '<') };
(expand = $($expand:ident)::*, fallback = $_:tt, <=) => { $($expand)::*!(<= '<' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, ==) => { $($expand)::*!(== '=' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, !=) => { $($expand)::*!(!= '!' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, >=) => { $($expand)::*!(>= '>' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, >) => { $($expand)::*!(> '>') };
(expand = $($expand:ident)::*, fallback = $_:tt, &&) => { $($expand)::*!(&& '&' '&') };
(expand = $($expand:ident)::*, fallback = $_:tt, ||) => { $($expand)::*!(|| '|' '|') };
(expand = $($expand:ident)::*, fallback = $_:tt, !) => { $($expand)::*!(! '!') };
(expand = $($expand:ident)::*, fallback = $_:tt, ~) => { $($expand)::*!(~ '~') };
(expand = $($expand:ident)::*, fallback = $_:tt, +) => { $($expand)::*!(+ '+') };
(expand = $($expand:ident)::*, fallback = $_:tt, -) => { $($expand)::*!(- '-') };
(expand = $($expand:ident)::*, fallback = $_:tt, *) => { $($expand)::*!(* '*') };
(expand = $($expand:ident)::*, fallback = $_:tt, /) => { $($expand)::*!(/ '/') };
(expand = $($expand:ident)::*, fallback = $_:tt, %) => { $($expand)::*!(% '%') };
(expand = $($expand:ident)::*, fallback = $_:tt, ^) => { $($expand)::*!(^ '^') };
(expand = $($expand:ident)::*, fallback = $_:tt, &) => { $($expand)::*!(& '&') };
(expand = $($expand:ident)::*, fallback = $_:tt, |) => { $($expand)::*!(| '|') };
(expand = $($expand:ident)::*, fallback = $_:tt, <<) => { $($expand)::*!(<< '<' '<') };
(expand = $($expand:ident)::*, fallback = $_:tt, >>) => { $($expand)::*!(>> '>' '>') };
(expand = $($expand:ident)::*, fallback = $_:tt, +=) => { $($expand)::*!(+= '+' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, -=) => { $($expand)::*!(-= '-' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, *=) => { $($expand)::*!(*= '*' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, /=) => { $($expand)::*!(/= '/' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, %=) => { $($expand)::*!(%= '%' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, ^=) => { $($expand)::*!(^= '^' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, &=) => { $($expand)::*!(&= '&' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, |=) => { $($expand)::*!(|= '|' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, <<=) => { $($expand)::*!(<<= '<' '<' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, >>=) => { $($expand)::*!(>>= '>' '>' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, @) => { $($expand)::*!(@ '@') };
(expand = $($expand:ident)::*, fallback = $_:tt, .) => { $($expand)::*!(. '.') };
(expand = $($expand:ident)::*, fallback = $_:tt, ..) => { $($expand)::*!(.. '.' '.') };
(expand = $($expand:ident)::*, fallback = $_:tt, ...) => { $($expand)::*!(... '.' '.' '.') };
(expand = $($expand:ident)::*, fallback = $_:tt, ..=) => { $($expand)::*!(..= '.' '.' '=') };
(expand = $($expand:ident)::*, fallback = $_:tt, ,) => { $($expand)::*!(, ',') };
(expand = $($expand:ident)::*, fallback = $_:tt, ;) => { $($expand)::*!(; ';') };
(expand = $($expand:ident)::*, fallback = $_:tt, :) => { $($expand)::*!(: ':') };
(expand = $($expand:ident)::*, fallback = $_:tt, ::) => { $($expand)::*!(:: ':' ':') };
(expand = $($expand:ident)::*, fallback = $_:tt, ->) => { $($expand)::*!(-> '-' '>') };
(expand = $($expand:ident)::*, fallback = $_:tt, <-) => { $($expand)::*!(<- '<' '-') };
(expand = $($expand:ident)::*, fallback = $_:tt, =>) => { $($expand)::*!(=> '=' '>') };
(expand = $($expand:ident)::*, fallback = $_:tt, #) => { $($expand)::*!(# '#') };
(expand = $($expand:ident)::*, fallback = $_:tt, ?) => { $($expand)::*!(? '?') };
(expand = $($expand:ident)::*, fallback = $_:tt, _) => { $($expand)::*!(_ '_') };
(expand = $_0:ident $(::$_1:ident)*, fallback = { $($fallback:tt)* }, $($tt:tt)+) => {
$($fallback)*
};
}
#[macro_export]
macro_rules! for_all_punct_seqs {
($expand:ident$(, $($args:tt)*)?) => {
$expand! {
$($($args)*,)?
&
&&
&=
@
^
^=
:
,
.
..
...
..=
=
==
=>
>=
>
<-
<=
<
-
-=
!=
!
|
|=
||
::
%
%=
+
+=
#
?
->
;
<<
<<=
>>
>>=
/
/=
*
*=
~
_
}
};
}