better water

This commit is contained in:
Evgenii Alekseev 2024-07-17 13:20:51 +03:00
parent 2e759aba84
commit a6741073c9

View File

@ -27,6 +27,22 @@ from typing import ParamSpec
Params = ParamSpec("Params")
@dataclass(frozen=True)
class WaiterResult:
took: float
def __float__(self) -> float:
return self.took
class WaiterTimedOut(WaiterResult):
pass
class WaiterFinished(WaiterResult):
pass
@dataclass(frozen=True)
class Waiter:
"""
@ -54,7 +70,7 @@ class Waiter:
since_start: float = time.monotonic() - self.start_time
return self.wait_timeout != 0 and since_start > self.wait_timeout
def wait(self, in_progress: Callable[Params, bool], *args: Params.args, **kwargs: Params.kwargs) -> float:
def wait(self, in_progress: Callable[Params, bool], *args: Params.args, **kwargs: Params.kwargs) -> WaiterResult:
"""
wait until requirements are not met
@ -66,7 +82,9 @@ class Waiter:
Returns:
float: consumed time in seconds
"""
while not self.is_timed_out() and in_progress(*args, **kwargs):
while not (timed_out := self.is_timed_out()) and in_progress(*args, **kwargs):
time.sleep(self.interval)
return time.monotonic() - self.start_time
if timed_out:
return WaiterTimedOut(time.monotonic() - self.start_time)
return WaiterFinished(time.monotonic() - self.start_time)