The reduce-by approach (while cool) would not work for me because I need to run multiple queries on the results.
- Dmitry On Oct 18, 10:54 am, Alex Osborne <a...@meshy.org> wrote: > Alex Osborne wrote: > > If the three output lists themselves are too large, I'd just explicitly > > sum your units with reduce: > > > (reduce > > (fn [counts data] > > (let [type (record-type data)] > > (assoc counts type (+ (units data) > > (get counts type 0))))) > > {} (get-idata)) > > > => {:sales 1233, :upgrades 17, :demos 42, nil 30} > > Actually come to think of it, this sort of thing is common enough that > you could pull out a 'reduce-by' function like this: > > (defn reduce-by [grouper f val coll] > (reduce > (fn [m x] > (let [group (grouper x)] > (assoc m group (f (get m group val) x)))) > (sorted-map) coll)) > > Then group-by could be easily defined in terms of it: > > (defn group-by [f coll] > (reduce-by f conj [] coll)) > > And it makes your unit summing example: > > (reduce-by record-type > (fn [count data] (+ count (units data))) > 0 (get-idata)) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---