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.
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
