macro_rules! check {
( [] $cases:tt ) => { ... };
( [$f:expr $(, $($fns:tt)*)?] $cases:tt ) => { ... };
( @1 $f:expr, {}) => { ... };
( @1 $f:expr, { $args:tt => FAIL $(, $($ts:tt)* )? } ) => { ... };
( @1 $f:expr, { $args:tt => $out:expr $(, $($ts:tt)* )? } ) => { ... };
( @2 $f:expr, ($($args:tt)*) => FAIL ) => { ... };
( @2 $f:expr, ($($args:tt)*) => $out:expr ) => { ... };
}