# Wait until $condition is true, retrying every $intervalMs milliseconds.
# Print a '.' character every second as a progress indicator.
waitUntil() {
    condition=$1
    intervalMs=$2

    lastDotTime=$(getTimeMs)
    while ! { t0=$(getTimeMs); eval "$condition"; }; do
        now=$(getTimeMs)
        if ((now - lastDotTime >= 1000)); then
            printf .
            lastDotTime=$now
        fi
        toSleep=$((t0 + intervalMs - now))
        if ((toSleep > 0)); then
            sleep $((toSleep / 1000)).$((toSleep % 1000));
        fi
    done
}

getTimeMs() { date +%s%3N; }