*/ protected $isInQueue; /** * @var \SplQueue */ protected $queue; public function __construct() { $this->queue = new \SplQueue(); $this->isInQueue = new \SplObjectStorage(); } public function enqueue(UpdateNotificationSender $setting) { if ( $this->isInQueue->contains($setting) ) { //Already in the queue. Let's just mark it as valid. $this->isInQueue[$setting] = true; } else { //Add to the queue. $this->isInQueue->attach($setting, true); $this->queue->enqueue($setting); } } public function dequeue() { //Find and return the first valid (non-removed) item. while (!$this->queue->isEmpty()) { $sender = $this->queue->dequeue(); if ( $this->isInQueue[$sender] ) { $this->isInQueue->detach($sender); return $sender; } } return null; } public function remove(UpdateNotificationSender $setting) { if ( $this->isInQueue->contains($setting) ) { //There's not a quick way to remove an element from a SplQueue, //so we'll just mark the item as invalid. It will be removed //in dequeue(). $this->isInQueue[$setting] = false; } } public function isEmpty() { return ($this->queue->isEmpty() || ($this->isInQueue->count() < 1)); } }