В Clojure я хотел бы объединить несколько карт в одну карту, где сопоставления с одним и тем же ключом объединяются в список.
Например:
{:humor :happy} {:humor :sad} {:humor :happy} {:weather :sunny}
должно привести к:
{:weather :sunny, :humor (:happy :sad :happy)}
Я думал о:
(merge-with (comp flatten list) data)
Но это неэффективно, потому что flatten имеет сложность O (n) .
Тогда я придумал:
(defn agg[x y] (if (coll? x) (cons y x) (list y x)))
(merge-with agg data)
Но это не идиоматический . Любая другая идея?