docs: def loopUntil(
              self, condition=None, timeout: float = 0) -> Iterator[object]:
          """
          Iterate until condition is met, with optional timeout in seconds.
          The yielded value is that of the condition or False when timed out.
  
          Args:
              condition: Predicate function that is tested after every network
              update.
              timeout: Maximum time in seconds to wait.
                  If 0 then no timeout is used.
          """
          endTime = time.time() + timeout
          while True:
              test = condition and condition()
              if test:
                  yield test
                  return
              elif timeout and time.time() > endTime:
                  yield False
                  return
              else:
                  yield test
              self.waitOnUpdate(endTime - time.time() if timeout else 0)