from time import sleep
from typing import Callable
from typing import Optional


def wait_until_true(
    readiness_checker: Callable[[], bool],
    *,
    interval: float = 0.1,
    timeout_sec: Optional[float] = None
):
    elapsed = 0.0
    if timeout_sec is None:
        timeout_sec = 10e16

    while (not readiness_checker()) and elapsed < timeout_sec:
        sleep(interval)
        elapsed += interval
    if elapsed > timeout_sec:
        raise TimeoutError()