Example #1
0
 public function add(DisposableInterface $disposable)
 {
     if ($this->isDisposed) {
         $disposable->dispose();
     } else {
         $this->disposables[] = $disposable;
     }
 }
 public function handleRouterStop(RouterStopEvent $event)
 {
     foreach ($this->sessions as $k) {
         $this->sessions[$k]->shutdown();
     }
     if ($this->serverDisposable) {
         $this->serverDisposable->dispose();
     }
 }
Example #3
0
 public function dispose()
 {
     if ($this->isDisposed) {
         return;
     }
     $this->isDisposed = true;
     $this->scheduler->schedule(function () {
         $this->disposable->dispose();
     });
 }
Example #4
0
 public function __construct($key, ObservableInterface $underlyingObservable, DisposableInterface $mergedDisposable = null)
 {
     $this->key = $key;
     if (null === $mergedDisposable) {
         $this->underlyingObservable = $underlyingObservable;
     } else {
         $this->underlyingObservable = new AnonymousObservable(function ($observer, $scheduler) use($mergedDisposable, $underlyingObservable) {
             // todo, typehint $mergedDisposable?
             return new CompositeDisposable(array($mergedDisposable->getDisposable(), $underlyingObservable->subscribe($observer, $scheduler)));
         });
     }
 }
 public function setDisposable(DisposableInterface $disposable = null)
 {
     if ($this->current) {
         throw new RuntimeException('Disposable has already been assigned.');
     }
     if (!$this->isDisposed) {
         $this->current = $disposable;
     }
     if ($this->isDisposed && $disposable) {
         $disposable->dispose();
     }
 }
Example #6
0
 /**
  * @param DisposableInterface $disposable
  */
 public function setDisposable(DisposableInterface $disposable)
 {
     $shouldDispose = $this->isDisposed;
     if (!$shouldDispose) {
         $old = $this->disposable;
         $this->disposable = $disposable;
         if ($old) {
             $old->dispose();
         }
     }
     if ($shouldDispose) {
         $disposable->dispose();
     }
 }
Example #7
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.");
     }
     /** @var AnonymousObservable $observable */
     $disp = $observable->materialize()->timestamp()->map(function (Timestamped $x) {
         return new Timestamped($x->getTimestampMillis() + $this->delayTime, $x->getValue());
     })->subscribe(new CallbackObserver(function (Timestamped $x) use($scheduler, $observer) {
         if ($x->getValue() instanceof Notification\OnErrorNotification) {
             $x->getValue()->accept($observer);
             return;
         }
         $this->queue->enqueue($x);
         if ($this->schedulerDisposable === null) {
             $doScheduledStuff = function () use($observer, $scheduler, &$doScheduledStuff) {
                 while (!$this->queue->isEmpty() && $scheduler->now() >= $this->queue->bottom()->getTimestampMillis()) {
                     /** @var Timestamped $item */
                     $item = $this->queue->dequeue();
                     /** @var Notification $materializedValue */
                     $materializedValue = $item->getValue();
                     $materializedValue->accept($observer);
                 }
                 if ($this->queue->isEmpty()) {
                     $this->schedulerDisposable = null;
                     return;
                 }
                 $this->schedulerDisposable = $scheduler->schedule($doScheduledStuff, $this->queue->bottom()->getTimestampMillis() - $scheduler->now());
             };
             $doScheduledStuff();
         }
     }, [$observer, 'onError']), $scheduler);
     return new CallbackDisposable(function () use($disp) {
         if ($this->schedulerDisposable) {
             $this->schedulerDisposable->dispose();
         }
         $disp->dispose();
     });
 }