diff --git a/jarvis/utils/__init__.py b/jarvis/utils/__init__.py index d93ba9b..1bd4fbe 100644 --- a/jarvis/utils/__init__.py +++ b/jarvis/utils/__init__.py @@ -1,5 +1,6 @@ """J.A.R.V.I.S. Utility Functions.""" from datetime import datetime +from operator import attrgetter from pkgutil import iter_modules from typing import Any, Callable, Iterable, Optional, TypeVar @@ -109,3 +110,20 @@ def find(predicate: Callable[[T], Any], seq: Iterable[T]) -> Optional[T]: if predicate(element): return element return None + + +def get(iterable: Iterable[T], **attrs: Any) -> Optional[T]: + if len(attrs) == 1: + k, v = attrs.popitem() + pred = attrgetter(k.replace("__", ".")) + for elem in iterable: + if pred(elem) == v: + return elem + return None + + converted = [(attrgetter(attr.replace("__", ".")), value) for attr, value in attrs.items()] + + for elem in iterable: + if all(pred(elem) == value for pred, value in converted): + return elem + return None