Function composition
We have seen how we can extract a function value from an existing top-level or extension function. The logical next step would be functionality that allows us to combine multiple functions together in a concise way: function composition.
Unlike many other languages, Kotlin does not have any built-in support for function composition. However, it is very easy to add our own using the facilities we have seen so far for manipulation of functions.
We can start by defining a compose function that would accept two input functions, returning a new function that will invoke them in turn when applied. Of course, the output type from the first function must match up with the input type of the second:
fun <A, B, C> compose(fn1: (A) -> B, fn2: (B) -> C): (A) -> C = { a -> val b = fn1(a) val c = fn2(b) c }
This example has been written in a fairly verbose way, assigning each step to its own variable, but this is...