From 51bbf08c38fad8b30f4516580c1fe0063bee95d8 Mon Sep 17 00:00:00 2001 From: AZero13 Date: Fri, 5 Dec 2025 17:41:37 -0500 Subject: [PATCH] Fix OptionalFlatMap evaluation for non-optional transform results The value should be wrapped (or overloads split) instead of force-cast. --- .../Predicate/Expressions/Optional.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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) } } }