That's what I'm saying, you can change the "color" of all these including async, but you still have to do that.
There is no single Monad type from which you can build and chain, you always have to color some calls.
No, you can abstract over "color".
You can implement a trait that lets you call both sync and async functions in the same way. You can with the same code and same syntax, get results of either `Fn()->T` or `Fn()->Future<Output=T>`.
The original article's key point was about async forcing refactoring of all functions in the entire call graph just because a leaf function needed it. This doesn't apply to async or options in Rust, because Rust functions can use these features without exposing that fact to their callers.