Pular para o conteúdo

PersistentQueue e mapas em Clojure

🧵 Trabalhando com filas (PersistentQueue) e mapas em Clojure

Seção intitulada “🧵 Trabalhando com filas (PersistentQueue) e mapas em Clojure”

Em vez de simular filas com vetores, podemos usar clojure.lang.PersistentQueue, uma estrutura de dados imutável nativa de Clojure, própria para comportamentos de fila FIFO.

(def fila clojure.lang.PersistentQueue/EMPTY)
;; => #queue []

Assim como vetores, podemos usar conj para adicionar elementos ao final da fila:

(def fila (conj fila :a))
;; => #queue [:a]
(def fila (conj fila :b :c))
;; => #queue [:a :b :c]

peek retorna o primeiro elemento da fila, sem removê-lo:

(peek fila)
;; => :a

pop remove o primeiro elemento (diferente do comportamento em vetores):

(def fila (pop fila))
;; => #queue [:b :c]

update aplica uma função ao valor de uma chave específica, ideal para contadores ou registros:

(def status {:processadas 0})
(update status :processadas inc)
;; => {:processadas 1}
(update status :processadas + 5)
;; => {:processadas 6}
(def fila clojure.lang.PersistentQueue/EMPTY)
(def fila (conj fila :msg1 :msg2 :msg3))
;; => #queue [:msg1 :msg2 :msg3]
(peek fila)
;; => :msg1
(def fila (pop fila))
;; => #queue [:msg2 :msg3]
(def status {:processadas 0})
(def status (update status :processadas inc))
;; => {:processadas 1}
  • PersistentQueue não é tão conhecido quanto outras coleções básicas, mas é ideal quando você precisa de um comportamento FIFO verdadeiro.
  • Como todas as estruturas em Clojure, ele é imutável - cada operação retorna uma nova fila.