Hi Dave,
Yes, merge-reduce is the name I like too.
Stu
> Hi Michal,
> I needed to change your containsKey implementation to always return
> true in order to support the merge-with use case.
>
> Hi Stu,
> merge-with* seems like a useful addition, though its semantics differ
> slightly from merge-with's. The original merge-with modifies the vals
> only if there are duplicate keys. Perhaps call it merge-reduce?
>
> For what it's worth, when I had this particular problem, I only wanted
> duplicates vector-ized. I used a non-trivial merge function:
> (let [merge-fn (fn [result latter]
> (if (vector? result)
> (conj result latter)
> [result latter]))]
> (merge-with merge-fn {:a 1} {:a 2} {:a 3 :b 1}))
> ;{:b 1, :a [1 2 3]}
>
>
> On Thu, Jul 8, 2010 at 3:16 PM, Stuart Halloway
> <[email protected]> wrote:
>> Hi Michał,
>>
>> The underlying problem (using merge-with plus an accumulating fn) has come
>> up before on the list. One proposal was a variant of merge-with that always
>> applies the merge function [1].
>>
>> I think the underlying issue needs to be solved at merge-with, not at the
>> map data structure. In other words, why isn't merge-with like reduce, with a
>> second variant taking an initial seed value [2]?
>>
>> Useful? Am I crazy? (Not mutually exclusive.)
>>
>> Stu
>>
>> [1]
>> http://groups.google.com/group/clojure/browse_thread/thread/b8a5195439c7b435
>> [2] http://gist.github.com/468449
>>
>>> Hi Group,
>>>
>>> I've just written an implementation of a persistent map which provides
>>> a default value -- fixed at creation time the way it's currently
>>> implemented -- and claims that it .containsKey every key thrown at it.
>>> The code is here:
>>>
>>> http://gist.github.com/468332
>>>
>>> As mentioned in a comment, the small parts which aren't entirely
>>> trivial are taken more or less directly from emit-defrecord (minus its
>>> generic nature).
>>>
>>> My primary purpose was to devise a helper map type for use with
>>> merge-with, so that I can say
>>>
>>> (merge-with conj (DefaultMap. [] {}) {:a 1} {:a 2} {:a 3})
>>>
>>> and get back
>>>
>>> {:a [1 2 3]}
>>>
>>> Any comments? In particular, do the implementations of hashCode,
>>> equals and getLookupThunk look alright?
>>>
>>> Sincerely,
>>> Michał
>>>
>>> --
>>> 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
>>
>> --
>> 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
>
> --
> 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
--
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