I've been using a number of similar functions in my own coding. This
was my approach.
(defn seq2map
"Constructs a map from a sequence by applying keyvalfn to each
element of the sequence. keyvalfn should return a pair [key val]
to be added to the map for each input sequence element."
[aseq keyvalfn]
(loop [aseq aseq
amap {}]
(if (empty? aseq)
amap
(let [[key val] (keyvalfn (first aseq))]
(recur (rest aseq)
(assoc amap key val))))))
(defn seq2redundant-map
"Constructs a map from a sequence by applying keyvalfn to each
element of the sequence. keyvalfn should return a pair [key val]
to be added to the map for each input sequence element. If key is
already in the map, its current value will be combined with the new
val using (mergefn curval val)."
[aseq keyvalfn mergefn]
(loop [aseq aseq
amap {}]
(if (empty? aseq)
amap
(let [[key val] (keyvalfn (first aseq))]
(recur (rest aseq)
(update-in amap [key] mergefn val))))))
(defn maphash
"Creates a new map by applying keyfn to every key of in-map and
valfn to every corresponding val."
[keyfn valfn in-map]
(seq2map (seq in-map) (fn [[key val]] [(keyfn key) (valfn val)])))
~Gary
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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