core icon indicating copy to clipboard operation
core copied to clipboard

Replace `Future.flatMap` with `Future.then`?

Open MrMage opened this issue 7 years ago • 2 comments

Currently, Future.flatMap is implemented like this: https://github.com/vapor/core/blob/fda3ebda8046af7c9a886fa4a5cfd886111ac23e/Sources/Async/Future%2BMap.swift#L45

Would it be possible to call through to SwiftNIO's implementation of Future.then instead?

https://github.com/apple/swift-nio/blob/6f3671de4ed1350b86762e0da317075f69983f7d/Sources/NIO/EventLoopFuture.swift#L437

Let me know if I'm missing something.

MrMage avatar Nov 23 '18 11:11 MrMage

It's certainly possible, all you need to mind is that flatMap allows the closure to throw, while then does not.

This should be equivalent to the current implementation:

extension Future {
    func flatmap2<T>(to type: T.Type = T.self, _ callback: @escaping (Expectation) throws -> Future<T>) -> Future<T> {
        return self.then { [eventLoop = self.eventLoop] expectation in
            do {
                return try callback(expectation)
            } catch {
                return eventLoop.newFailedFuture(error: error)
            }
        }
    }
}

vzsg avatar Nov 23 '18 15:11 vzsg

Thanks! I did not spot that then does not take a throwing closure. Leaving this open in case we want to change the implementation, e.g. for Vapor 4 (although this should be a non-breaking change anyway).

MrMage avatar Nov 26 '18 08:11 MrMage