Files
Solax/myenv/lib/python3.12/site-packages/reactivex/observable/concat.py
2024-09-13 09:46:28 +02:00

63 lines
1.8 KiB
Python

from typing import Any, Iterable, Optional, TypeVar
from reactivex import Observable, abc
from reactivex.disposable import (
CompositeDisposable,
Disposable,
SerialDisposable,
SingleAssignmentDisposable,
)
from reactivex.scheduler import CurrentThreadScheduler
_T = TypeVar("_T")
def concat_with_iterable_(sources: Iterable[Observable[_T]]) -> Observable[_T]:
def subscribe(
observer: abc.ObserverBase[_T], scheduler_: Optional[abc.SchedulerBase] = None
) -> abc.DisposableBase:
_scheduler = scheduler_ or CurrentThreadScheduler.singleton()
sources_ = iter(sources)
subscription = SerialDisposable()
cancelable = SerialDisposable()
is_disposed = False
def action(scheduler: abc.SchedulerBase, state: Any = None) -> None:
nonlocal is_disposed
if is_disposed:
return
def on_completed() -> None:
cancelable.disposable = _scheduler.schedule(action)
try:
current = next(sources_)
except StopIteration:
observer.on_completed()
except Exception as ex: # pylint: disable=broad-except
observer.on_error(ex)
else:
d = SingleAssignmentDisposable()
subscription.disposable = d
d.disposable = current.subscribe(
observer.on_next,
observer.on_error,
on_completed,
scheduler=scheduler_,
)
cancelable.disposable = _scheduler.schedule(action)
def dispose() -> None:
nonlocal is_disposed
is_disposed = True
return CompositeDisposable(subscription, cancelable, Disposable(dispose))
return Observable(subscribe)
__all__ = ["concat_with_iterable_"]