Advertisement
Guest User

dosync in clojure

a guest
Jan 31st, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (defn traverse [f dat]
  2.   (vec (map #(f %) dat)))
  3.  
  4. (def data (traverse ref (range 10)))
  5.  
  6. (-> (fn []
  7.       (dosync (loop [i 0
  8.                      data data]
  9.                 (when (seq data)
  10.                   (Thread/sleep 1000)
  11.                   (println (str ">>> " i ": " @(first data)))
  12.                   (recur (+ i 1) (next data))))))
  13.     Thread.
  14.     .start)
  15.  
  16. (Thread/sleep 1500)
  17. (dosync
  18.  (traverse (fn [ref]
  19.              (alter ref inc))
  20.            data))
  21.  
  22. (Thread/sleep 1000)
  23. ;; This one extra sleep forces the "main" thread sleeping for one
  24. ;; second.  Due to some reason I don't know for now, when `dosync'
  25. ;; retries, the first sleep will be interrupted.
  26. (Thread/sleep 1000)
  27. (dosync
  28.  (traverse (fn [ref]
  29.              (alter ref inc))
  30.            data))
  31.  
  32. (traverse #(println (str "--- " @%)) data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement