By the usage of compose! in main [30 and 34], you should see clearly what it does: it takes as many closures as you want, and combines them into a new closure that runs them one by one. This is really useful for runtime user-driven functionality composition.
The macro is implemented similarly to the standard macro for variable arguments from Chapter 1, Learning the Basics; Accepting a variable number of arguments, with its edge case being a single closure [6]. When encountering more, it will recursively go through them and combine them in pairs by calling the helper function compose_two [14]. Usually, type parameters are written as a single character, but we are using full words for them in this recipe for readability reasons, as there are quite a number of types involved. The type constraints used should illustrate how the types are used pretty well [18 to 20]:
where
FunOne: Fn(Input) -> Intermediate,
FunTwo: Fn(Intermediate) -> Output,
FunOne is a closure...