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();
 | 
						|
    }
 | 
						|
}
 |