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

13 statements  

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

1import inspect 

2from collections.abc import Callable 

3from typing import Any, Concatenate, ParamSpec, TypeVar 

4 

5DataT = TypeVar('DataT') 

6P = ParamSpec('P') 

7R = TypeVar('R') 

8 

9 

10def make_data_last( 

11 f: Callable[Concatenate[DataT, P], R], 

12) -> Callable[Concatenate[DataT, P], R] | Callable[P, Callable[[DataT], R]]: 

13 number_of_positional_params = sum( 

14 1 for x in inspect.signature(f).parameters.values() if x.kind == inspect.Parameter.POSITIONAL_ONLY 

15 ) 

16 

17 def inner(*args: Any, **kwargs: Any) -> R | Callable[[DataT], R]: 

18 if len(args) == number_of_positional_params: 

19 return f(*args, **kwargs) 

20 return lambda data: f(data, *args, **kwargs) 

21 

22 return inner # pyright: ignore[reportReturnType]