13

consider this inside a reduce loop:

(if (contains? m k)
  (update m k conj v)
  (assoc m k [v]))

Is there a way to get rid of the if statement?

Daniel Compton
  • 13,878
  • 4
  • 40
  • 60
Anton Harald
  • 5,772
  • 4
  • 27
  • 61

2 Answers2

23

Use fnil to handle the nil value of v when k doesn't exist in the map:

(update m k (fnil conj []) v)
Daniel Compton
  • 13,878
  • 4
  • 40
  • 60
3

While the fnil answer is more spectacular, I find the following easier to read, especially if unfamiliar with fnil:

(assoc m k (conj (m k []) v))

where (m k []) returns the value of k in m or defaults to [] if k does not exist in m.

If k is a symbol, (k m []) would also work.

notan3xit
  • 2,386
  • 2
  • 21
  • 26