effect icon indicating copy to clipboard operation
effect copied to clipboard

Add a DataLoader for requests

Open mikearnaldi opened this issue 2 years ago • 0 comments

We should provide a DataLoader that can batch across invocations of a request resolver.

Something along the lines of:

import { dataLoader } from "./utils/RequestResolver"
import { Effect, Request, RequestResolver } from "effect"

interface AnalyticsEvent extends Request.Request<never, void> {
  readonly _tag: "AnalyticsEvent"
  readonly props: Record<string, string>
}
const AnalyticsEvent = Request.tagged<AnalyticsEvent>("AnalyticsEvent")

declare const persistEvents: (
  events: Array<AnalyticsEvent>,
) => Effect.Effect<never, never, void>

const analyticsResolver = RequestResolver.fromEffectTagged<AnalyticsEvent>()({
  AnalyticsEvent: events =>
    persistEvents(events).pipe(Effect.as(new Array(events.length))),
})

Effect.gen(function* (_) {
  const loader = yield* _(
    dataLoader(analyticsResolver, {
      window: "5 seconds",
      maxBatchSize: 100,
    }),
  )

  const send = (props: Record<string, string>) =>
    Effect.request(AnalyticsEvent({ props }), loader)

  return { send } as const
})

Copied from @tim-smart

mikearnaldi avatar Nov 27 '23 13:11 mikearnaldi