I have couple of times run into a situation where I want to update a state
map held in an atom
and return the change, not the new value. I haven't found a good way to do
it so either I am missing
something obvious or there are more idiomatic ways to achieve what I need.
Could you advise me?
A concrete example: In ma webapp I want to assign a unique random ID to
each user. Creating that ID is simple:
(def state (atom {:teams {}}))
;; Remove already used IDs from a lazy seq of random IDs (=> unique), take
the 1st one
(defn unique-rand-id [id-set]
(first (remove id-set (repeatedly #(rand-int Integer/MAX_VALUE))))))
;; Add a new team with a unique random ID to the teams map
(defn make-team [teams]
(let [id (unique-rand-id (set (keys teams)))]
(assoc teams id {})))
;; Create a new team; TODO: How to get the new team's ID?!
(swap! state #(update-in % [:teams] make-team))
So I can generate and remember a new unique random ID but there is no way
to find out
what ID it was (I cannot just take diff of state before and after since
other threads could
have also added new IDs to it in the meanwhile.)
Any advice is appreciated. Thank you!
--
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/d/optout.