[swift-evolution] [Pitch] KeyPath based map, flatMap, filter

Hooman Mehr hooman at mac.com
Sat Jul 8 15:10:36 CDT 2017

I like this promote operator idea. I have been defining similar operators for specific projects almost at random. It makes sense to come up with a well-defined behavior and name for such operators, as a common practice as you suggest.

The problem with the postfix operator is that it does not currently work without an extra set of parenthesis:

postfix operator ^

postfix func ^<T,U>(lhs: KeyPath<T,U>) -> (T)->U { return { $0[keyPath: lhs] } }

struct Guy { let name: String }

let guys = [
    Guy(name: "Benjamin"),
    Guy(name: "Dave"),
    Guy(name: "Brent"),
    Guy(name: "Max")

guys.map(\.name^) // Error: Invalid component of Swift key path

guys.map((\.name)^) // This works

Is this a bug? 

That is the reason I used a prefix operator (~) in my suggestion in the a previous e-mail on this thread.

> On Jul 7, 2017, at 4:27 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> By the way, if you're worried about whether subtyping will fly, I've
> recently been thinking there might be a role for a “promotion” operator
> that enables lossless “almost-implicit” conversions, e.g.:
>    someNumber^      is equivalent to    numericCast(someNumber)
>    \.someKeyPath^   is equivalent to    { $0\.someKeyPath }
>    someSubstring^   is equivalent to    String(someSubstring)
>    etc.
> This convenience can be implemented by anyone today for keypaths, and
> will provide nearly the syntax you're looking for.  This is exactly the
> sort of thing I'd love to see become a widespread existing practice
> before we incorporate it in the standard library, so we could properly
> judge its impact on real code.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170708/e58952a0/attachment.html>

More information about the swift-evolution mailing list