Hyperlinkv0.8.0-beta.28

RequestResolver

RequestResolver.makeGroupedconsteffect/RequestResolver.ts:279
<A extends Request.Any, K>(options: {
  readonly key: (entry: Request.Entry<A>) => K
  readonly resolver: (
    entries: NonEmptyArray<Request.Entry<A>>,
    key: K
  ) => Effect.Effect<void, Request.Error<A>>
}): RequestResolver<A>

Constructs a request resolver with the requests grouped by a calculated key.

Details

The key can use the Equal trait to determine if two keys are equal.

Example (Grouping requests by key)

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

interface GetUserByRole extends Request.Request<string, Error> {
  readonly _tag: "GetUserByRole"
  readonly role: string
  readonly id: number
}
const GetUserByRole = Request.tagged<GetUserByRole>("GetUserByRole")

// Group requests by role for efficient batch processing
const UserByRoleResolver = RequestResolver.makeGrouped<GetUserByRole, string>({
  key: ({ request }) => request.role,
  resolver: (entries, role) =>
    Effect.sync(() => {
      console.log(`Processing ${entries.length} requests for role: ${role}`)
      for (const entry of entries) {
        entry.completeUnsafe(
          Exit.succeed(`User ${entry.request.id} with role ${role}`)
        )
      }
    })
})
constructors
export const makeGrouped = <A extends Request.Any, K>(options: {
  readonly key: (entry: Request.Entry<A>) => K
  readonly resolver: (entries: NonEmptyArray<Request.Entry<A>>, key: K) => Effect.Effect<void, Request.Error<A>>
}): RequestResolver<A> =>
  makeWith({
    batchKey: hashGroupKey(options.key),
    delay: Effect.yieldNow,
    collectWhile: constTrue,
    runAll: options.resolver as any
  })