"In depth" is a strong word. The challenge with coroutines is that there are a lot of moving parts, so I tried to break them down into what they do and where to use them. I look at builders and dispatchers, and then how to use them.
Here are the individual recipes:
Coroutines and Structured Concurrency
* 13.1 Choosing Coroutine Builders
* 13.2 Replacing async/await with withContext
* 13.3 Working with Dispatchers
* 13.4 Running Coroutines on a JavaThread Pool
* 13.5 Cancelling Coroutines
* 13.6 Debugging Coroutines
This is part of an annotated table of contents I added to my blog in my blog.