我经常发现自己需要编写一个和 `group-by` 做的事情相同的降低函数。如果 `group-by` 可以返回一个降低函数(而不需要导入 Christophe Grand 的 xforms 库)那就方便多了。所以而不是写
(->> (range 10)
(transduce (map inc) (completing (fn [r x] (update r (even? x) (fnil conj []) x))) {}))
我可以写
(->> (range 10)
(transduce (map inc) (group-by even?)))
也许像这样?
(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))))