The easy way is the big atom approach. Put the entire structure in an atom and use swap! to make updates.
First, the function passed to swap! should be free of side-effects, as swap! may need to call it more than once in the case of a collision.
Second, within the function passed to swap! is where you check to see if the resource is available. If it is, you take it. Otherwise not.
Now as for suitability. Note that the function passed to swap! must return the replacement value of your immutable structure. So it important
that your structure records who got the resource being requested. And it looks like your structure handles that.
No need to use compare and set. The swap! function is good enough. It is really a convenience function layered over compare-and-set.
Sometimes swap! is not powerful enough, which is when you use compare-and-set.