[swift-evolution] [Proposal] mapValues
Vladimir.S
svabox at gmail.com
Wed Apr 13 06:23:07 CDT 2016
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
>
More information about the swift-evolution
mailing list