Acessando o histórico de um `ref` no Clojure


9

A documentação para ref mostra uma opção: max-history e afirma que "refs acumulam histórico dinamicamente conforme necessário para lidar com demandas de leitura". Eu posso ver que há histórico no REPL, mas não vejo como encontrar valores anteriores de uma ref:

user=> (def the-world (ref "hello" :min-history 10))
#'user/the-world
user=> (do
          (dosync (ref-set the-world "better"))
          @the-world)
"better"
user=> (let [exclamator (fn [x] (str x "!"))]
          (dosync
           (alter the-world exclamator)
           (alter the-world exclamator)
           (alter the-world exclamator))
          @the-world)
"better!!!"
user=> (ref-history-count the-world)
2

Presumivelmente, o mundo teve os valores "olá", "melhor" e "melhor !!!". Como faço para acessar esse histórico?

Se não for possível acessar esse histórico, existe um tipo de dados que mantém um histórico de seus valores que podem ser consultados posteriormente? Ou é por isso que o banco de dados datômico foi criado?

Respostas:


7

Eu acredito que: min-history e: max-history referem-se apenas ao histórico de um árbitro durante uma transação.

No entanto, aqui está uma maneira de fazer isso com um átomo e um observador:

user> (def the-world (ref "hello"))
#'user/the-world
user> (def history-of-the-world (atom [@the-world]))
#'user/history-of-the-world
user> history-of-the-world
#<Atom@6ef167bb: ["hello"]>
user> (add-watch the-world :historian
                 (fn [key world-ref old-state new-state]
                   (if (not= old-state new-state)
                     (swap! history-of-the-world conj new-state))))
#<Ref@47a2101a: "hello">
user> (do
        (dosync (ref-set the-world "better"))
        @the-world)
"better"      
user> (let [exclamator (fn [x] (str x  "!"))]
        (dosync
          (alter the-world exclamator)
          (alter the-world exclamator)
          (alter the-world exclamator))
        @the-world)
"better!!!"
user> @history-of-the-world
["hello" "better" "better!!!"]

Isso funcionará da mesma forma com os átomos também?
Yazz.com 25/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.