<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def whilst(coro, coro_test, assert_coro=None, *args, **kw):
 """ Repeatedly call `coro` coroutine function while `coro_test` returns `True`. This function is the inverse of `paco.until()`. This function is a coroutine. Arguments: coro (coroutinefunction):
 coroutine function to execute. coro_test (coroutinefunction):
 coroutine function to test. assert_coro (coroutinefunction):
 optional assertion coroutine used to determine if the test passed or not. *args (mixed):
 optional variadic arguments to pass to `coro` function. Raises: TypeError: if input arguments are invalid. Returns: list: result values returned by `coro`. Usage:: calls = 0 async def task():
 nonlocal calls calls += 1 return calls async def calls_lt_4():
 return calls > 4 await paco.until(task, calls_lt_4) # => [1, 2, 3, 4, 5] """

    assert_corofunction(coro=coro, coro_test=coro_test)

    # Store yielded values by coroutine
    results = []

    # Set assertion coroutine
    assert_coro = assert_coro or assert_true

    # Execute coroutine until a certain
    while (yield from assert_coro((yield from coro_test()))):
        results.append((yield from coro(*args, **kw)))

    return results