[swift-evolution] [Pitch] Add an all algorithm to Sequence

Xiaodi Wu xiaodi.wu at gmail.com
Fri Mar 31 10:48:10 CDT 2017


Agree, this is a nice addition as-is.


On Fri, Mar 31, 2017 at 10:42 AM, Sean Heber via swift-evolution <
swift-evolution at swift.org> wrote:

> I like it.
>
> l8r
> Sean
>
>
> > On Mar 31, 2017, at 10:28 AM, Ben Cohen via swift-evolution <
> swift-evolution at swift.org> wrote:
> >
> > Hi,
> >
> > A short proposal for you as part of the algorithms theme. Hopefully
> non-controversial, aside from the naming of the method and arguments, about
> which controversy abounds. Online copy here: https://github.com/
> airspeedswift/swift-evolution/blob/9a778e904c9be8a3692edd19bb757b
> 23c54aacbe/proposals/0162-all-algorithm.md
> >
> >
> > Add an all algorithm to Sequence
> >
> >       • Proposal: SE-NNNN
> >       • Authors: Ben Cohen
> >       • Review Manager: TBD
> >       • Status: Awaiting review
> > Introduction
> >
> > It is common to want to confirm that every element of a sequence equals
> a value, or matches a certain criteria. Many implementations of this can be
> found in use on github. This proposal adds such a method to Sequence.
> >
> > Motivation
> >
> > You can achieve this in Swift 3 with contains by negating both the
> criteria and the result:
> >
> > // every element is 9
> >
> > !nums.
> > contains { $0 != 9
> >  }
> >
> > // every element is odd
> >
> > !nums.
> > contains { !isOdd($0) }
> > but these are a readability nightmare. Additionally, developers may not
> make the leap to realize contains can be used this way, so may hand-roll
> their own for loop, which could be buggy, or compose other inefficient
> alternatives:
> >
> > // misses opportunity to bail early
> >
> > nums.
> > reduce(true) { $0.0 && $0.1 == 9
> >  }
> >
> > // the most straw-man travesty I could think of...
> > Set(nums).count == 1 && Set(nums).first == 9
> > Proposed solution
> >
> > Introduce two algorithms on Sequence which test every element and return
> true if they match:
> >
> > nums.all(equal: 9
> > )
> > nums.all(match: isOdd)
> >
> > Detailed design
> >
> > Add the following extensions to Sequence:
> >
> > extension Sequence
> > {
> >
> > /// Returns a Boolean value indicating whether every element of the
> sequence
> >
> >
> > /// satisfies the given predicate.
> >
> >
> > func all(match criteria: (Iterator.Element) throws -> Bool) rethrows ->
> Bool
> >
> > }
> >
> >
> > extension Sequence where Iterator.Element: Equatable
> > {
> >
> > /// Returns a Boolean value indicating whether every element of the
> sequence
> >
> >
> > /// equals the given element.
> >
> >
> > func all(equal element: Iterator.Element) -> Bool
> >
> > }
> >
> > Source compatibility
> >
> > This change is purely additive so has no source compatibility
> consequences.
> >
> > Effect on ABI stability
> >
> > This change is purely additive so has no ABI stability consequences.
> >
> > Effect on API resilience
> >
> > This change is purely additive so has no API resilience consequences.
> >
> > Alternatives considered
> >
> > Not adding it.
> > _______________________________________________
> > 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/20170331/dc875f09/attachment.html>


More information about the swift-evolution mailing list