Я не думаю, что есть простой способ обернуть изменяемую структуру данных как неизменную. Неизменяемые структуры данных становятся эффективными, когда новая версия может совместно использовать данные со старой версией, и я не могу понять, как это можно сделать без доступа к внутренним компонентам PriorityQueue
.
Если вам действительно нужна постоянная очередь приоритетов , этот поток может быть интересен. В них, похоже, есть линейные вставки, поэтому, если это проблема, возможно, вам придется искать другую реализацию.
Редактировать: Если подумать, простая реализация очереди с постоянным приоритетом - просто сохранить пары (prio, value) в отсортированном наборе. Примерно так:
(defn make-pqueue []
(sorted-set))
(defn pqueue-add [pq x prio]
(conj pq [prio x]))
(defn pqueue-peek [pq]
(first pq))
(defn pqueue-pop [pq]
(let [top (first pq)]
(disj pq top)))
Конечно, приведенный выше код довольно ограничен (например, без нескольких записей), но он иллюстрирует идею.