Hi,

As I was trying to wrap my head around the reducers library[1], I thought
implementing group-by would be a good exercise to gain some insight.

After spending a few hours with it, I'm still pretty much clueless, so hope
to find someone here to help me out:

So if I understood the reducer lingo introduced in [2],[3] and group-by
correctly, it reduces the following reducing function on a collection

(fn group-by-reducef [keyfn ret x]
     (let [k (keyfn x)]
        (assoc ret k (conj (get ret k []) x))))

where keyfn is provided by a partial function application.

fold needs a combining function that takes two result maps that have
already been grouped and merges them.
A naive implementation could look like

(defn group-by-combinef
  ([] {})
  ([g1 g2]
     (persistent!
      (reduce (fn [res k v]
                (assoc! res k (into (get res k []) v)))
              (transient g1) g2))))

(defn group-by [f coll]
  (fold (partial gr-by-reducef f) gr-by-combinef coll))

Now couple of questions:
1) I expected fold to actually perform the operation, how can I force it to
give me the result?
2) Can somehow the actual reducing at the leaf nodes still take advantage
of transient collections?
3) I took a look at flatten as it seems the "closest" match. Again, if I
call (flatten [[1 2] [2 4]]), I don't actually get the result. How do I get
to the result?


Thanks!

[1]
https://github.com/clojure/clojure/blob/master/src/clj/clojure/core/reducers.clj
[2]
http://clojure.com/blog/2012/05/08/reducers-a-library-and-model-for-collection-processing.html
[3] http://clojure.com/blog/2012/05/15/anatomy-of-reducer.html
-- 
László Török

-- 
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

Reply via email to