| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- """
- Python polyfills for functools
- """
- import functools
- from collections.abc import Callable, Iterable
- from typing import TypeVar
- from ..decorators import substitute_in_graph
- __all__ = ["reduce"]
- _T = TypeVar("_T")
- _U = TypeVar("_U")
- _initial_missing = object()
- # Reference: https://docs.python.org/3/library/functools.html#functools.reduce
- @substitute_in_graph(functools.reduce)
- def reduce(
- function: Callable[[_U, _T], _U],
- iterable: Iterable[_T],
- initial: _U = _initial_missing, # type: ignore[assignment]
- /,
- ) -> _U:
- it = iter(iterable)
- value: _U
- if initial is _initial_missing:
- try:
- value = next(it) # type: ignore[assignment]
- except StopIteration:
- raise TypeError(
- "reduce() of empty iterable with no initial value",
- ) from None
- else:
- value = initial
- for element in it:
- value = function(value, element)
- return value
|