Hi Boris, welcome to Clojure!
This function looks reasonable to me. In your example, you don't need
to write "#(identity %)" -- just "identity" is enough. If you want to
preserve the order of objects in the sequence, you can use a vector
instead of a list.
I would use "contains?" in the conditional test. It took me a while
to realize that the values in amap will never be false/nil, so you
don't have to worry about (amap key) being logical false. But in
other uses of maps, that can be a concern.
So here's my version:
(defn seq-to-multimap [s key-fn]
(reduce
(fn [amap item]
(let [key (key-fn item)]
(assoc amap key
(if (contains? amap key)
(conj (amap key) item)
[item]))))
{} s))
As to whether this should return a map or a list of lists, that all
depends on what you want to use it for. Here's a nice demonstration:
user> (seq-to-multimap (range 1 15) #(mod % 5))
{0 [5 10], 4 [4 9 14], 3 [3 8 13], 2 [2 7 12], 1 [1 6 11]}
-SS
On Apr 28, 4:19 pm, Boris Mizhen <[email protected]> wrote:
> Hello all,
>
> I am starting to learn clojure. I would appreciate comments on the
> utility function below.
> Coding style, idiomatic Clojure, comment style, efficiency, naming
> conventions, indentations (used slime) ... anything I should
> improve :)
>
> (defn seq-to-multimap [s key-fn]
> "takes a sequence s of possibly repeating elements
> and converts it to a map, where keys are obtained by applying key-
> fn
> to elements of s and values are sequence of all elements of s with
> the
> particular key"
> (reduce
> (fn [amap item]
> (let [key (key-fn item)]
> (assoc amap key
> (if-let [it (amap key)]
> (conj it item)
> (list item)))))
> {} s))
>
> user> (seq-to-multimap [1 :key :key 2 3 3 nil] #(identity %1))
> {nil (nil), 3 (3 3), 2 (2), :key (:key :key), 1 (1)}
>
> Would it be better to have this function to create a list of lists
> using an equality op instead?
>
> Thank you!
> Boris
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---