Exemplo n.º 1
0
 /**
  * @param $value
  */
 public function onNext($value)
 {
     $this->observer->onNext($value);
     if (isset($this->disposeOnMap[$value])) {
         $this->disposeOnMap[$value]->dispose();
     }
 }
Exemplo n.º 2
0
 /**
  * @inheritDoc
  */
 public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     if ($this->scheduler !== null) {
         $scheduler = $this->scheduler;
     }
     $innerDisp = new SerialDisposable();
     $disp = $observable->subscribe(new CallbackObserver(function ($x) use($innerDisp, $observer, $scheduler) {
         $now = $scheduler->now();
         if ($this->nextSend <= $now) {
             $innerDisp->setDisposable(new EmptyDisposable());
             $observer->onNext($x);
             $this->nextSend = $now + $this->throttleTime - 1;
             return;
         }
         $newDisp = Observable::just($x)->delay($this->nextSend - $now)->subscribe(new CallbackObserver(function ($x) use($observer, $scheduler) {
             $observer->onNext($x);
             $this->nextSend = $scheduler->now() + $this->throttleTime - 1;
             if ($this->completed) {
                 $observer->onCompleted();
             }
         }, [$observer, 'onError']), $scheduler);
         $innerDisp->setDisposable($newDisp);
     }, function (\Exception $e) use($observer, $innerDisp) {
         $innerDisp->dispose();
         $observer->onError($e);
     }, function () use($observer) {
         $this->completed = true;
         if ($this->nextSend === 0) {
             $observer->onCompleted();
         }
     }), $scheduler);
     return new CompositeDisposable([$disp, $innerDisp]);
 }
Exemplo n.º 3
0
 /**
  * @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);
 }
Exemplo n.º 4
0
 /**
  * @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)
 {
     $hasAccumulation = false;
     $accumulation = null;
     $hasValue = false;
     $cbObserver = new CallbackObserver(function ($x) use($observer, &$hasAccumulation, &$accumulation, &$hasValue) {
         $hasValue = true;
         try {
             if ($hasAccumulation) {
                 $accumulation = call_user_func($this->accumulator, $accumulation, $x);
             } else {
                 $accumulation = $this->hasSeed ? call_user_func($this->accumulator, $this->seed, $x) : $x;
                 $hasAccumulation = true;
             }
         } catch (\Exception $e) {
             $observer->onError($e);
         }
     }, function ($e) use($observer) {
         $observer->onError($e);
     }, function () use($observer, &$hasAccumulation, &$accumulation, &$hasValue) {
         if ($hasValue) {
             $observer->onNext($accumulation);
         } else {
             $this->hasSeed && $observer->onNext($this->seed);
         }
         if (!$hasValue && !$this->hasSeed) {
             $observer->onError(new \Exception("Missing Seed and or Value"));
         }
         $observer->onCompleted();
     });
     return $observable->subscribe($cbObserver, $scheduler);
 }
Exemplo n.º 5
0
 /**
  * @inheritDoc
  */
 public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     return $observable->subscribe(new CallbackObserver(function ($x) use($observer) {
         $observer->onNext(new OnNextNotification($x));
     }, function ($error) use($observer) {
         $observer->onNext(new OnErrorNotification($error));
         $observer->onCompleted();
     }, function () use($observer) {
         $observer->onNext(new OnCompletedNotification());
         $observer->onCompleted();
     }), $scheduler);
 }
Exemplo n.º 6
0
 /**
  * @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();
     $buffer = '';
     $request = $this->client->request($this->method, $this->url, $this->headers, $this->protocolVersion);
     $request->on('response', function (Response $response) use(&$buffer, $observer, $request, $scheduler) {
         $response->on('data', function ($data, Response $response) use(&$buffer, $observer, $request, $scheduler) {
             try {
                 //Http Errors
                 if ($response->getCode() < 200 || $response->getCode() >= 400) {
                     $error = new HttpResponseException($request, $response, $response->getReasonPhrase(), $response->getCode());
                     $observer->onError($error);
                     return;
                 }
                 if ($this->bufferResults) {
                     $buffer .= $data;
                 } else {
                     $data = $this->includeResponse ? [$data, $response, $request] : $data;
                     $scheduler->schedule(function () use($observer, $data) {
                         $observer->onNext($data);
                     });
                 }
             } catch (\Exception $e) {
                 $observer->onError($e);
             }
         });
         $response->on('error', function ($e) use($observer) {
             $error = new \Exception($e);
             $observer->onError($error);
         });
         $response->on('end', function ($end = null) use(&$buffer, $observer, $request, $response, $scheduler) {
             if ($this->bufferResults) {
                 $data = $this->includeResponse ? [$buffer, $response, $request] : $buffer;
                 $scheduler->schedule(function () use($observer, $data, $scheduler) {
                     $observer->onNext($data);
                     $scheduler->schedule(function () use($observer) {
                         $observer->onCompleted();
                     });
                 });
                 return;
             }
             $scheduler->schedule(function () use($observer) {
                 $observer->onCompleted();
             });
         });
     });
     $request->end($this->body);
     return new CallbackDisposable(function () use($request) {
         $request->close();
     });
 }
 /**
  * @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']));
 }
Exemplo n.º 8
0
 /**
  * @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;
 }
Exemplo n.º 9
0
 /**
  * @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;
 }
Exemplo n.º 10
0
 /**
  * @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]);
 }
Exemplo n.º 11
0
 /**
  * @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);
 }
Exemplo n.º 12
0
 /**
  * @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)
 {
     $cbObserver = new CallbackObserver(function ($x) use($observer) {
         try {
             $this->onEachObserver->onNext($x);
         } catch (\Exception $e) {
             return $observer->onError($e);
         }
         $observer->onNext($x);
     }, function ($err) use($observer) {
         try {
             $this->onEachObserver->onError($err);
         } catch (\Exception $e) {
             return $observer->onError($e);
         }
         $observer->onError($err);
     }, function () use($observer) {
         try {
             $this->onEachObserver->onCompleted();
         } catch (\Exception $e) {
             return $observer->onError($e);
         }
         $observer->onCompleted();
     });
     return $observable->subscribe($cbObserver, $scheduler);
 }
Exemplo n.º 13
0
 /**
  * @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']));
 }
 public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     $hasCurrentKey = false;
     $currentKey = null;
     return $observable->subscribe(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);
         }
     }, function ($e) use($observer) {
         $observer->onError($e);
     }, function () use($observer) {
         $observer->onCompleted();
     }));
 }
Exemplo n.º 15
0
 /**
  * @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);
 }
Exemplo n.º 16
0
 public function subscribe(\Rx\ObserverInterface $observer, $scheduler = null)
 {
     return $scheduler->scheduleRecursive(function ($reschedule) use($observer) {
         $observer->onNext($this->value);
         $reschedule();
     });
 }
Exemplo n.º 17
0
 /**
  * @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);
         }
     });
 }
Exemplo n.º 18
0
 public function sendFrame(Frame $frame)
 {
     if ($this->mask) {
         $this->rawDataOut->onNext($frame->maskPayload()->getContents());
         return;
     }
     $this->rawDataOut->onNext($frame->getContents());
 }
Exemplo n.º 19
0
 /**
  * @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);
 }
Exemplo n.º 20
0
 /**
  * @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);
 }
Exemplo n.º 21
0
 /**
  * @inheritDoc
  */
 public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     array_unshift($this->sources, $observable);
     $this->numberOfSources = count($this->sources);
     $disposable = new CompositeDisposable();
     $this->completesRemaining = $this->numberOfSources;
     for ($i = 0; $i < $this->numberOfSources; $i++) {
         $this->queues[$i] = new \SplQueue();
         $this->completed[$i] = false;
     }
     for ($i = 0; $i < $this->numberOfSources; $i++) {
         $source = $this->sources[$i];
         $cbObserver = new CallbackObserver(function ($x) use($i, $observer, $scheduler) {
             // if there is another item in the sequence after one of the other source
             // observables completes, we need to complete at this time to match the
             // behavior of RxJS
             if ($this->completesRemaining < $this->numberOfSources) {
                 // check for completed and empty queues
                 for ($j = 0; $j < $this->numberOfSources; $j++) {
                     if ($this->completed[$j] && count($this->queues[$j]) === 0) {
                         $observer->onCompleted();
                         return;
                     }
                 }
             }
             $this->queues[$i]->enqueue($x);
             for ($j = 0; $j < $this->numberOfSources; $j++) {
                 if ($this->queues[$j]->isEmpty()) {
                     return;
                 }
             }
             $params = [];
             for ($j = 0; $j < $this->numberOfSources; $j++) {
                 $params[] = $this->queues[$j]->dequeue();
             }
             try {
                 $observer->onNext(call_user_func_array($this->resultSelector, $params));
             } catch (\Exception $e) {
                 $observer->onError($e);
             }
         }, function ($e) use($observer) {
             $observer->onError($e);
         }, function () use($i, $observer) {
             $this->completesRemaining--;
             $this->completed[$i] = true;
             if ($this->completesRemaining === 0) {
                 $observer->onCompleted();
             }
         });
         $subscription = $source->subscribe($cbObserver, $scheduler);
         $disposable->add($subscription);
     }
     return $disposable;
 }
Exemplo n.º 22
0
 /**
  * @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();
 }
Exemplo n.º 23
0
 /**
  * @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);
 }
Exemplo n.º 24
0
 /**
  * @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);
 }
Exemplo n.º 25
0
 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);
 }
Exemplo n.º 26
0
 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);
 }
Exemplo n.º 27
0
 /**
  * @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);
 }
Exemplo n.º 28
0
 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;
 }
Exemplo n.º 29
0
 /**
  * @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;
     $defaultFn = function ($reschedule) use(&$observer, &$key) {
         try {
             if (null === $key) {
                 $observer->onCompleted();
                 return;
             }
             $current = $this->items->current();
             $observer->onNext($current);
             $this->items->next();
             $key = $this->items->key();
             $reschedule();
         } catch (\Exception $e) {
             $observer->onError($e);
         }
     };
     $hhvmFn = function ($reschedule) use(&$observer, &$key) {
         try {
             //HHVM requires you to call next() before current()
             $this->items->next();
             $key = $this->items->key();
             if (null === $key) {
                 $observer->onCompleted();
                 return;
             }
             $current = $this->items->current();
             $observer->onNext($current);
             $reschedule();
         } catch (\Exception $e) {
             $observer->onError($e);
         }
     };
     return $scheduler->scheduleRecursive(defined('HHVM_VERSION') && version_compare(HHVM_VERSION, '3.11.0', 'lt') ? $hhvmFn : $defaultFn);
 }
Exemplo n.º 30
0
 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"));
 }