public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
{
$previousMin = null;
$comparing = false;
return $observable->subscribe(new CallbackObserver(function ($x) use(&$comparing, &$previousMin, $observer) {
if (!$comparing) {
$comparing = true;
$previousMin = $x;
return;
}
try {
$result = call_user_func($this->comparer, $x, $previousMin);
if ($result < 0) {
$previousMin = $x;
}
} catch (\Exception $e) {
$observer->onError($e);
}
}, [$observer, 'onError'], function () use(&$comparing, &$previousMin, $observer) {
if ($comparing) {
$observer->onNext($previousMin);
$observer->onCompleted();
return;
}
$observer->onError(new \Exception("Empty"));
}), $scheduler);
}