def dequeue(self) -> tuple[int, TItem]:
        """Removes and returns an item from the priority queue.

        Returns:
            A tuple whose first element is the priority of the dequeued item
            and whose second element is the dequeued item.

        Raises:
            ValueError:
                The queue is empty.
        """
        if self._len == 0:
            raise ValueError('BucketPriorityQueue is empty.')

        # Drop empty buckets at the front of the queue.
        while self._buckets and not self._buckets[0]:
            self._buckets.pop(0)
            self._offset += 1

        # Pull item out of the front bucket.
        item = self._buckets[0].pop(0)
        priority = self._offset
        self._len -= 1
        if self._drop_set is not None:
            self._drop_set.remove((priority, item))

        # Note: do not eagerly clear out empty buckets after pulling the item!
        # Doing so increases the worst case complexity of "monotonic" use from
        # O(N+P) to O(N*P).

        return priority, item
Removes and returns an item from the priority queue.

        Returns:
            A tuple whose first element is the priority of the dequeued item
            and whose second element is the dequeued item.

        Raises:
            ValueError:
                The queue is empty.
        
cirq-core/cirq/circuits/_bucket_priority_queue.py