const somePipeline = (newUser): Result<Error, User> => pipe(
TE.of(newUser),
TE.flatMap(createUserInDB),
TE.flatMap(someOtherAsyncStepThatMightFail),
TE.orElse((originalError) => pipe(
removeUserFromDBOnFail(newUser.email),
// if we successfully removed user then return original error else return the error why we couldn't recover
TE.map(() => originalError),
TE.toUnion,
)),
// Result<E, never> or Result<never, User>
TE.bimap(asFailure, asSuccess),
// We remained on the left track even after successfully recovering by deleting the user we just added.
TE.toUnion,
)
const somePipeline = (newUser): Result<Error, User> => pipe(
TE.of(newUser),
TE.flatMap(createUserInDB),
TE.flatMap(someOtherAsyncStepThatMightFail),
TE.orElse((originalError) => pipe(
removeUserFromDBOnFail(newUser.email),
// if we successfully removed user then return original error else return the error why we couldn't recover
TE.map(() => originalError),
TE.toUnion,
)),
// Result<E, never> or Result<never, User>
TE.bimap(asFailure, asSuccess),
// We remained on the left track even after successfully recovering by deleting the user we just added.
TE.toUnion,
)