Result Type Extensions

Result type extensions for value/error extraction and combining multiple results.

← Back
Language: swift | Tags: result functional error-handling utilities
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())