Summary
Coroutines show a high potential to transform the way we think about asynchronous code and execution. In this chapter, we covered how to write coroutines and how to use coroutine contexts and channels. We also took a comprehensive look at how to deal with asynchronous shared mutable state.
In our next chapter, we'll learn about functional collections and their operations.