//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2022-2023 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// @available(FoundationPredicate 0.1, *) public struct Predicate : Sendable { public let expression : any StandardPredicateExpression public let variable: (repeat PredicateExpressions.Variable) public init(_ builder: (repeat PredicateExpressions.Variable) -> any StandardPredicateExpression) { self.variable = (repeat PredicateExpressions.Variable()) self.expression = builder(repeat each variable) } public func evaluate(_ input: repeat each Input) throws -> Bool { try expression.evaluate( .init(repeat (each variable, each input)) ) } } @freestanding(expression) @available(FoundationPredicate 0.1, *) public macro Predicate(_ body: (repeat each Input) -> Bool) -> Predicate = #externalMacro(module: "FoundationMacros", type: "PredicateMacro") @available(FoundationPredicate 0.1, *) extension Predicate { private init(value: Bool) { self.variable = (repeat PredicateExpressions.Variable()) self.expression = PredicateExpressions.Value(value) } public static var `true`: Self { Self(value: true) } public static var `false`: Self { Self(value: false) } } // Namespace for operator expressions @available(FoundationPredicate 0.1, *) @frozen @_nonSendable public enum PredicateExpressions {} @available(FoundationPredicate 0.1, *) extension Sequence { public func filter(_ predicate: Predicate) throws -> [Element] { try self.filter { try predicate.evaluate($0) } } }