I often find myself writing a reducing function that does what group-by
does. It would be convenient to have group-by
return a reducing function (without needing to import Christophe Grand's xforms lib). So instead of writing:
(->> (range 10)
(transduce (map inc) (completing (fn [r x] (update r (even? x) (fnil conj []) x))) {}))
I could write:
(->> (range 10)
(transduce (map inc) (group-by even?)))
Maybe something like this?
(defn group-by
([f]
(fn
([] (transient {}))
([r] (persistent! r))
([r x]
(let [k (f x)]
(assoc! r k (conj (get r k []) x))))))
([f coll]
(persistent!
(reduce
(fn [ret x]
(let [k (f x)]
(assoc! ret k (conj (get ret k []) x))))
(transient {}) coll))))