Skip to content

Fetch.variables.paginatedFetch

fx-fetch


fx-fetch / Fetch / paginatedFetch

const paginatedFetch: {<A, E, R>(request, onResponse): Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>; <A, E, R>(onResponse): (request) => Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>; }

Defined in: packages/fx-fetch/src/Fetch/paginatedFetch.ts:65

<A, E, R>(request, onResponse): Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>

A

E

R

Request

OnResponse<A, E, R>

Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>

0.1.0

paginatedFetchStream

import { Effect, Option, Schema } from 'effect';
import { Fetch, Request, Response } from 'fx-fetch';
class Person extends Schema.Class<Person>('Person')({
id: Schema.Number,
name: Schema.NonEmptyString,
}) {}
const PayloadSchema = Schema.Struct({
nextToken: Schema.String.pipe(Schema.optional),
items: Person.pipe(Schema.Array),
});
const request = Request.unsafeMake({ url: './persons' });
// ┌─── Effect.Effect<
// │ Person[][], // ◀︎── array of pages
// │ | Fetch.FetchError | Fetch.AbortError | Fetch.NotAllowedError | Response.NotOkError
// │ | MalformedJsonError
// │ | ParseError,
// │ Fetch.Fetch
// │ >
// ▼
const program = Fetch.paginatedFetch(
request,
Effect.fn(function* (lastResponse) {
const payload = yield* Response.readJsonWithSchema(lastResponse, PayloadSchema);
const nextToken = Option.fromNullable(payload.nextToken);
const nextRequest = nextToken.pipe(
Option.map((token) => Request.setUrlSearchParam(request, 'token', token))
);
return {
pageEmission: payload.items, // ◀︎── Person[]
nextRequest, // ◀︎── Option.Option<Request.Request>
};
})
);

<A, E, R>(onResponse): (request) => Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>

A

E

R

OnResponse<A, E, R>

(request): Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>

Request

Effect<readonly A[], FetchError | AbortError | NotAllowedError | NotOkError | E, Fetch | R>

0.1.0

paginatedFetchStream

import { Effect, Option, Schema } from 'effect';
import { Fetch, Request, Response } from 'fx-fetch';
class Person extends Schema.Class<Person>('Person')({
id: Schema.Number,
name: Schema.NonEmptyString,
}) {}
const PayloadSchema = Schema.Struct({
nextToken: Schema.String.pipe(Schema.optional),
items: Person.pipe(Schema.Array),
});
const request = Request.unsafeMake({ url: './persons' });
// ┌─── Effect.Effect<
// │ Person[][], // ◀︎── array of pages
// │ | Fetch.FetchError | Fetch.AbortError | Fetch.NotAllowedError | Response.NotOkError
// │ | MalformedJsonError
// │ | ParseError,
// │ Fetch.Fetch
// │ >
// ▼
const program = Fetch.paginatedFetch(
request,
Effect.fn(function* (lastResponse) {
const payload = yield* Response.readJsonWithSchema(lastResponse, PayloadSchema);
const nextToken = Option.fromNullable(payload.nextToken);
const nextRequest = nextToken.pipe(
Option.map((token) => Request.setUrlSearchParam(request, 'token', token))
);
return {
pageEmission: payload.items, // ◀︎── Person[]
nextRequest, // ◀︎── Option.Option<Request.Request>
};
})
);

0.1.0

paginatedFetchStream

import { Effect, Option, Schema } from 'effect';
import { Fetch, Request, Response } from 'fx-fetch';
class Person extends Schema.Class<Person>('Person')({
id: Schema.Number,
name: Schema.NonEmptyString,
}) {}
const PayloadSchema = Schema.Struct({
nextToken: Schema.String.pipe(Schema.optional),
items: Person.pipe(Schema.Array),
});
const request = Request.unsafeMake({ url: './persons' });
// ┌─── Effect.Effect<
// │ Person[][], // ◀︎── array of pages
// │ | Fetch.FetchError | Fetch.AbortError | Fetch.NotAllowedError | Response.NotOkError
// │ | MalformedJsonError
// │ | ParseError,
// │ Fetch.Fetch
// │ >
// ▼
const program = Fetch.paginatedFetch(
request,
Effect.fn(function* (lastResponse) {
const payload = yield* Response.readJsonWithSchema(lastResponse, PayloadSchema);
const nextToken = Option.fromNullable(payload.nextToken);
const nextRequest = nextToken.pipe(
Option.map((token) => Request.setUrlSearchParam(request, 'token', token))
);
return {
pageEmission: payload.items, // ◀︎── Person[]
nextRequest, // ◀︎── Option.Option<Request.Request>
};
})
);