/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $hasValue = false; $hasAccumulation = false; $accumulation = $this->seed; $hasSeed = $this->seed !== null; $cbObserver = new CallbackObserver(function ($x) use($observer, &$hasAccumulation, &$accumulation, &$hasSeed, &$hasValue) { $hasValue = true; if ($hasAccumulation) { $accumulation = call_user_func($this->tryCatch($this->accumulator), $accumulation, $x); } else { $accumulation = $hasSeed ? call_user_func($this->tryCatch($this->accumulator), $this->seed, $x) : $x; $hasAccumulation = true; } if ($accumulation instanceof \Exception) { $observer->onError($accumulation); return; } $observer->onNext($accumulation); }, [$observer, 'onError'], function () use($observer, &$hasValue, &$hasSeed) { if (!$hasValue && $hasSeed) { $observer->onNext($this->seed); } $observer->onCompleted(); }); return $observable->subscribe($cbObserver, $scheduler); }
public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $singleDisposable = new SingleAssignmentDisposable(); $disposable = new CompositeDisposable(); $disposable->add($singleDisposable); $callbackObserver = new CallbackObserver(function (Observable $x) use($disposable, $scheduler, $observer) { if ($this->hasCurrent) { return; } $this->hasCurrent = true; $inner = new SingleAssignmentDisposable(); $disposable->add($inner); $innerSub = $x->subscribe(new CallbackObserver([$observer, "onNext"], [$observer, "onError"], function () use($disposable, $inner, $observer) { $disposable->remove($inner); $this->hasCurrent = false; if ($this->isStopped && $disposable->count() === 1) { $observer->onCompleted(); } }), $scheduler); $inner->setDisposable($innerSub); }, [$observer, 'onError'], function () use($disposable, $observer) { $this->isStopped = true; if (!$this->hasCurrent && $disposable->count() === 1) { $observer->onCompleted(); } }); $singleDisposable->setDisposable($observable->subscribe($callbackObserver, $scheduler)); return $disposable; }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $isOpen = false; /** @var DisposableInterface $otherDisposable */ $otherDisposable = $this->other->subscribe(new CallbackObserver(function ($x) use(&$isOpen, &$otherDisposable) { $isOpen = true; $otherDisposable->dispose(); }, function ($e) use($observer) { $observer->onError($e); }, function () use(&$otherDisposable) { $otherDisposable->dispose(); })); $sourceDisposable = $observable->subscribe(new CallbackObserver(function ($x) use($observer, &$isOpen) { if ($isOpen) { $observer->onNext($x); } }, function ($e) use($observer) { $observer->onError($e); }, function () use($observer, &$isOpen) { if ($isOpen) { $observer->onCompleted(); } })); return new CompositeDisposable([$otherDisposable, $sourceDisposable]); }
/** * @param ObserverInterface $observer * @param SchedulerInterface|null $scheduler * @return \Rx\Disposable\CompositeDisposable|\Rx\DisposableInterface */ public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { $scheduler = $scheduler ?: new ImmediateScheduler(); $key = 0; return $scheduler->scheduleRecursive(function ($reschedule) use(&$observer, &$key) { try { //HHVM requires you to call next() before current() if (defined('HHVM_VERSION')) { $this->items->next(); $key = $this->items->key(); } if (null === $key) { $observer->onCompleted(); return; } $current = $this->items->current(); $observer->onNext($current); if (!defined('HHVM_VERSION')) { $this->items->next(); $key = $this->items->key(); } $reschedule(); } catch (\Exception $e) { $observer->onError($e); } }); }
public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { $scheduler = $scheduler ?: new ImmediateScheduler(); return $scheduler->schedule(function () use($observer) { $observer->onCompleted(); }); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $onNext = function ($innerSource) use($observer, $scheduler) { $innerDisposable = new SingleAssignmentDisposable(); $id = ++$this->latest; $this->hasLatest = true; $this->innerSubscription->setDisposable($innerDisposable); $innerCallbackObserver = new CallbackObserver(function ($x) use($id, $observer) { if ($this->latest === $id) { $observer->onNext($x); } }, function ($e) use($id, $observer) { if ($this->latest === $id) { $observer->onError($e); } }, function () use($id, $observer) { if ($this->latest === $id) { $this->hasLatest = false; if ($this->isStopped) { $observer->onCompleted(); } } }); $innerSubscription = $innerSource->subscribe($innerCallbackObserver, $scheduler); $innerDisposable->setDisposable($innerSubscription); }; $callbackObserver = new CallbackObserver($onNext, [$observer, 'onError'], function () use($observer) { $this->isStopped = true; if (!$this->hasLatest) { $observer->onCompleted(); } }); $subscription = $observable->subscribe($callbackObserver, $scheduler); return new BinaryDisposable($subscription, $this->innerSubscription); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { return $observable->subscribe(new CallbackObserver(function ($data) use($observer) { while (strlen($data) > 0) { $frame = $this->frame; $frame->addBuffer($data); $data = ""; if ($frame->isCoalesced()) { $result = $this->validator->validateFrame($frame, $this->previousFrame); if (0 !== $result) { $observer->onError(new WebsocketErrorException($result)); } $data = $frame->extractOverflow(); $frame->unMaskPayload(); $observer->onNext($frame); if ($frame->getOpcode() < 3) { $this->previousFrame = $this->frame; if ($frame->isFinal()) { $this->previousFrame = null; } } $this->frame = new Frame(); } } }, [$observer, 'onError'], [$observer, 'onCompleted'])); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $previousMax = null; $comparing = false; return $observable->subscribe(new CallbackObserver(function ($x) use(&$comparing, &$previousMax, $observer) { if (!$comparing) { $comparing = true; $previousMax = $x; return; } try { $result = call_user_func($this->comparer, $x, $previousMax); if ($result > 0) { $previousMax = $x; } } catch (\Exception $e) { $observer->onError($e); } }, [$observer, 'onError'], function () use(&$comparing, &$previousMax, $observer) { if ($comparing) { $observer->onNext($previousMax); $observer->onCompleted(); return; } $observer->onError(new \Exception("Empty")); }), $scheduler); }
public function subscribe(\Rx\ObserverInterface $observer, $scheduler = null) { return $scheduler->scheduleRecursive(function ($reschedule) use($observer) { $observer->onNext($this->value); $reschedule(); }); }
public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $hasCurrentKey = false; $currentKey = null; $cbObserver = new CallbackObserver(function ($value) use($observer, &$hasCurrentKey, &$currentKey) { $key = $value; if ($this->keySelector) { try { $key = call_user_func($this->keySelector, $value); } catch (\Exception $e) { return $observer->onError($e); } } $comparerEquals = null; if ($hasCurrentKey) { try { $comparerEquals = call_user_func($this->comparer, $currentKey, $key); } catch (\Exception $e) { return $observer->onError($e); } } if (!$hasCurrentKey || !$comparerEquals) { $hasCurrentKey = true; $currentKey = $key; $observer->onNext($value); } }, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($cbObserver, $scheduler); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { if ($this->scheduler !== null) { $scheduler = $this->scheduler; } if ($scheduler === null) { throw new \Exception("You must use a scheduler that support non-zero delay."); } $lastScheduledTime = 0; $disposable = new CompositeDisposable(); $sourceDisposable = new EmptyDisposable(); $sourceDisposable = $observable->subscribe(new CallbackObserver(function ($x) use($scheduler, $observer, &$lastScheduledTime, $disposable) { $schedDisp = $scheduler->schedule(function () use($x, $observer, &$schedDisp, $disposable) { $observer->onNext($x); $disposable->remove($schedDisp); }, $this->delay); $disposable->add($schedDisp); }, function ($err) use($scheduler, $observer, &$lastScheduledTime, $disposable, &$sourceDisposable) { $disposable->remove($sourceDisposable); $sourceDisposable->dispose(); $observer->onError($err); }, function () use($scheduler, $observer, $disposable, &$sourceDisposable) { $disposable->remove($sourceDisposable); $sourceDisposable->dispose(); $schedDisp = $scheduler->schedule(function () use($observer, &$schedDisp, $disposable) { $observer->onCompleted(); $disposable->remove($schedDisp); }, $this->delay); $disposable->add($schedDisp); }), $scheduler); $disposable->add($sourceDisposable); return $disposable; }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $group = new CompositeDisposable(); $isStopped = false; $sourceSubscription = new SingleAssignmentDisposable(); $group->add($sourceSubscription); $callbackObserver = new CallbackObserver(function (ObservableInterface $innerSource) use(&$group, &$isStopped, $observer, &$scheduler) { $innerSubscription = new SingleAssignmentDisposable(); $group->add($innerSubscription); $innerSubscription->setDisposable($innerSource->subscribe(new CallbackObserver(function ($nextValue) use($observer) { $observer->onNext($nextValue); }, function ($error) use($observer) { $observer->onError($error); }, function () use(&$group, &$innerSubscription, &$isStopped, $observer) { $group->remove($innerSubscription); if ($isStopped && $group->count() === 1) { $observer->onCompleted(); } }), $scheduler)); }, [$observer, 'onError'], function () use(&$group, &$isStopped, $observer) { $isStopped = true; if ($group->count() === 1) { $observer->onCompleted(); } }); $subscription = $this->sources->subscribe($callbackObserver, $scheduler); $sourceSubscription->setDisposable($subscription); return $group; }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $cbObserver = new CallbackObserver(function ($x) { $this->arr[] = $x; }, [$observer, 'onError'], function () use($observer) { $observer->onNext($this->arr); $observer->onCompleted(); }); return $observable->subscribe($cbObserver, $scheduler); }
/** * @param $socket * @param ObserverInterface $observer */ public function onConnected($socket, $observer) { $this->loop->removeWriteStream($socket); if (false === stream_socket_get_name($socket, true)) { $observer->onError(new ConnectionException('Connection refused')); $observer->onCompleted(); return; } $observer->onNext(new ConnectorEvent("/connector/connected", new Stream($socket, $this->loop), $this->labels)); //$observer->onCompleted(); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $this->q = []; $cbObserver = new CallbackObserver(function ($x) use($observer) { $this->q[] = $x; if (count($this->q) > $this->count) { $observer->onNext(array_shift($this->q)); } }, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($cbObserver, $scheduler); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { if ($this->scheduler !== null) { $scheduler = $this->scheduler; } if ($scheduler === null) { throw new \Exception("You must use a scheduler with timestamp."); } return $observable->subscribe(new CallbackObserver(function ($x) use($observer, $scheduler) { $observer->onNext(new Timestamped($scheduler->now(), $x)); }, [$observer, "onError"], [$observer, "onCompleted"]), $scheduler); }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $remaining = $this->count; $cbObserver = new CallbackObserver(function ($nextValue) use($observer, &$remaining) { if ($remaining <= 0) { $observer->onNext($nextValue); } else { $remaining--; } }, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($cbObserver, $scheduler); }
public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { if ($this->scheduler !== null) { $scheduler = $this->scheduler; } if ($scheduler === null) { throw new \Exception("You must use a scheduler that support non-zero delay."); } return $scheduler->schedule(function () use($observer) { $observer->onNext(0); $observer->onCompleted(); }, $this->dueTime); }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $selectObserver = new CallbackObserver(function ($nextValue) use($observer) { $value = null; try { $value = call_user_func($this->selector, $nextValue); } catch (\Exception $e) { $observer->onError($e); } $observer->onNext($value); }, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($selectObserver, $scheduler); }
public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { if ($this->scheduler !== null) { $scheduler = $this->scheduler; } if ($scheduler === null) { throw new \Exception("You must use a scheduler that support non-zero delay."); } $counter = 0; return $scheduler->schedulePeriodic(function () use(&$counter, $observer) { $observer->onNext($counter++); }, $this->interval, $this->interval); }
public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null) { $value = $this->value; $scheduler = $scheduler ?: new ImmediateScheduler(); $disposable = new CompositeDisposable(); $disposable->add($scheduler->schedule(function () use($observer, $value) { $observer->onNext($value); })); $disposable->add($scheduler->schedule(function () use($observer) { $observer->onCompleted(); })); return $disposable; }
public function subscribe(ObserverInterface $observer, $scheduler = null) { $this->assertNotDisposed(); if (!$this->isStopped) { $this->observers[] = $observer; return new InnerSubscriptionDisposable($this, $observer); } if ($this->exception) { $observer->onError($this->exception); return new EmptyDisposable(); } $observer->onCompleted(); return new EmptyDisposable(); }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { return $observable->subscribe(new CallbackObserver(function ($frame) use($observer) { $this->message->addFrame($frame); if ($this->message->isCoalesced()) { if ($this->useMessageObject) { $observer->onNext(new \Rx\Websocket\Message($this->message->getPayload(), $this->message->isBinary())); } else { $observer->onNext($this->message->getPayload()); } $this->message = new Message(); } }, [$observer, 'onError'], [$observer, 'onCompleted'])); }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $callbackObserver = new CallbackObserver(function ($nextValue) use($observer) { $this->items[] = $nextValue; if (count($this->items) > $this->count) { array_shift($this->items); } }, [$observer, 'onError'], function () use($observer) { while (count($this->items) > 0) { $observer->onNext(array_shift($this->items)); } $observer->onCompleted(); }); return $observable->subscribe($callbackObserver, $scheduler); }
protected function pollForOutput(ObserverInterface $observer, $previous) { $poll = new \ZMQPoll(); $read = $write = []; $poll->add($this->socket->getSocket(), \ZMQ::POLL_OUT); for ($i = 0; $i < 1000; $i += 1) { $events = $poll->poll($read, $write, 1); if ($events) { $observer->onNext($previous); return $observer->onCompleted(); } $this->loop->tick(); } return $observer->onError(new ConnectException("Socket is not answering")); }
/** * @param ObservableInterface $observable * @param ObserverInterface $observer * @param SchedulerInterface|null $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $onNext = function ($value) use($observer) { try { if (call_user_func($this->predicate, $value)) { $observer->onNext($value); } else { $observer->onCompleted(); } } catch (\Exception $e) { $observer->onError($e); } }; $callbackObserver = new CallbackObserver($onNext, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($callbackObserver, $scheduler); }
private function subscribeToResult(ObservableInterface $observable, SchedulerInterface $scheduler, ObserverInterface $observer, $outerIndex) { return $observable->subscribe(new CallbackObserver(function ($value) use($observer, $outerIndex) { if (!$this->hasFirst) { $this->hasFirst = true; foreach ($this->subscriptions as $i => $subscription) { if ($i !== $outerIndex) { $subscription->dispose(); unset($this->subscriptions[$i]); $this->innerSubscription->remove($subscription); } } } $observer->onNext($value); }, [$observer, 'onError'], [$observer, 'onCompleted']), $scheduler); }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $callbackObserver = new CallbackObserver(function ($value) use($observer, $observable) { try { if ($this->isSkipping) { $this->isSkipping = call_user_func_array($this->predicate, [$value, $observable]); } if (!$this->isSkipping) { $observer->onNext($value); } } catch (\Exception $e) { $observer->onError($e); } }, [$observer, 'onError'], [$observer, 'onCompleted']); return $observable->subscribe($callbackObserver, $scheduler); }
/** * @param \Rx\ObservableInterface $observable * @param \Rx\ObserverInterface $observer * @param \Rx\SchedulerInterface $scheduler * @return \Rx\DisposableInterface */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $disposable = new SerialDisposable(); $cbObserver = new CallbackObserver(function ($x) use($observer) { $this->passThrough = true; $observer->onNext($x); }, [$observer, 'onError'], function () use($observer, $disposable, $scheduler) { if (!$this->passThrough) { $disposable->setDisposable($this->observable->subscribe($observer, $scheduler)); return; } $observer->onCompleted(); }); $subscription = $observable->subscribe($cbObserver, $scheduler); $disposable->setDisposable($subscription); return $disposable; }
public function sendFrame(Frame $frame) { if ($this->mask) { $this->rawDataOut->onNext($frame->maskPayload()->getContents()); return; } $this->rawDataOut->onNext($frame->getContents()); }