I really like this proposal. This is one of the first extensions I add to a new Swift project. I think if we’re going to add `all`, we should consider adding `none` as well. `none` can be used currently as `!contains`, but sometimes boolean logic like that can be hard to follow.
Soroush > 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 anallalgorithm toSequence > 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 toSequence. > > Motivation > > You can achieve this in Swift 3 withcontainsby 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 realizecontainscan be used this way, so may hand-roll their > ownforloop, which could be buggy, or compose other inefficient alternatives: > > // misses opportunity to bail earlynums.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 onSequencewhich test every element and returntrueif > they match: > > nums.all(equal:9) nums.all(match: isOdd) > Detailed design > > Add the following extensions toSequence: > > extensionSequence{/// Returns a Boolean value indicating whether every > element of the sequence/// satisfies the given predicate.funcall(match > criteria:(Iterator.Element)throws->Bool)rethrows->Bool}extensionSequencewhereIterator.Element:Equatable{/// > Returns a Boolean value indicating whether every element of the sequence/// > equals the given element.funcall(equalelement: 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
