def coroutine(func):
    """
    A decorator to create our coroutines from generator definitions.

    Calling a generator function does not start running the function!

    Instead, it returns a generator object. All co-routines must be "primed"
    by calling ``next`` or ``send` to run up until the first ``yield``.

    Args:
        func: A function with a yield
    """

    def start(*args, **kwargs):
        cr = func(*args, **kwargs)
        next(cr)
        return cr

    return start