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

1from collections.abc import Callable, Iterable, Sequence 

2from itertools import chain, repeat 

3 

4from toolz.itertoolz import sliding_window 

5 

6from .seq import iter_to_seq 

7 

8 

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 ) 

21 

22 return sliding_window(n, _iter) 

23 

24 

25def filter_by_others[T](func: Callable[[T, T], bool], _iter: Iterable[T]) -> Iterable[T]: 

26 seq: Sequence[T] = iter_to_seq(_iter) 

27 

28 filtered_ids: set[int] = set(range(len(seq))) 

29 

30 for i, x in enumerate(seq): 

31 remove: bool = False 

32 for j in filtered_ids: 

33 if i == j: 

34 continue 

35 

36 if not func(x, seq[j]): 

37 remove = True 

38 break 

39 

40 if remove: 

41 filtered_ids.remove(i) 

42 

43 for i in filtered_ids: 

44 yield seq[i]