[swift-evolution] [Pitch] Add an all algorithm to Sequence
Sean Heber
sean at fifthace.com
Fri Mar 31 10:42:27 CDT 2017
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/9a778e904c9be8a3692edd19bb757b23c54aacbe/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
More information about the swift-evolution
mailing list