public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
{
$values = [];
$callbackObserver = new CallbackObserver(function ($value) use($observer, &$values) {
try {
$key = $this->keySelector ? call_user_func($this->keySelector, $value) : $value;
foreach ($values as $v) {
$comparerEquals = call_user_func($this->comparer, $key, $v);
if ($comparerEquals) {
return;
}
}
$values[] = $key;
$observer->onNext($value);
} catch (\Exception $e) {
return $observer->onError($e);
}
}, [$observer, 'onError'], [$observer, 'onCompleted']);
return $observable->subscribe($callbackObserver, $scheduler);
}