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?

GlenPeterson
fonte

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!!!"]
Jeff Dik
fonte
Isso funcionará da mesma forma com os átomos também?
Yazz.com 25/03