Coverage for src / remedapy / difference.py: 100%

14 statements  

« prev     ^ index     » next       coverage.py v7.13.2, created at 2026-02-02 10:52 +0100

1from collections import Counter 

2from collections.abc import Callable, Iterable 

3from typing import TypeVar, overload 

4 

5T = TypeVar('T') 

6 

7 

8@overload 

9def difference( 

10 data: Iterable[T], 

11 other: Iterable[T], 

12 /, 

13) -> Iterable[T]: ... 

14 

15 

16@overload 

17def difference( 

18 other: Iterable[T], 

19 /, 

20) -> Callable[[Iterable[T]], Iterable[T]]: ... 

21 

22 

23def difference_helper( 

24 data: Iterable[T], 

25 other: Iterable[T], 

26 /, 

27) -> Iterable[T]: 

28 to_omit = Counter(other) 

29 for i in data: 

30 if to_omit[i] > 0: 

31 to_omit[i] -= 1 

32 else: 

33 yield i 

34 

35 

36def difference( 

37 data: Iterable[T], 

38 other: Iterable[T] | None = None, 

39 /, 

40) -> Iterable[T] | Callable[[Iterable[T]], Iterable[T]]: 

41 if other is None: 

42 return lambda x: difference_helper(x, data) # pyright: ignore[reportUnknownVariableType, reportUnknownArgumentType, reportUnknownLambdaType] 

43 return difference_helper(data, other)