macro_rules! match_scenario_algorithm {
    (
        ($algorithm:expr, $scenario:expr => $algscen:ident : $algscenty:ident) {
            $($(#[$algmeta:meta])* $algpat:pat => $algcode:block),*
            <=>
            $($(#[$scenmeta:meta])* $scenpat:pat => $scencode:block => $scenty:ident),*
        }
    ) => { ... };
    (
        impl ($algorithm:expr, $scenario:expr => $algscen:ident : $algscenty:ident) {
            $(#[$algmeta:meta])* $algpat:pat => $algcode:block,
            $($(#[$algmetarem:meta])* $algpatrem:pat => $algcoderem:block),+
            <=>
            $($(#[$scenmeta:meta])* $scenpat:pat => $scencode:block => $scenty:ident),*
            <=>
            $($tail:tt)*
        }
    ) => { ... };
    (
        impl ($algorithm:expr, $scenario:expr => $algscen:ident : $algscenty:ident) {
            $(#[$algmeta:meta])* $algpat:pat => $algcode:block
            <=>
            $($(#[$scenmeta:meta])* $scenpat:pat => $scencode:block => $scenty:ident),*
            <=>
            $($tail:tt)*
        }
    ) => { ... };
}