sh_cpl/src/cpl_reactive_extensions/operators/take.py
2023-04-16 15:48:33 +02:00

29 lines
745 B
Python

from cpl_core.type import T
from cpl_reactive_extensions import Subscriber, Observable
from cpl_reactive_extensions.operator_subscriber import OperatorSubscriber
from cpl_reactive_extensions.utils import operate
def take(count: int):
if count <= 0:
return Observable()
def init(source: Observable, subscriber: Subscriber):
seen = 0
def on_next(value: T):
nonlocal seen
if seen + 1 <= count:
seen += 1
subscriber.next(value)
if count <= seen:
subscriber.complete()
else:
sub.unsubscribe()
sub = source.subscribe(OperatorSubscriber(subscriber, on_next))
return operate(init)