Files
onepilot/frogpilot/third_party/reactivex/operators/_reduce.py
T
firestar5683 d0e1db6766 StarPilot
2026-03-22 03:15:05 -05:00

52 lines
1.5 KiB
Python

from typing import Any, Callable, Type, TypeVar, Union, cast
from reactivex import Observable, compose
from reactivex import operators as ops
from reactivex.internal.utils import NotSet
from reactivex.typing import Accumulator
_T = TypeVar("_T")
_TState = TypeVar("_TState")
def reduce_(
accumulator: Accumulator[_TState, _T], seed: Union[_TState, Type[NotSet]] = NotSet
) -> Callable[[Observable[_T]], Observable[Any]]:
"""Applies an accumulator function over an observable sequence,
returning the result of the aggregation as a single element in the
result sequence. The specified seed value is used as the initial
accumulator value.
For aggregation behavior with incremental intermediate results, see
`scan()`.
Examples:
>>> res = reduce(lambda acc, x: acc + x)
>>> res = reduce(lambda acc, x: acc + x, 0)
Args:
accumulator: An accumulator function to be
invoked on each element.
seed: Optional initial accumulator value.
Returns:
An operator function that takes an observable source and returns
an observable sequence containing a single element with the
final accumulator value.
"""
if seed is not NotSet:
seed_: _TState = cast(_TState, seed)
scanner = ops.scan(accumulator, seed=seed_)
return compose(
scanner,
ops.last_or_default(default_value=seed_),
)
return compose(
ops.scan(cast(Accumulator[_T, _T], accumulator)),
ops.last(),
)
__all__ = ["reduce_"]