public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
{
$outerDisposable = new SerialDisposable();
$this->disposable->add($outerDisposable);
$subscribe = function () use($outerDisposable, $observable, $observer, $scheduler, &$subscribe) {
$this->sourceComplete = false;
$outerSubscription = $observable->subscribe(new CallbackObserver([$observer, "onNext"], [$observer, "onError"], function () use($observer, &$subscribe, $outerDisposable) {
$this->sourceComplete = true;
if (!$this->repeat) {
$observer->onCompleted();
return;
}
$outerDisposable->setDisposable(new EmptyDisposable());
$this->completions->onNext(++$this->count);
}), $scheduler);
$outerDisposable->setDisposable($outerSubscription);
};
$notifierDisposable = $this->notifier->subscribe(new CallbackObserver(function () use(&$subscribe, $scheduler) {
$subscribe();
}, function ($ex) use($observer) {
$this->repeat = false;
$observer->onError($ex);
}, function () use($observer) {
$this->repeat = false;
if ($this->sourceComplete) {
$observer->onCompleted();
}
}), $scheduler);
$this->disposable->add($notifierDisposable);
try {
$handled = call_user_func($this->notificationHandler, $this->completions->asObservable());
$handledDisposable = $handled->subscribe($this->notifier, $scheduler);
$this->disposable->add($handledDisposable);
} catch (\Exception $e) {
$observer->onError($e);
return new EmptyDisposable();
}
$subscribe();
return $this->disposable;
}