human
Complete the below
def loop_until(reactor, predicate, steps=None):

    ''''Repeatedly call ``predicate``, until it returns something ``Truthy``.
    :param reactor: The reactor implementation to use to delay.
    :type reactor: ``IReactorTime``.
    :param predicate: Callable returning termination condition.
    :type predicate: 0-argument callable returning a Deferred.
    :param steps: An iterable of delay intervals, measured in seconds.
    If not provided, will default to retrying every 0.1 seconds forever.
    :raise LoopExceeded: If given a finite sequence of steps, and we exhaust
    that sequence waiting for predicate to be truthy.
    :return: A ``Deferred`` firing with the first ``Truthy`` response from
    ``predicate``.'
    '''
 Write me a the Python program you requested?
assistant
#Here is the Python program you requested.
    if (steps is None):
        steps = repeat(0.1)
    steps = iter(steps)
    action = LOOP_UNTIL_ACTION(predicate=predicate)
    d = action.run(DeferredContext, maybeDeferred(action.run, predicate))
    def loop(result):
        if (not result):
            LOOP_UNTIL_ITERATION_MESSAGE(result=result).write()
            try:
                delay = steps.next()
            except StopIteration:
                raise LoopExceeded(predicate, result)
            d = deferLater(reactor, delay, action.run, predicate)
            d.addCallback(partial(action.run, loop))
            return d
        action.addSuccessFields(result=result)
        return result
    d.addCallback(loop)
    return d.addActionFinish()