Fix formatting and whitespace
Use doseq for repeated side effects
Use non-blocking put! instead of blocking >!!
Use sets instead of vectors for union

Union gets really expensive with big vectors
Use (disj s x) instead of (difference s #{x})
Use thread-first macro (->) to remove nesting
Coerce to boolean instead of (not (nil? ...))
Use when for only one condition
Use return value from notify
Do all side effects in one place, where possible
Replace if-let with or
Use thread-last macro (->>) to remove nesting
Use list comprehension