public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
{
$isDisposed = false;
$disposable = new CompositeDisposable();
$onError = function (\Exception $e) use(&$isDisposed, $observer, $observable, $scheduler, $disposable) {
if ($isDisposed) {
return;
}
try {
/** @var Observable $result */
$result = call_user_func($this->errorSelector, $e, $observable);
$subscription = $result->subscribe($observer, $scheduler);
$disposable->add($subscription);
} catch (\Exception $e) {
$observer->onError($e);
}
};
$callbackObserver = new CallbackObserver([$observer, "onNext"], $onError, [$observer, "onCompleted"]);
$subscription = $observable->subscribe($callbackObserver, $scheduler);
$disposable->add($subscription);
$disposable->add(new CallbackDisposable(function () use(&$isDisposed) {
$isDisposed = true;
}));
return $disposable;
}