docs: 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