diff --git a/stdlib/public/core/SequenceAlgorithms.swift b/stdlib/public/core/SequenceAlgorithms.swift index 58fa4cf1e7958..9850b26913f51 100644 --- a/stdlib/public/core/SequenceAlgorithms.swift +++ b/stdlib/public/core/SequenceAlgorithms.swift @@ -488,6 +488,21 @@ extension Sequence { } return false } + + /// Returns a Boolean value indicating whether every element of a sequence + /// satisfies a given predicate. + /// + /// - Parameter predicate: A closure that takes an element of the sequence + /// as its argument and returns a Boolean value that indicates whether + /// the passed element satisfies a condition. + /// - Returns: `true` if the sequence contains only elements that satisfy + /// `predicate`; otherwise, `false`. + @inlinable + public func allSatisfy( + _ predicate: (Element) throws -> Bool + ) rethrows -> Bool { + return try !contains { try !predicate($0) } + } } extension Sequence where Element : Equatable { diff --git a/validation-test/stdlib/SequenceType.swift.gyb b/validation-test/stdlib/SequenceType.swift.gyb index 5af4e46e24263..f5a4ae51442ef 100644 --- a/validation-test/stdlib/SequenceType.swift.gyb +++ b/validation-test/stdlib/SequenceType.swift.gyb @@ -614,6 +614,20 @@ SequenceTypeTests.test("contains/Predicate") { } } +SequenceTypeTests.test("allSatisfy/Predicate") { + for test in findTests { + let s = MinimalSequence>( + elements: test.sequence.map { OpaqueValue($0.value) }) + expectEqual( + test.expected == nil, + s.allSatisfy { $0.value != test.element.value }, + stackTrace: SourceLocStack().with(test.loc)) + expectEqual( + test.expectedLeftoverSequence.map { $0.value }, s.map { $0.value }, + stackTrace: SourceLocStack().with(test.loc)) + } +} + //===----------------------------------------------------------------------===// // reduce() //===----------------------------------------------------------------------===//