Um dos mecanismos elegantes para gerenciar o estado em Clojure são os átomos.
Em nosso aplicativo de bate-papo – Jane e Joe estão online no momento.
#{"Jane" "Joe"}
Momentos depois, Joy fica online e se junta a eles no chat.
(conj #{"Jane" "Joe"} "Joy")
;; => #{"Joe" "Jane" "Joy"}
Agora que Joy está online, podemos ver que há 3 pessoas online.
(count #{"Joe" "Jane" "Joy"})
;; => 3
Vamos verificar e ter certeza de que Joy está online
(contains? #{"Joe" "Jane" "Joy"} "Joy")
;; => true
Por causa deste exemplo, estamos definindo explicitamente o conjunto que contém o conjunto de pessoas atualmente online.
Para tornar o exemplo mais prático, vamos ver como empregar átomos para gerenciar o estado de nossa lista de pessoas online.
Jack e Peter estão online em nosso aplicativo de bate-papo:
(def people-online(atom #{"Jack" "Peter"}))
;; => #<Atom@1fec1485: #{Peter Jack}>
Aqui, estamos usando a função átomo do Clojures para fornecer uma maneira de gerenciar o estado de um conjunto – aqui nós o definimos como pessoas online
Pouco depois, Jen fica online
(swap! people-online conj "Jen")
;; => #{"Peter" "Jen" "Jack"}
Porque estamos trabalhando com um átomo , usamos a troca! função para alterar o valor do átomo de pessoas online .
Nesse caso, é simples alterá-lo usando conj para adicionar “Jen” ao conjunto de pessoas online.
Você pode acessar um estado de átomos usando deref
(count (deref people-online))
;; => 3
ou usando @
(count @people-online)
;; => 3
Usando o @ way, vamos verificar se Jen está online
(contains? @people-online "Jen")
;; => true
Como podemos ver neste exemplo, a abordagem pragmática e prática de Clojure nos permite gerenciar o estado de uma parte de nossa aplicação – o uso de átomos aqui pode ser aplicado de maneira geral.