# Path: paco/assertions.py
# def assert_iter(**kw):
#     """
#     Asserts if a given values implements a valid iterable interface.
# 
#     Arguments:
#         **kw (mixed): value to check if it is an iterable.
# 
#     Raises:
#         TypeError: if assertion fails.
#     """
#     for name, value in kw.items():
#         if not isiter(value):
#             raise TypeError(
#                 'paco: {} must be an iterable object'.format(name))


import asyncio
from .assertions import assert_iter
    from asyncio import ensure_future
            of seconds to wait before returning. timeout can be an int or
            float. If timeout is not specified or None, there is no limit to
            the wait time.
        *args (mixed): optional variadic argument to pass to coroutine
            function, if provided.

    Raises:
        TypeError: if ``iterable`` argument is not iterable.
        asyncio.TimoutError: if wait timeout is exceeded.

    Returns:
        filtered values (list): ordered list of resultant values.

    Usage::

        async def coro1():
            await asyncio.sleep(2)
            return 1

        async def coro2():
            return 2

        async def coro3():
            await asyncio.sleep(1)
            return 3

        await paco.race([coro1, coro2, coro3])
        # => 2

    """

# Path: paco/assertions.py
# def assert_iter(**kw):
#     """
#     Asserts if a given values implements a valid iterable interface.
# 
#     Arguments:
#         **kw (mixed): value to check if it is an iterable.
# 
#     Raises:
#         TypeError: if assertion fails.
#     """
#     for name, value in kw.items():
#         if not isiter(value):
#             raise TypeError(
#                 'paco: {} must be an iterable object'.format(name))


# Path: paco/race.py
import asyncio
from .assertions import assert_iter
    from asyncio import ensure_future

            of seconds to wait before returning. timeout can be an int or
            float. If timeout is not specified or None, there is no limit to
            the wait time.
        *args (mixed): optional variadic argument to pass to coroutine
            function, if provided.

    Raises:
        TypeError: if ``iterable`` argument is not iterable.
        asyncio.TimoutError: if wait timeout is exceeded.

    Returns:
        filtered values (list): ordered list of resultant values.

    Usage::

        async def coro1():
            await asyncio.sleep(2)
            return 1

        async def coro2():
            return 2

        async def coro3():
            await asyncio.sleep(1)
            return 3

        await paco.race([coro1, coro2, coro3])
        # => 2

    """

    assert_iter(iterable=iterable)