compose/
lib.rs

1pub fn compose_2<A, B, C, G, F>(f: F, g: G) -> impl Fn(A) -> C
2where
3    F: Fn(B) -> C,
4    G: Fn(A) -> B,
5{
6    move |x| f(g(x))
7}
8
9#[macro_export]
10macro_rules! compose_n {
11    ( $last:expr ) => { $last };
12    ( $head:expr, $($tail:expr), + ) => {
13        compose_2($head, compose_n!($($tail),+))
14    };
15}