effect
effect copied to clipboard
Add a DataLoader for requests
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