diff --git a/jaraco/itertools.py b/jaraco/itertools.py index 8b7b6ad..3ea72f5 100644 --- a/jaraco/itertools.py +++ b/jaraco/itertools.py @@ -1242,3 +1242,17 @@ def check(*window): match_indexes = more_itertools.locate(seq, check, window_size=len(cand)) return next(match_indexes, None) + + +def summarize(items: Iterable, **bin_checks): + """ + >>> is_str = lambda item: isinstance(item, str) + >>> is_int = lambda item: isinstance(item, int) + >>> summarize(['a', 'b', 20], strings=is_str, ints=is_int) + {'strings': 2, 'ints': 1} + """ + counters = {name: itertools.count() for name in bin_checks} + for item, check in itertools.product(items, bin_checks): + if bin_checks[check](item): + next(counters[check]) + return {name: next(counter) for name, counter in counters.items()} diff --git a/newsfragments/+dd17dc06.feature.rst b/newsfragments/+dd17dc06.feature.rst new file mode 100644 index 0000000..27842eb --- /dev/null +++ b/newsfragments/+dd17dc06.feature.rst @@ -0,0 +1 @@ +Added ``summarize``.