Coverage for src/extratools_core/itertools.py: 0%
23 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-05 19:38 -0700
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-05 19:38 -0700
1from collections.abc import Callable, Iterable, Sequence
2from itertools import chain, repeat
4from toolz.itertoolz import sliding_window
6from .seq import iter_to_seq
9def iter_to_grams[T](
10 _iter: Iterable[T],
11 *,
12 n: int,
13 pad: T | None = None,
14) -> Iterable[Sequence[T]]:
15 if pad is not None:
16 _iter = chain(
17 repeat(pad, n - 1),
18 _iter,
19 repeat(pad, n - 1),
20 )
22 return sliding_window(n, _iter)
25def filter_by_others[T](func: Callable[[T, T], bool], _iter: Iterable[T]) -> Iterable[T]:
26 seq: Sequence[T] = iter_to_seq(_iter)
28 filtered_ids: set[int] = set(range(len(seq)))
30 for i, x in enumerate(seq):
31 remove: bool = False
32 for j in filtered_ids:
33 if i == j:
34 continue
36 if not func(x, seq[j]):
37 remove = True
38 break
40 if remove:
41 filtered_ids.remove(i)
43 for i in filtered_ids:
44 yield seq[i]