Exemplo n.º 1
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.º 2
0
 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;
 }
Exemplo n.º 3
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.º 4
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.º 5
0
 public function subscribe(ObserverInterface $observer, SchedulerInterface $scheduler = null)
 {
     $scheduler = $scheduler ?: new ImmediateScheduler();
     return $scheduler->schedule(function () use($observer) {
         $observer->onCompleted();
     });
 }
Exemplo n.º 6
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.º 7
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']));
 }
Exemplo n.º 8
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.º 9
0
 public function subscribe(\Rx\ObserverInterface $observer, $scheduler = null)
 {
     return $scheduler->scheduleRecursive(function ($reschedule) use($observer) {
         $observer->onNext($this->value);
         $reschedule();
     });
 }
Exemplo n.º 10
0
 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);
 }
Exemplo n.º 11
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.º 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)
 {
     $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.º 13
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.º 14
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.º 15
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.º 16
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.º 17
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.º 18
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.º 19
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.º 20
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.º 21
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.º 22
0
 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();
 }
Exemplo n.º 23
0
 /**
  * @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.º 24
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)
 {
     $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);
 }
Exemplo n.º 25
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"));
 }
Exemplo n.º 26
0
 /**
  * @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);
 }
Exemplo n.º 27
0
 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);
 }
Exemplo n.º 28
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)
 {
     $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);
 }
Exemplo n.º 29
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)
 {
     $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;
 }
Exemplo n.º 30
0
 public function sendFrame(Frame $frame)
 {
     if ($this->mask) {
         $this->rawDataOut->onNext($frame->maskPayload()->getContents());
         return;
     }
     $this->rawDataOut->onNext($frame->getContents());
 }