macro_rules! compose {
($fnLeft:ident,$is_left_fn_async:ident,-> with_args($args:expr) $($others:tt)*) => { ... };
($fnLeft:ident,$is_left_fn_async:ident,.provide($p1:expr) $($others:tt)*) => { ... };
($f_left:ident,$is_left_fn_async:ident,$f_right:ident, $isRightAsync:ident, .provide($p:expr) $($others:tt)*) => { ... };
($f_left:ident,$is_left_fn_async:ident,$f_right:ident, $isRightAsync:ident, -> $($others:tt)*) => { ... };
($f_left:ident,$is_left_fn_async:ident,-> $fn:ident.provide($p:expr) $($others:tt)*) => { ... };
($f_left:ident,$isLeftFnAsync:ident,-> $fn:ident.provide($p:expr) $($others:tt)*) => { ... };
($f_left:ident,$is_left_fn_async:ident,-> $fn:ident $($others:tt)*) => { ... };
($fn:ident $($others:tt)*) => { ... };
}