diff --git a/Sources/FoundationEssentials/Predicate/Expressions/Optional.swift b/Sources/FoundationEssentials/Predicate/Expressions/Optional.swift index 18327aa8d..96cc27cee 100644 --- a/Sources/FoundationEssentials/Predicate/Expressions/Optional.swift +++ b/Sources/FoundationEssentials/Predicate/Expressions/Optional.swift @@ -39,11 +39,22 @@ extension PredicateExpressions { self.transform = builder(variable) } - public func evaluate(_ bindings: PredicateBindings) throws -> Output { + // When the transform produces a non-optional Result, wrap it. + public func evaluate(_ bindings: PredicateBindings) throws -> Output where RHS.Output == Result { + var mutableBindings = bindings + return try wrapped.evaluate(bindings).flatMap { inner in + mutableBindings[variable] = inner + let value = try transform.evaluate(mutableBindings) + return Optional(value) + } + } + + // When the transform already produces an optional Result, propagate it. + public func evaluate(_ bindings: PredicateBindings) throws -> Output where RHS.Output == Optional { var mutableBindings = bindings return try wrapped.evaluate(bindings).flatMap { inner in mutableBindings[variable] = inner - return try transform.evaluate(mutableBindings) as! Result? + return try transform.evaluate(mutableBindings) } } }