I'm almost sure that Haskell has had its "do notation" even before 2007.
And maybe even Scala its "for comprehension".
And maybe even Scala its "for comprehension".
Don Syme, creator of F#, had a nice thread on the roots of async/await, though it doesn't mention do-notation: https://mobile.twitter.com/dsymetweets/status/14074008179179...
I'm still annoyed that most other languages stole async/await... but not the more general monadic/do notation. Instead we get elvis operators, chaining functions, etc.
https://docs.microsoft.com/en-us/dotnet/fsharp/language-refe...
Async/await for example in C# or Rust is different. This translates the program into transition automata/coroutines.