    /*
     *  call-seq:
     *     pq.pop -> elem
     *
     *  Returns the top element in the queue removing it from the queue.
     */
    static VALUE
    frb_pq_pop(VALUE self)
    {
        PriQ *pq;
        GET_PQ(pq, self);
        if (pq->size > 0) {
            VALUE result = pq->heap[1];       /* save first value */
            pq->heap[1] = pq->heap[pq->size]; /* move last to first */
            pq->heap[pq->size] = Qnil;
            pq->size--;
            pq_down(pq);                      /* adjust heap */
            return result;
        }
        else {
            return Qnil;
        }
    }