Skip to content

Commit 14332c5

Browse files
committed
feat: add find helper methods
1 parent 0c3fa28 commit 14332c5

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/py_app_dev/core/find.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Utility functions for working with collections and type filtering."""
2+
3+
from typing import Any, Callable, Optional, TypeVar
4+
5+
T = TypeVar("T")
6+
7+
8+
def find_elements_of_type(elements: list[Any], element_type: type[T]) -> list[T]:
9+
"""Find all elements of a specific type."""
10+
return [elem for elem in elements if isinstance(elem, element_type)]
11+
12+
13+
def filter_elements(elements: list[T], filter_fn: Callable[[T], bool]) -> list[T]:
14+
"""Filter elements based on a predicate function."""
15+
return [elem for elem in elements if filter_fn(elem)]
16+
17+
18+
def find_first_element_of_type(elements: list[Any], element_type: type[T], filter_fn: Optional[Callable[[T], bool]] = None) -> Optional[T]:
19+
"""Find the first element of a specific type, optionally matching a filter condition."""
20+
filtered_elements = find_elements_of_type(elements, element_type)
21+
if filter_fn:
22+
filtered_elements = filter_elements(filtered_elements, filter_fn)
23+
return filtered_elements[0] if filtered_elements else None

tests/test_find.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from dataclasses import dataclass
2+
3+
from py_app_dev.core.find import filter_elements, find_elements_of_type, find_first_element_of_type
4+
5+
6+
@dataclass
7+
class Person:
8+
name: str
9+
age: int
10+
11+
12+
def test_find_elements_of_type():
13+
elements = [1, "hello", 2, "world", 3.14]
14+
15+
strings = find_elements_of_type(elements, str)
16+
assert strings == ["hello", "world"]
17+
18+
integers = find_elements_of_type(elements, int)
19+
assert integers == [1, 2]
20+
21+
22+
def test_filter_elements():
23+
numbers = [1, 2, 3, 4, 5]
24+
evens = filter_elements(numbers, lambda x: x % 2 == 0)
25+
assert evens == [2, 4]
26+
27+
28+
def test_find_first_element_of_type():
29+
people = [Person("Alice", 30), Person("Bob", 25)]
30+
elements = [1, "hello", people[0], 2, people[1]]
31+
32+
first_person = find_first_element_of_type(elements, Person)
33+
assert first_person == people[0]
34+
35+
young_person = find_first_element_of_type(elements, Person, lambda p: p.age < 30)
36+
assert young_person == people[1]
37+
38+
old_person = find_first_element_of_type(elements, Person, lambda p: p.age > 50)
39+
assert old_person is None

0 commit comments

Comments
 (0)