IMHO
1. every suspend point split the original code into two parts of function (the previous part and the rest part), and compiler may optimize and implement this in a state-machine
2. since a suspend function is composed of two or more split function, you can decide whether to call the rest function or just return on the suspend point ,
3. you can call the rest function immediately there's no significant difference from the not-split one
4. you can also just return and only call the rest function when some condition meets (i.e network request done)
5. compared to the original one, now you have a chance to decide to call the rest function, that's the point coroutine is, but it still looks like a aotimic function in literal code (at lest in source code level)