From 61a625753441590f8b1c7752d45197d64375d9e8 Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Sun, 25 Jun 2023 17:41:23 +0200 Subject: [PATCH] Add common.search_source_by_keys method --- .../entertainment_decider/common/__init__.py | 4 ++++ .../entertainment_decider/common/_search.py | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 server/entertainment_decider/common/_search.py 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