# Fx.zipWith

Zips two Fx streams in strict lockstep and combines each pair with a function.
Emits `f(a, b)` when both streams have produced their next value.

**Completion:** Completes when the **first** of the two streams completes.
**Errors:** The first failure from either stream fails the result.

## Signatures

```ts
export declare const zipWith: {
    <A, A2, E2, R2, B>(that: Fx<A2, E2, R2>, f: (a: A, b: A2) => B): <E, R>(self: Fx<A, E, R>) => Fx<B, E | E2, R | R2>;
    <A, E, R, A2, E2, R2, B>(self: Fx<A, E, R>, that: Fx<A2, E2, R2>, f: (a: A, b: A2) => B): Fx<B, E | E2, R | R2>;
};
```

## Why

`zipWith` combines each strict pair immediately, preserving `zip`'s lockstep cardinality and
ordering while avoiding a separate tuple mapping step.

## Ownership and lifetime

It inherits `zip`'s two child runs and unbounded unmatched-value queues. The pure combiner adds no
resource, error, or service requirement.

## Examples

```ts
import { Fx } from "@typed/fx"
const sums = Fx.zipWith(Fx.fromIterable([1]), Fx.fromIterable([2]), (a, b) => a + b)
```
