47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
from typing import Callable, Optional, TypeVar
|
|
|
|
from reactivex import ConnectableObservable, Observable, abc
|
|
from reactivex.disposable import Disposable
|
|
|
|
_T = TypeVar("_T")
|
|
|
|
|
|
def ref_count_() -> Callable[[ConnectableObservable[_T]], Observable[_T]]:
|
|
"""Returns an observable sequence that stays connected to the
|
|
source as long as there is at least one subscription to the
|
|
observable sequence.
|
|
"""
|
|
|
|
connectable_subscription: Optional[abc.DisposableBase] = None
|
|
count = 0
|
|
|
|
def ref_count(source: ConnectableObservable[_T]) -> Observable[_T]:
|
|
def subscribe(
|
|
observer: abc.ObserverBase[_T],
|
|
scheduler: Optional[abc.SchedulerBase] = None,
|
|
) -> abc.DisposableBase:
|
|
nonlocal connectable_subscription, count
|
|
|
|
count += 1
|
|
should_connect = count == 1
|
|
subscription = source.subscribe(observer, scheduler=scheduler)
|
|
if should_connect:
|
|
connectable_subscription = source.connect(scheduler)
|
|
|
|
def dispose() -> None:
|
|
nonlocal connectable_subscription, count
|
|
|
|
subscription.dispose()
|
|
count -= 1
|
|
if not count and connectable_subscription:
|
|
connectable_subscription.dispose()
|
|
|
|
return Disposable(dispose)
|
|
|
|
return Observable(subscribe)
|
|
|
|
return ref_count
|
|
|
|
|
|
__all__ = ["ref_count_"]
|