1 """Util functions to help filter out similar results."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from datetime
import datetime, timedelta
8 from typing
import Any, overload
12 def ignore_variance[**_P](
13 func: Callable[_P, int], ignored_variance: int
14 ) -> Callable[_P, int]: ...
18 def ignore_variance[**_P](
19 func: Callable[_P, float], ignored_variance: float
20 ) -> Callable[_P, float]: ...
24 def ignore_variance[**_P](
25 func: Callable[_P, datetime], ignored_variance: timedelta
26 ) -> Callable[_P, datetime]: ...
29 def ignore_variance[**_P, _R: (int, float, datetime)](
30 func: Callable[_P, _R], ignored_variance: Any
31 ) -> Callable[_P, _R]:
32 """Wrap a function that returns old result if new result does not vary enough."""
33 last_value: _R |
None =
None
35 @functools.wraps(func)
36 def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R:
39 value = func(*args, **kwargs)
41 if last_value
is not None and abs(value - last_value) < ignored_variance: