If add-watch is not what you want because you want the consumers to
have a life of their own, then does something like this work? -

(def my-hash (ref {}))
(def new-keys (ref #{}))

(defn produce  []
  (let [new-key (rand-int 10)
        new-val "P"]
    (Thread/sleep 100)
    (dosync
      (alter my-hash assoc new-key new-val)
      (alter new-keys conj new-key))))

(defn consum  []
  (loop []
    (let [done? (dosync
                  (if (> (count @new-keys) 0)
                    (let [new-key (first @new-keys)
                          my-new-val "C"]
                      (alter new-keys disj new-key)
                      (alter my-hash assoc new-key my-new-val)
                      true)
                    false))]
      (when-not done?
        (Thread/sleep 100)
        (recur))))
  (Thread/sleep 100))

(defn producer [] (dorun (repeatedly produce)))

(defn consumer [] (dorun (repeatedly consume)))

(defn report-status  []
  (dosync
    (ensure my-hash)
    (ensure new-keys)
    (println @my-hash)
    (println @new-keys)
    ))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to