nit: should these names be `all(matching)`/`all(equalTo)` per API Design Guidelines? > On Mar 31, 2017, at 8:28 AM, Ben Cohen via swift-evolution > <swift-evolution@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 > > <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 > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution