2023-04-15 16:17:31 +02:00
|
|
|
from typing import Callable
|
|
|
|
|
|
|
|
from cpl_core.type import T
|
2023-04-15 19:46:05 +02:00
|
|
|
from cpl_reactive_extensions.abc.observer import Observer
|
2023-04-16 21:46:17 +02:00
|
|
|
from cpl_reactive_extensions.internal.subscription import Subscription
|
2023-04-15 21:41:49 +02:00
|
|
|
from cpl_reactive_extensions.type import ObserverOrCallable
|
2023-04-15 16:17:31 +02:00
|
|
|
|
|
|
|
|
2023-04-15 19:46:05 +02:00
|
|
|
class Subscriber(Subscription, Observer):
|
2023-04-15 21:41:49 +02:00
|
|
|
def __init__(
|
|
|
|
self, on_next_or_observer: ObserverOrCallable, on_error: Callable = None, on_complete: Callable = None
|
|
|
|
):
|
2023-04-16 03:06:55 +02:00
|
|
|
self.is_stopped = False
|
2023-04-15 19:46:05 +02:00
|
|
|
Subscription.__init__(self)
|
2023-04-15 21:41:49 +02:00
|
|
|
if isinstance(on_next_or_observer, Observer):
|
|
|
|
self._on_next = on_next_or_observer.next
|
|
|
|
self._on_error = on_next_or_observer.error
|
|
|
|
self._on_complete = on_next_or_observer.complete
|
|
|
|
else:
|
|
|
|
self._on_next = on_next_or_observer
|
|
|
|
self._on_error = on_error
|
|
|
|
self._on_complete = on_complete
|
2023-04-15 18:59:24 +02:00
|
|
|
|
2023-04-16 15:48:33 +02:00
|
|
|
def _next(self, value: T):
|
|
|
|
self._on_next(value)
|
|
|
|
|
2023-04-15 16:17:31 +02:00
|
|
|
def next(self, value: T):
|
2023-04-16 03:06:55 +02:00
|
|
|
if self.is_stopped:
|
2023-04-15 19:14:36 +02:00
|
|
|
raise Exception("Observer is closed")
|
|
|
|
|
2023-04-16 15:48:33 +02:00
|
|
|
self._next(value)
|
|
|
|
|
|
|
|
def _error(self, ex: Exception):
|
|
|
|
try:
|
|
|
|
self._on_error(ex)
|
2023-04-16 16:15:55 +02:00
|
|
|
except TypeError:
|
|
|
|
pass
|
2023-04-16 15:48:33 +02:00
|
|
|
finally:
|
|
|
|
self.unsubscribe()
|
2023-04-15 16:17:31 +02:00
|
|
|
|
|
|
|
def error(self, ex: Exception):
|
2023-04-16 15:48:33 +02:00
|
|
|
self._error(ex)
|
|
|
|
|
|
|
|
def _complete(self):
|
|
|
|
try:
|
|
|
|
self._on_complete()
|
2023-04-16 16:15:55 +02:00
|
|
|
except TypeError:
|
|
|
|
pass
|
2023-04-16 15:48:33 +02:00
|
|
|
finally:
|
|
|
|
self.unsubscribe()
|
2023-04-15 16:17:31 +02:00
|
|
|
|
|
|
|
def complete(self):
|
2023-04-16 03:06:55 +02:00
|
|
|
if self.is_stopped:
|
2023-04-15 16:17:31 +02:00
|
|
|
return
|
|
|
|
|
2023-04-16 03:06:55 +02:00
|
|
|
self.is_stopped = True
|
2023-04-16 15:48:33 +02:00
|
|
|
self._complete()
|
2023-04-15 21:41:49 +02:00
|
|
|
|
|
|
|
def unsubscribe(self):
|
|
|
|
if self._closed:
|
|
|
|
return
|
|
|
|
|
2023-04-16 15:48:33 +02:00
|
|
|
self.is_stopped = True
|
|
|
|
Subscription.unsubscribe(self)
|
2023-04-16 03:06:55 +02:00
|
|
|
self._on_next = None
|