Hyperlinkv0.8.0-beta.28

RequestResolver

RequestResolver.groupedconsteffect/RequestResolver.ts:810
<A extends Request.Any, K>(f: (entry: Request.Entry<A>) => K): (
  self: RequestResolver<A>
) => RequestResolver<A>
<A extends Request.Any, K>(
  self: RequestResolver<A>,
  f: (entry: Request.Entry<A>) => K
): RequestResolver<A>

Transforms a request resolver by grouping requests using the specified key function.

Example (Grouping resolver requests)

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

interface GetUserRequest extends Request.Request<string> {
  readonly _tag: "GetUserRequest"
  readonly userId: number
  readonly department: string
}
const GetUserRequest = Request.tagged<GetUserRequest>("GetUserRequest")

const resolver = RequestResolver.make<GetUserRequest>((entries) =>
  Effect.sync(() => {
    console.log(`Processing ${entries.length} users`)
    for (const entry of entries) {
      entry.completeUnsafe(Exit.succeed(`User ${entry.request.userId}`))
    }
  })
)

// Group requests by department for more efficient processing
const groupedResolver = RequestResolver.grouped(
  resolver,
  ({ request }) => request.department
)

// Requests for the same department will be batched together
const requests = [
  Effect.request(
    GetUserRequest({ userId: 1, department: "Engineering" }),
    groupedResolver
  ),
  Effect.request(
    GetUserRequest({ userId: 2, department: "Engineering" }),
    groupedResolver
  ),
  Effect.request(
    GetUserRequest({ userId: 3, department: "Marketing" }),
    groupedResolver
  )
]
combinators
export const grouped: {
  <A extends Request.Any, K>(f: (entry: Request.Entry<A>) => K): (self: RequestResolver<A>) => RequestResolver<A>
  <A extends Request.Any, K>(self: RequestResolver<A>, f: (entry: Request.Entry<A>) => K): RequestResolver<A>
} = dual(
  2,
  <A extends Request.Any, K>(self: RequestResolver<A>, f: (entry: Request.Entry<A>) => K): RequestResolver<A> =>
    makeWith({
      ...self,
      batchKey: hashGroupKey(f)
    })
)