diff --git a/server/entertainment_decider/common/__init__.py b/server/entertainment_decider/common/__init__.py index 0699a53..b3d07e6 100644 --- a/server/entertainment_decider/common/__init__.py +++ b/server/entertainment_decider/common/__init__.py @@ -8,6 +8,9 @@ from ._itertools import ( iter_lookahead, limit_iter, ) +from ._search import ( + search_source_by_keys, +) from ._setting_handler import ( update_bool_value, ) @@ -26,6 +29,7 @@ __all__ = [ "fix_iter", "iter_lookahead", "limit_iter", + "search_source_by_keys", "to_just_number", "trim", "update_bool_value", diff --git a/server/entertainment_decider/common/_search.py b/server/entertainment_decider/common/_search.py new file mode 100644 index 0000000..60d4f2b --- /dev/null +++ b/server/entertainment_decider/common/_search.py @@ -0,0 +1,24 @@ +from typing import ( + Callable, + Optional, + Sequence, + TypeVar, +) + + +T = TypeVar("T") +K = TypeVar("K") + + +def search_source_by_keys( + source: Callable[[K], Optional[T]], + all_keys: Sequence[K], +) -> Optional[T]: + """ + tries in and returns first result `!= None`, otherwise `None` + """ + for key in all_keys: + item = source(key) + if item is not None: + return item + return None