From efc31058d30dca0bd839ca0d2bad582b1c42d5b8 Mon Sep 17 00:00:00 2001 From: Jake Hawken Date: Sun, 10 Jul 2022 15:30:20 -0700 Subject: [PATCH] (Hopefully) fixed some threading issues related to merging Futures. --- .../PromiseAndFuture/Future+Combine.swift | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Sources/Propagate/PromiseAndFuture/Future+Combine.swift b/Sources/Propagate/PromiseAndFuture/Future+Combine.swift index ee26864..a11f77a 100644 --- a/Sources/Propagate/PromiseAndFuture/Future+Combine.swift +++ b/Sources/Propagate/PromiseAndFuture/Future+Combine.swift @@ -16,18 +16,20 @@ public extension Future { static func merge(_ futures: [Future]) -> Future<[T], E> { let promise = Promise<[T], E>() - futures.forEach { - $0.finally { (_) in - promise.future.lockQueue.sync { - let results = futures.compactMap { $0.result } - let failures = results.compactMap { $0.failure } - if let firstError = failures.first { - promise.reject(firstError) - } + futures.forEach { future in + future.finally { (_) in + promise.future.lockQueue.async { guard promise.future.isComplete == false else { return } - let successValues = results.compactMap { $0.success } + + if let errorFuture = futures.first(where: { $0.failed }), + let error = errorFuture.error { + promise.reject(error) + return + } + + let successValues = futures.compactMap(\.value) guard successValues.count == futures.count else { return }