Hyperlinkv0.8.0-beta.28

RequestResolver

RequestResolver.aroundconsteffect/RequestResolver.ts:662
<A extends Request.Any, A2, X>(
  before: (
    entries: NonEmptyArray<Request.Entry<NoInfer<A>>>
  ) => Effect.Effect<A2, Request.Error<A>>,
  after: (
    entries: NonEmptyArray<Request.Entry<NoInfer<A>>>,
    a: A2
  ) => Effect.Effect<X, Request.Error<A>>
): (self: RequestResolver<A>) => RequestResolver<A>
<A extends Request.Any, A2, X>(
  self: RequestResolver<A>,
  before: (
    entries: NonEmptyArray<Request.Entry<NoInfer<A>>>
  ) => Effect.Effect<A2, Request.Error<A>>,
  after: (
    entries: NonEmptyArray<Request.Entry<NoInfer<A>>>,
    a: A2
  ) => Effect.Effect<X, Request.Error<A>>
): RequestResolver<A>

Wraps request resolver execution between before and after effects.

Example (Running effects around request resolution)

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

interface GetDataRequest extends Request.Request<string> {
  readonly _tag: "GetDataRequest"
}
const GetDataRequest = Request.tagged<GetDataRequest>("GetDataRequest")

const resolver = RequestResolver.make<GetDataRequest>((entries) =>
  Effect.sync(() => {
    for (const entry of entries) {
      entry.completeUnsafe(Exit.succeed("data"))
    }
  })
)

// Add setup and cleanup around request execution
const resolverWithAround = RequestResolver.around(
  resolver,
  (entries) =>
    Effect.gen(function*() {
      yield* Effect.log(`Starting batch of ${entries.length} requests`)
      return entries.length
    }),
  (entries, initialSize) =>
    Effect.gen(function*() {
      yield* Effect.log(
        `Batch completed with ${entries.length} requests (started with ${initialSize})`
      )
    })
)
combinators
export const around: {
  <A extends Request.Any, A2, X>(
    before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>,
    after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>
  ): (self: RequestResolver<A>) => RequestResolver<A>
  <A extends Request.Any, A2, X>(
    self: RequestResolver<A>,
    before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>,
    after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>
  ): RequestResolver<A>
} = dual(3, <A extends Request.Any, A2, X>(
  self: RequestResolver<A>,
  before: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>) => Effect.Effect<A2, Request.Error<A>>,
  after: (entries: NonEmptyArray<Request.Entry<NoInfer<A>>>, a: A2) => Effect.Effect<X, Request.Error<A>>
): RequestResolver<A> =>
  makeWith({
    ...self,
    runAll: (entries, key) =>
      Effect.acquireUseRelease(
        before(entries),
        () => self.runAll(entries, key),
        (a) => after(entries, a)
      )
  }))