> For the complete documentation index, see [llms.txt](https://demystifyfp.gitbook.io/fstoolkit-errorhandling/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://demystifyfp.gitbook.io/fstoolkit-errorhandling/fstoolkit.errorhandling.icedtasks/index/parallelzip.md).

# parallelZip

### CancellableTaskResult.parallelZip

Namespace: `FsToolkit.ErrorHandling`

Function Signature:

```fsharp
CancellableTaskResult<'left, 'Error>
  -> CancellableTaskResult<'right, 'Error>
  -> CancellableTaskResult<'left * 'right, 'Error>
```

Takes two `CancellableTaskResult` values, starts them **concurrently**, and returns a tuple of the results once both complete. If either computation returns an `Error`, that error is returned.

Unlike [`zip`](/fstoolkit-errorhandling/fstoolkit.errorhandling.icedtasks/index/zip.md), both computations are started before waiting for either to complete, which can improve throughput when the two operations are independent.

### Examples

#### Example 1

Fetching two independent resources in parallel:

```fsharp
let getUserAndPermissions (userId: UserId) : CancellableTaskResult<User * Permission list, string> =
    CancellableTaskResult.parallelZip
        (fetchUser userId)
        (fetchPermissions userId)
```

#### Example 2

Combining two concurrent API calls in a larger computation:

```fsharp
let loadDashboard (userId: UserId) : CancellableTaskResult<Dashboard, string> =
    cancellableTaskResult {
        let! user, settings =
            CancellableTaskResult.parallelZip
                (fetchUser userId)
                (fetchUserSettings userId)
        return buildDashboard user settings
    }
```

#### Example 3

Unlike [`zip`](/fstoolkit-errorhandling/fstoolkit.errorhandling.icedtasks/index/zip.md), both tasks are started at the same time — neither is skipped even if the other returns an error first:

```fsharp
let validateCredentials (username: string) (password: string) : CancellableTaskResult<User * Role, AuthError> =
    CancellableTaskResult.parallelZip
        (lookupUser username)          // both run concurrently
        (lookupRole username)          // both run concurrently; short-circuits on first Error
```
