[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Result](https://evolu.dev/docs/api-reference/common/Result) › NextResult

```ts
type NextResult<A, E, D> = Result<A, E | Done<D>>;
```

Defined in: [packages/common/src/Result.ts:768](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Result.ts#L768)

A result for a pull-based protocol with three outcomes.

The consumer requests the next value (e.g. via `next()`), and the producer
responds with one of:

- An [Ok](https://evolu.dev/docs/api-reference/common/Result/interfaces/Ok) containing `A` — produced a value
- An [Err](https://evolu.dev/docs/api-reference/common/Result/interfaces/Err) containing [Done](https://evolu.dev/docs/api-reference/common/Result/interfaces/Done) — completed normally with a done value
- An [Err](https://evolu.dev/docs/api-reference/common/Result/interfaces/Err) containing `E` — failed with an error

Inspired by JavaScript's `Iterator.next()`, which returns `{ value, done }`.

### Example

```ts
import {
  assertErr,
  assertOk,
  assertType,
  done,
  err,
  ok,
  type NextResult,
  type Typed,
} from "@evolu/common";

const next = (index: number): NextResult<string, ReadFailedError, number> => {
  if (index === 0) return ok("first");
  if (index === 1) return err({ type: "ReadFailed" });
  return err(done(index));
};

interface ReadFailedError extends Typed<"ReadFailed"> {}

const value = next(0);
assertType<NextResult<string, ReadFailedError, number>, typeof value>();
assertOk(value, "first");
assertErr(next(1), { type: "ReadFailed" });
assertErr(next(2), { type: "Done", done: 2 });
```