[swift-evolution] [Pitch] Add an all algorithm to Sequence
Ben Cohen
ben_cohen at apple.com
Fri Mar 31 10:28:00 CDT 2017
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 <file:///Users/ben_cohen/Documents/swift-evolution/proposals/0162-all-algorithm.md>
Authors: Ben Cohen <https://github.com/airspeedswift>
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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170331/12595132/attachment.html>
More information about the swift-evolution
mailing list