70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
from datetime import datetime
|
|
from typing import Any, Callable, Optional, TypeVar
|
|
|
|
from reactivex import Observable, abc, typing
|
|
from reactivex.disposable import CompositeDisposable
|
|
from reactivex.scheduler import TimeoutScheduler
|
|
|
|
_T = TypeVar("_T")
|
|
|
|
|
|
def skip_until_with_time_(
|
|
start_time: typing.AbsoluteOrRelativeTime,
|
|
scheduler: Optional[abc.SchedulerBase] = None,
|
|
) -> Callable[[Observable[_T]], Observable[_T]]:
|
|
def skip_until_with_time(source: Observable[_T]) -> Observable[_T]:
|
|
"""Skips elements from the observable source sequence until the
|
|
specified start time.
|
|
|
|
Errors produced by the source sequence are always forwarded to
|
|
the result sequence, even if the error occurs before the start
|
|
time.
|
|
|
|
Examples:
|
|
>>> res = source.skip_until_with_time(datetime)
|
|
>>> res = source.skip_until_with_time(5.0)
|
|
|
|
Args:
|
|
start_time: Time to start taking elements from the source
|
|
sequence. If this value is less than or equal to
|
|
`datetime.utcnow`, no elements will be skipped.
|
|
|
|
Returns:
|
|
An observable sequence with the elements skipped until the
|
|
specified start time.
|
|
"""
|
|
|
|
if isinstance(start_time, datetime):
|
|
scheduler_method = "schedule_absolute"
|
|
else:
|
|
scheduler_method = "schedule_relative"
|
|
|
|
def subscribe(
|
|
observer: abc.ObserverBase[_T],
|
|
scheduler_: Optional[abc.SchedulerBase] = None,
|
|
):
|
|
_scheduler = scheduler or scheduler_ or TimeoutScheduler.singleton()
|
|
|
|
open = [False]
|
|
|
|
def on_next(x: _T) -> None:
|
|
if open[0]:
|
|
observer.on_next(x)
|
|
|
|
subscription = source.subscribe(
|
|
on_next, observer.on_error, observer.on_completed, scheduler=scheduler_
|
|
)
|
|
|
|
def action(scheduler: abc.SchedulerBase, state: Any):
|
|
open[0] = True
|
|
|
|
disp = getattr(_scheduler, scheduler_method)(start_time, action)
|
|
return CompositeDisposable(disp, subscription)
|
|
|
|
return Observable(subscribe)
|
|
|
|
return skip_until_with_time
|
|
|
|
|
|
__all__ = ["skip_until_with_time_"]
|