Result Type Extensions
Result type extensions for value/error extraction and combining multiple results.
extension Result {
/// Get value or nil
var value: Success? {
if case .success(let value) = self { return value }
return nil
}
/// Get error or nil
var error: Failure? {
if case .failure(let error) = self { return error }
return nil
}
/// Combine two results into a tuple
func zip<T>(_ other: Result<T, Failure>) -> Result<(Success, T), Failure> {
flatMap { value in other.map { (value, $0) } }
}
}
/// Combine multiple results
func zip<A, B, E: Error>(
_ a: Result<A, E>,
_ b: Result<B, E>
) -> Result<(A, B), E> {
a.zip(b)
}
func zip<A, B, C, E: Error>(
_ a: Result<A, E>,
_ b: Result<B, E>,
_ c: Result<C, E>
) -> Result<(A, B, C), E> {
a.zip(b).zip(c).map { ($0.0, $0.1, $1) }
}
// Usage:
// let result: Result<User, Error> = .success(user)
// if let user = result.value { print(user) }
// let combined = zip(fetchUser(), fetchPosts(), fetchComments())