Skip to main content Link Search Menu Expand Document (external link)

RequestResolver overview

Added in v2.0.0


Table of contents


combinators

around

A data source aspect that executes requests between two effects, before and after, where the result of before can be used by after.

Signature

export declare const around: {
  <A2, R2, X, R3>(
    before: Effect.Effect<A2, never, R2>,
    after: (a: A2) => Effect.Effect<X, never, R3>
  ): <A, R>(self: RequestResolver<A, R>) => RequestResolver<A, R2 | R3 | R>
  <A, R, A2, R2, X, R3>(
    self: RequestResolver<A, R>,
    before: Effect.Effect<A2, never, R2>,
    after: (a: A2) => Effect.Effect<X, never, R3>
  ): RequestResolver<A, R | R2 | R3>
}

Added in v2.0.0

aroundRequests

A data source aspect that executes requests between two effects, before and after, where the result of before can be used by after.

The before and after effects are provided with the requests being executed.

Signature

export declare const aroundRequests: {
  <A, A2, R2, X, R3>(
    before: (requests: readonly Types.NoInfer<A>[]) => Effect.Effect<A2, never, R2>,
    after: (requests: readonly Types.NoInfer<A>[], _: A2) => Effect.Effect<X, never, R3>
  ): <R>(self: RequestResolver<A, R>) => RequestResolver<A, R2 | R3 | R>
  <A, R, A2, R2, X, R3>(
    self: RequestResolver<A, R>,
    before: (requests: readonly Types.NoInfer<A>[]) => Effect.Effect<A2, never, R2>,
    after: (requests: readonly Types.NoInfer<A>[], _: A2) => Effect.Effect<X, never, R3>
  ): RequestResolver<A, R | R2 | R3>
}

Example

import { Effect, Request, RequestResolver } from "effect"

interface GetUserById extends Request.Request<unknown> {
  readonly id: number
}

const resolver = RequestResolver.fromFunction((request: GetUserById) => ({ id: request.id, name: "John" }))

RequestResolver.aroundRequests(
  resolver,
  (requests) => Effect.log(`got ${requests.length} requests`),
  (requests, _) => Effect.log(`finised running ${requests.length} requests`)
)

Added in v2.0.0

batchN

Returns a data source that executes at most n requests in parallel.

Signature

export declare const batchN: {
  (n: number): <A, R>(self: RequestResolver<A, R>) => RequestResolver<A, R>
  <A, R>(self: RequestResolver<A, R>, n: number): RequestResolver<A, R>
}

Added in v2.0.0

eitherWith

Returns a new data source that executes requests of type C using the specified function to transform C requests into requests that either this data source or that data source can execute.

Signature

export declare const eitherWith: {
  <A extends Request.Request<any, any>, R2, B extends Request.Request<any, any>, C extends Request.Request<any, any>>(
    that: RequestResolver<B, R2>,
    f: (_: Request.Entry<C>) => Either.Either<Request.Entry<B>, Request.Entry<A>>
  ): <R>(self: RequestResolver<A, R>) => RequestResolver<C, R2 | R>
  <
    R,
    A extends Request.Request<any, any>,
    R2,
    B extends Request.Request<any, any>,
    C extends Request.Request<any, any>
  >(
    self: RequestResolver<A, R>,
    that: RequestResolver<B, R2>,
    f: (_: Request.Entry<C>) => Either.Either<Request.Entry<B>, Request.Entry<A>>
  ): RequestResolver<C, R | R2>
}

Added in v2.0.0

locally

Returns a new data source with a localized FiberRef

Signature

export declare const locally: {
  <A>(
    self: FiberRef<A>,
    value: A
  ): <R, B extends Request.Request<any, any>>(use: RequestResolver<B, R>) => RequestResolver<B, R>
  <R, B extends Request.Request<any, any>, A>(
    use: RequestResolver<B, R>,
    self: FiberRef<A>,
    value: A
  ): RequestResolver<B, R>
}

Added in v2.0.0

race

Returns a new data source that executes requests by sending them to this data source and that data source, returning the results from the first data source to complete and safely interrupting the loser.

Signature

export declare const race: {
  <A2 extends Request.Request<any, any>, R2>(
    that: RequestResolver<A2, R2>
  ): <A extends Request.Request<any, any>, R>(self: RequestResolver<A, R>) => RequestResolver<A2 | A, R2 | R>
  <A extends Request.Request<any, any>, R, A2 extends Request.Request<any, any>, R2>(
    self: RequestResolver<A, R>,
    that: RequestResolver<A2, R2>
  ): RequestResolver<A | A2, R | R2>
}

Added in v2.0.0

constructors

fromEffect

Constructs a data source from an effectual function.

Signature

export declare const fromEffect: <R, A extends Request.Request<any, any>>(
  f: (a: A) => Effect.Effect<Request.Request.Success<A>, Request.Request.Error<A>, R>
) => RequestResolver<A, R>

Added in v2.0.0

fromEffectTagged

Constructs a data source from a list of tags paired to functions, that takes a list of requests and returns a list of results of the same size. Each item in the result list must correspond to the item at the same index in the request list.

Signature

export declare const fromEffectTagged: <A extends Request.Request<any, any> & { readonly _tag: string }>() => <
  Fns extends {
    readonly [Tag in A["_tag"]]: [Extract<A, { readonly _tag: Tag }>] extends [infer Req]
      ? Req extends Request.Request<infer ReqA, infer ReqE>
        ? (requests: Req[]) => Effect.Effect<Iterable<ReqA>, ReqE, any>
        : never
      : never
  }
>(
  fns: Fns
) => RequestResolver<A, ReturnType<Fns[keyof Fns]> extends Effect.Effect<infer _A, infer _E, infer R> ? R : never>

Added in v2.0.0

fromFunction

Constructs a data source from a pure function.

Signature

export declare const fromFunction: <A extends Request.Request<any, never>>(
  f: (request: A) => Request.Request.Success<A>
) => RequestResolver<A, never>

Added in v2.0.0

fromFunctionBatched

Constructs a data source from a pure function that takes a list of requests and returns a list of results of the same size. Each item in the result list must correspond to the item at the same index in the request list.

Signature

export declare const fromFunctionBatched: <A extends Request.Request<any, never>>(
  f: (chunk: A[]) => Iterable<Request.Request.Success<A>>
) => RequestResolver<A, never>

Added in v2.0.0

make

Constructs a data source with the specified identifier and method to run requests.

Signature

export declare const make: <A, R>(runAll: (requests: A[][]) => Effect.Effect<void, never, R>) => RequestResolver<A, R>

Added in v2.0.0

makeBatched

Constructs a data source from a function taking a collection of requests and returning a RequestCompletionMap.

Signature

export declare const makeBatched: <A extends Request.Request<any, any>, R>(
  run: (requests: A[]) => Effect.Effect<void, never, R>
) => RequestResolver<A, R>

Added in v2.0.0

makeWithEntry

Constructs a data source with the specified identifier and method to run requests.

Signature

export declare const makeWithEntry: <A, R>(
  runAll: (requests: Request.Entry<A>[][]) => Effect.Effect<void, never, R>
) => RequestResolver<A, R>

Added in v2.0.0

never

A data source that never executes requests.

Signature

export declare const never: RequestResolver<never, never>

Added in v2.0.0

context

mapInputContext

Provides this data source with part of its required context.

Signature

export declare const mapInputContext: {
  <R0, R>(
    f: (context: Context.Context<R0>) => Context.Context<R>
  ): <A extends Request.Request<any, any>>(self: RequestResolver<A, R>) => RequestResolver<A, R0>
  <R, A extends Request.Request<any, any>, R0>(
    self: RequestResolver<A, R>,
    f: (context: Context.Context<R0>) => Context.Context<R>
  ): RequestResolver<A, R0>
}

Added in v2.0.0

provideContext

Provides this data source with its required context.

Signature

export declare const provideContext: {
  <R>(
    context: Context.Context<R>
  ): <A extends Request.Request<any, any>>(self: RequestResolver<A, R>) => RequestResolver<A, never>
  <R, A extends Request.Request<any, any>>(
    self: RequestResolver<A, R>,
    context: Context.Context<R>
  ): RequestResolver<A, never>
}

Added in v2.0.0

models

RequestResolver (interface)

A RequestResolver<A, R> requires an environment R and is capable of executing requests of type A.

Data sources must implement the method runAll which takes a collection of requests and returns an effect with a RequestCompletionMap containing a mapping from requests to results. The type of the collection of requests is a Chunk<Chunk<A>>. The outer Chunk represents batches of requests that must be performed sequentially. The inner Chunk represents a batch of requests that can be performed in parallel. This allows data sources to introspect on all the requests being executed and optimize the query.

Data sources will typically be parameterized on a subtype of Request<A>, though that is not strictly necessarily as long as the data source can map the request type to a Request<A>. Data sources can then pattern match on the collection of requests to determine the information requested, execute the query, and place the results into the RequestCompletionMap using RequestCompletionMap.empty and RequestCompletionMap.insert. Data sources must provide results for all requests received. Failure to do so will cause a query to die with a QueryFailure when run.

Signature

export interface RequestResolver<in A, out R = never> extends RequestResolver.Variance<A, R>, Equal.Equal, Pipeable {
  /**
   * Execute a collection of requests. The outer `Chunk` represents batches
   * of requests that must be performed sequentially. The inner `Chunk`
   * represents a batch of requests that can be performed in parallel.
   */
  runAll(requests: Array<Array<Request.Entry<A>>>): Effect.Effect<void, never, R>

  /**
   * Identify the data source using the specific identifier
   */
  identified(...identifiers: Array<unknown>): RequestResolver<A, R>
}

Added in v2.0.0

refinements

isRequestResolver

Returns true if the specified value is a RequestResolver, false otherwise.

Signature

export declare const isRequestResolver: (u: unknown) => u is RequestResolver<unknown, unknown>

Added in v2.0.0

symbols

RequestResolverTypeId

Signature

export declare const RequestResolverTypeId: typeof RequestResolverTypeId

Added in v2.0.0

RequestResolverTypeId (type alias)

Signature

export type RequestResolverTypeId = typeof RequestResolverTypeId

Added in v2.0.0

utils

RequestResolver (namespace)

Added in v2.0.0

Variance (interface)

Signature

export interface Variance<in A, out R> {
  readonly [RequestResolverTypeId]: {
    readonly _A: Types.Contravariant<A>
    readonly _R: Types.Covariant<R>
  }
}

Added in v2.0.0

contextFromEffect

Signature

export declare const contextFromEffect: <R, A extends Request.Request<any, any>>(
  self: RequestResolver<A, R>
) => Effect.Effect<RequestResolver<A, never>, never, R>

Added in v2.0.0

contextFromServices

Signature

export declare const contextFromServices: <Services extends Context.Tag<any, any>[]>(
  ...services: Services
) => <R, A extends Request.Request<any, any>>(
  self: RequestResolver<A, R>
) => Effect.Effect<
  RequestResolver<A, Exclude<R, { [k in keyof Services]: Effect.Effect.Context<Services[k]> }[number]>>,
  never,
  { [k in keyof Services]: Effect.Effect.Context<Services[k]> }[number]
>

Added in v2.0.0