[swift-evolution] [Proposal] mapValues

Jacob Bandes-Storch jtbandes at gmail.com
Wed Apr 13 12:02:57 CDT 2016


To adhere to the API Design Guidelines, I think it should be named
"mappingValues", right?

On Wed, Apr 13, 2016 at 4:23 AM, Vladimir.S via swift-evolution <
swift-evolution at swift.org> wrote:

> As for mapKeys and many values into a single key. I believe we should have
> a choice - do we expect multiply values for the same key or not. Just like
> "+" and integer overflow : by default it raises the error, but if "&+" - we
> expect the overflow. I can imagine situations when it is ok for me to have
> different values for the same key(if I don't care which of values should be
> for that key in result dictionary).
> So my proposal is some additional mapKey(allowMultiplyValues: true) {...}
> or in any other form/name.
>
> On 13.04.2016 13:38, Ross O'Brien via swift-evolution wrote:
>
>> +1 on mapValues.
>>
>> DictionaryLiteral already throws an exception if it includes duplicate
>> keys, so I'd expect mapKeys to throw an error if multiple source keys
>> mapped to the same destination key.
>>
>> On Wed, Apr 13, 2016 at 11:28 AM, Miguel Angel Quinones via
>> swift-evolution
>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>
>>     I'm +1 for adding mapValues. Very useful functionality and trivial to
>>     implement.
>>
>>      > > I.e. I suggest to implement and mapKeys() also. It could be also
>>     useful in some situations.
>>     > `mapKeys` is much more dangerous, because you could end up mapping
>> many values into a single key. You kind of need to combine the values
>> somehow. Perhaps:
>>     >
>>     > extension Dictionary {
>>      > func mapValues__(_ valueTransform: @noescape Value throws
>>     ->OutValue) rethrows ->[Key: OutValue] { … }
>>      >
>>      > func mapKeys__(_ keyTransform: @noescape Key throws ->OutKey)
>>     rethrows ->[OutKey: [Value]] { … }
>>     >
>>     > // Possibly flatMap variants, too?
>>     > }
>>     >
>>     > extension Dictionary where Value: Sequence {
>>      > func reduceValues__(_ initial: OutValue, combine: @noescape
>>     (OutValue, Value.Iterator.Element) throws ->OutValue) rethrows ->[Key:
>>     OutValue] {
>>     > return mapValues { $0.reduce(initial, combine: combine) }
>>     > }
>>     > }
>>     >
>>     > Which you would end up using like this:
>>     >
>>     > let wordFrequencies: [String: Int] = …
>>     > let firstLetterFrequencies: [Character: Int] =
>> wordFrequencies.mapKeys { $0.characters.first! }.reduceValues(0, combine: +)
>>     >
>>     > --
>>     > Brent Royal-Gordon
>>     > Architechies
>>     >
>>     >
>>     >
>>     >______
>>
>>     --
>>     Miguel Angel Quinones
>>
>>     _______________________________________________
>>     swift-evolution mailing list
>>     swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>     https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160413/2e855e88/attachment.html>


More information about the swift-evolution mailing list