Trabalhando com valores mutaveis em clojure, para isso vamos utilizar atom
que é uma das formas de manipular o estado de um simbolo, imagine que o atom
cria uma camada em cima do seu objeto e essa camada é mutavel, portanto permite que você faça alterações.
O primeiro passo vamos criar uma fila com o nome de agenda, e apos usar a função atom
:
(def ^:private agenda (atom {:compromissos h.model/nova_fila}))
Entender esse conceito do atom
pode parecer complexo, porque até agora estavamos lidando com coleções imutaveis, então recomendo ler a doc do clojure sobre esse tópico, assim como os demais citados nas anotações:
https://clojuredocs.org/clojure.core/atom
No exemplo vamos utilizar a função adicionar-compromisso
que será responsável por criar novos itens na nossa fila.
Para "forçar" que essa fila seja mutavel vamos utilizar o swap! normalmente as funções que permitem que simbolos se tornem mutaveis utilizam o sinal de exclamação no final da palavra reservada
E a sintaxe ficará da seguinte forma:
(swap! [nome fila atomica] [funcao que sera aplicada] [hashmap] [elemento]))
Vamos ao exemplo:
(ns exemplo.core
(:use [clojure pprint])
(:require [exemplo.model :as h.model]))
(def ^:private agenda (atom {:compromissos h.model/nova_fila}))
(defn adicionar-compromisso [item]
(swap! agenda update :compromissos conj item))
(let [compromissos ["Dentista" "Vacinar contra Covid" "Palestrar na TDC 2021" "Escrever artigo sobre Threads no Clojure"]]
(pprint(map adicionar-compromisso compromissos)))
Nesse exemplo definimos agenda como um simbolo global porém privado para ser utilizado somente nesse namespace.
Criamos a função adiciona-compromisso que tem a responsabilidade de adicionar itens a nossa agenda na qual é feito o update da agenda.
Output:
({:compromissos <-("Dentista")-<}
{:compromissos <-("Dentista" "Vacinar contra Covid")-<}
{:compromissos
<-("Dentista" "Vacinar contra Covid" "Palestrar na TDC 2021")-<}
{:compromissos
<-("Dentista"
"Vacinar contra Covid"
"Palestrar na TDC 2021"
"Escrever artigo sobre Threads no Clojure")-<})