  Coroutine, as a powerful programming construct, is widely used in
asynchronous applications to replace thread-based programming or the callback
hell. Using coroutines makes code more readable and maintainable, for its
ability to transfer control while keeping the literal scope. However, reasoning
about coroutine behavior can be challenging without proper typing. We propose a
type notation and calculus for composing asymmetric, first-class, stackless
coroutines. Given the types of a list of coroutines, we can compute a composed
type matching the collective behavior of the coroutines, so that the input and
output can be type-checked by a type system. Our coroutine types can model the
data received by or yielded from a coroutine, which be of coroutine types as
well. On top of our type calculus, we discuss its soundness and evaluation
issues, then provide four application scenarios of our coroutine types. Not
only can our types be used in modern programming languages, such as Python, but
also model program behaviors in OCaml and even Prolog.
