Namespace: FsToolkit.ErrorHandling
Function Signature:
CancellableTaskResult<'left, 'Error>
-> CancellableTaskResult<'right, 'Error>
-> CancellableTaskResult<'left * 'right, 'Error>Takes two CancellableTaskResult values, runs them serially (left then right), and returns a tuple of the results. If either computation returns an Error, the error is returned and the remaining computation (if any) is not executed.
Fetching two pieces of data serially and combining them:
let getUserAndPermissions (userId: UserId) : CancellableTaskResult<User * Permission list, string> =
CancellableTaskResult.zip
(fetchUser userId)
(fetchPermissions userId)Using zip as part of a larger pipeline:
let loadDashboard (userId: UserId) : CancellableTaskResult<Dashboard, string> =
cancellableTaskResult {
let! user, settings =
CancellableTaskResult.zip
(fetchUser userId)
(fetchUserSettings userId)
return buildDashboard user settings
}Combining two independent lookups, short-circuiting on the first error:
let validateCredentials (username: string) (password: string) : CancellableTaskResult<User * Role, AuthError> =
CancellableTaskResult.zip
(lookupUser username) // returns Error if user not found
(lookupRole username) // skipped if lookupUser fails