44
55from collections .abc import Iterable
66from functools import reduce
7- from typing import Callable , TypeVar , Union , overload
7+ from typing import Callable , TypeVar , Union , cast , overload
88
99_T = TypeVar ("_T" )
1010_U = TypeVar ("_U" )
@@ -30,10 +30,42 @@ def json_iter_leaves(value: JSONTree[_T]) -> Iterable[_T]:
3030 yield value
3131
3232
33+ @overload
34+ def json_map_leaves (
35+ func : Callable [[_T ], _U ],
36+ value : Union [_T , dict [str , _T ]],
37+ ) -> Union [_U , dict [str , _U ]]:
38+ ...
39+
40+
41+ @overload
42+ def json_map_leaves (
43+ func : Callable [[_T ], _U ],
44+ value : Union [_T , list [_T ]],
45+ ) -> Union [_U , list [_U ]]:
46+ ...
47+
48+
49+ @overload
50+ def json_map_leaves (
51+ func : Callable [[_T ], _U ],
52+ value : Union [_T , tuple [_T , ...]],
53+ ) -> Union [_U , tuple [_U , ...]]:
54+ ...
55+
56+
57+ @overload
3358def json_map_leaves (
3459 func : Callable [[_T ], _U ],
3560 value : JSONTree [_T ],
3661) -> JSONTree [_U ]:
62+ ...
63+
64+
65+ def json_map_leaves (
66+ func : Callable [[_T ], _U ],
67+ value : Union [dict [str , _T ], list [_T ], tuple [_T , ...], JSONTree [_T ]],
68+ ) -> Union [dict [str , _U ], list [_U ], tuple [_U , ...], JSONTree [_U ]]:
3769 """Apply a function to each leaf in a nested JSON structure."""
3870 if isinstance (value , dict ):
3971 return {k : json_map_leaves (func , v ) for k , v in value .items ()}
@@ -45,6 +77,33 @@ def json_map_leaves(
4577 return func (value )
4678
4779
80+ @overload
81+ def json_reduce_leaves (
82+ func : Callable [[_T , _T ], _T ],
83+ value : Union [_T , dict [str , _T ]],
84+ / ,
85+ ) -> _T :
86+ ...
87+
88+
89+ @overload
90+ def json_reduce_leaves (
91+ func : Callable [[_T , _T ], _T ],
92+ value : Union [_T , list [_T ]],
93+ / ,
94+ ) -> _T :
95+ ...
96+
97+
98+ @overload
99+ def json_reduce_leaves (
100+ func : Callable [[_T , _T ], _T ],
101+ value : Union [_T , tuple [_T , ...]],
102+ / ,
103+ ) -> _T :
104+ ...
105+
106+
48107@overload
49108def json_reduce_leaves (
50109 func : Callable [[_T , _T ], _T ],
@@ -65,10 +124,10 @@ def json_reduce_leaves(
65124
66125
67126def json_reduce_leaves (
68- func : Callable [..., Union [_T , _U ]],
69- value : JSONTree [_T ],
70- initial : _U = ..., # type: ignore[assignment]
71- / ,
127+ func : Callable [..., Union [_T , _U ]],
128+ value : Union [ dict [ str , _T ], list [ _T ], tuple [ _T , ...], JSONTree [_T ] ],
129+ initial : _U = cast ( _U , ...) , # noqa: B008
130+ / ,
72131) -> Union [_T , _U ]:
73132 """
74133 Apply a function of two arguments cumulatively to each leaf in a
0 commit comments