Hi… in my little project I do some concurrent stuff using atoms. Now, during the last days using swap! I encountered the same problem several times: Some result value is produced inside the swap! function besides the updated data that I would like to return. I first played with two atoms and considered modeling the entire result as the atom value and even using refs. The "fat atom" approach is ugly in this case as the enhanced result is just a local artifact and not of interest outside my calls. Refs/STM looks somewhat big for this. But then I saw compare-and-set! and came up with this:
(defn complex-swap! [atoom get-ref-val f & args] (loop [last-val @atoom] (let [result (apply f last-val args)] (if (compare-and-set! atoom last-val (get-ref-val result)) result (recur @atoom))))) It allows to produce an augmented result value, only part of which is the new atom content passing an additional getter function to extract the new value part. For example: (def my-atom (atom '(1 2 3 4))) (complex-swap! my-atom second (partial split-with #(<= % 2))) => [(1 2) (3 4)] @my-atom => (3 4). The original swap! would be like this: (swap! my-atom (comp second (partial split-with #(<= % 2)))) => (3 4) @my-atom => (3 4) Now, is there some even easier way to achieve this or is this the best approach? Ciao …Jochen -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.