Is there some reason you can't use a ref for this?
On Thu, Sep 19, 2013 at 9:20 AM, Adam Clements <[email protected]>wrote: > Hi, > > I have been working on a setup where I batch a number of updates in a > queue, which I store in an atom with multiple threads potentially adding > things to it. Periodically I want to flush that queue, leaving an empty > list in the atom and passing the current batch of values on for further > processing. > > I can't use swap! for this, because my further processing is side > effecting and I wouldn't want to dispatch the same information twice, and I > can't use reset! because that just throws away the old contents of the > atom, and derefing it in the line before I am likely to lose data if > another thread adds something at the last minute. > > I could change to an agent with append and flush actions which would get > queued up and run only once each, and that would work. But it has quite a > lot of thread overhead which I think is unnecessary. > > What I ended up doing was writing a version of reset! which returns the > old value instead of the new value (why would I want the new value? I know > that, I put it in!) > > (defn flush! [atom newval] > (let [val @atom] > (if (compare-and-set! atom val newval) > val > (recur atom newval)))) > > => (def a (atom [1 2 3 4])) > #'user/a > => (flush! a []) > [1 2 3 4] > => @a > [] > > Is there already a standard library fn I should be using for this? Is this > a bad idea for some reason I don't fathom? > > Adam > > https://github.com/AdamClements > > -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to [email protected] > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > [email protected] > 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 [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > -- Ben Wolfson "Human kind has used its intelligence to vary the flavour of drinks, which may be sweet, aromatic, fermented or spirit-based. ... Family and social life also offer numerous other occasions to consume drinks for pleasure." [Larousse, "Drink" entry] -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] 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 [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
