Rust is exploring ideas that allow it to generalise over effects, so you don't need foo and foo_async.
It's an unusual name, and potentially complicates error messages, but it's good problem to examine.
miniblog.
Related Posts
Porting 600KLOC of Closure Compiler JS to typescript: https://www.lucidchart.com/techblog/2017/11/16/converting-600k-lines-to-typescript-in-72-hours/
Although Closure offers a set of static analysis tools, typescript is often stricter! This finds bugs but complicates porting.