60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace React\EventLoop\Tick;
 | |
| 
 | |
| use React\EventLoop\LoopInterface;
 | |
| use SplQueue;
 | |
| 
 | |
| class FutureTickQueue
 | |
| {
 | |
|     private $eventLoop;
 | |
|     private $queue;
 | |
| 
 | |
|     /**
 | |
|      * @param LoopInterface $eventLoop The event loop passed as the first parameter to callbacks.
 | |
|      */
 | |
|     public function __construct(LoopInterface $eventLoop)
 | |
|     {
 | |
|         $this->eventLoop = $eventLoop;
 | |
|         $this->queue = new SplQueue();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add a callback to be invoked on a future tick of the event loop.
 | |
|      *
 | |
|      * Callbacks are guaranteed to be executed in the order they are enqueued.
 | |
|      *
 | |
|      * @param callable $listener The callback to invoke.
 | |
|      */
 | |
|     public function add(callable $listener)
 | |
|     {
 | |
|         $this->queue->enqueue($listener);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Flush the callback queue.
 | |
|      */
 | |
|     public function tick()
 | |
|     {
 | |
|         // Only invoke as many callbacks as were on the queue when tick() was called.
 | |
|         $count = $this->queue->count();
 | |
| 
 | |
|         while ($count--) {
 | |
|             call_user_func(
 | |
|                 $this->queue->dequeue(),
 | |
|                 $this->eventLoop
 | |
|             );
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Check if the next tick queue is empty.
 | |
|      *
 | |
|      * @return boolean
 | |
|      */
 | |
|     public function isEmpty()
 | |
|     {
 | |
|         return $this->queue->isEmpty();
 | |
|     }
 | |
| }
 |