diff --git a/Sources/FoundationEssentials/Predicate/Expressions/Equality.swift b/Sources/FoundationEssentials/Predicate/Expressions/Equality.swift index 7cbfd54bfd..0fca982196 100644 --- a/Sources/FoundationEssentials/Predicate/Expressions/Equality.swift +++ b/Sources/FoundationEssentials/Predicate/Expressions/Equality.swift @@ -40,6 +40,17 @@ extension PredicateExpressions { } } +@available(FoundationPreview 6.4, *) +extension PredicateExpressions { + public static func build_Equal(lhs: LHS, rhs: NilLiteral) -> Equal, Bool>, Value> { + Equal(lhs: OptionalFlatMap(lhs) { _ in Value(true) }, rhs: Value(nil)) + } + + public static func build_Equal(lhs: NilLiteral, rhs: RHS) -> Equal, OptionalFlatMap, Bool>> { + Equal(lhs: Value(nil), rhs: OptionalFlatMap(rhs) { _ in Value(true) }) + } +} + @available(macOS 14.4, iOS 17.4, tvOS 17.4, watchOS 10.4, *) extension PredicateExpressions.Equal : CustomStringConvertible { public var description: String { diff --git a/Sources/FoundationEssentials/Predicate/Expressions/Inequality.swift b/Sources/FoundationEssentials/Predicate/Expressions/Inequality.swift index 5d8ca9b9eb..8d9da71f10 100644 --- a/Sources/FoundationEssentials/Predicate/Expressions/Inequality.swift +++ b/Sources/FoundationEssentials/Predicate/Expressions/Inequality.swift @@ -40,6 +40,17 @@ extension PredicateExpressions { } } +@available(FoundationPreview 6.4, *) +extension PredicateExpressions { + public static func build_NotEqual(lhs: LHS, rhs: NilLiteral) -> NotEqual, Bool>, Value> { + NotEqual(lhs: OptionalFlatMap(lhs) { _ in Value(true) }, rhs: Value(nil)) + } + + public static func build_NotEqual(lhs: NilLiteral, rhs: RHS) -> NotEqual, OptionalFlatMap, Bool>> { + NotEqual(lhs: Value(nil), rhs: OptionalFlatMap(rhs) { _ in Value(true) }) + } +} + @available(macOS 14.4, iOS 17.4, tvOS 17.4, watchOS 10.4, *) extension PredicateExpressions.NotEqual : CustomStringConvertible { public var description: String { diff --git a/Tests/FoundationEssentialsTests/PredicateTests.swift b/Tests/FoundationEssentialsTests/PredicateTests.swift index b16223c3ef..98654869f4 100644 --- a/Tests/FoundationEssentialsTests/PredicateTests.swift +++ b/Tests/FoundationEssentialsTests/PredicateTests.swift @@ -541,4 +541,16 @@ private struct PredicateTests { #expect(try expression.evaluate(i) == i + 1) } } + + @Test(arguments: [#Predicate { $0 == nil }, #Predicate { nil == $0 }]) + func nilLiteral(equality: Predicate) throws { + #expect(try equality.evaluate(nil)) + #expect(try !equality.evaluate(Object(a: 9, b: "abc", c: 0.72, d: 64, e: "c", f: true, g: [5, 7, 5, 1]))) + } + + @Test(arguments: [#Predicate { $0 != nil }, #Predicate { nil != $0 }]) + func nilLiteral(inequality: Predicate) throws { + #expect(try !inequality.evaluate(nil)) + #expect(try inequality.evaluate(Object(a: 9, b: "abc", c: 0.72, d: 64, e: "c", f: true, g: [5, 7, 5, 1]))) + } }