Accéder à l'histoire d'un `ref` à Clojure

9

La documentation de ref montre une option: max-history et déclare que "les refs accumulent l'historique dynamiquement selon les besoins pour traiter les demandes de lecture." Je peux voir qu'il y a de l'historique au REPL, mais je ne vois pas comment trouver les valeurs précédentes d'une référence:

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

Vraisemblablement, le monde a eu les valeurs "bonjour", "mieux" et "mieux !!!". Comment accéder à cette histoire?

S'il n'est pas possible d'accéder à cet historique, existe-t-il un type de données qui conserve un historique de ses valeurs qui peut être interrogé par la suite? Ou est-ce pour cela que la base de données datomic a été créée?

GlenPeterson
la source

Réponses:

7

Je crois: min-history et: max-history ne font référence qu'à l'historique d'une référence lors d'une transaction.

Cependant, voici un moyen de le faire avec un atome et un observateur:

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
la source
Cela fonctionnera-t-il également avec les atomes?
Yazz.com