MCPcopy
hub / github.com/Effect-TS/effect / grouped

Function grouped

packages/sql/src/SqlResolver.ts:266–337  ·  view source on GitHub ↗
(
  tag: T,
  options:
    | {
      readonly Request: Schema.Schema<I, II, RI>
      readonly RequestGroupKey: (request: Types.NoInfer<I>) => K
      readonly Result: Schema.Schema<A, IA>
      readonly ResultGroupKey: (result: Types.NoInfer<A>, row: Types.NoInfer<Row>) => K
      readonly execute: (
        requests: Array<Types.NoInfer<II>>
      ) => Effect.Effect<ReadonlyArray<Row>, E>
      readonly withContext?: false
    }
    | {
      readonly Request: Schema.Schema<I, II, RI>
      readonly RequestGroupKey: (request: Types.NoInfer<I>) => K
      readonly Result: Schema.Schema<A, IA, RA>
      readonly ResultGroupKey: (result: Types.NoInfer<A>, row: Types.NoInfer<Row>) => K
      readonly execute: (
        requests: Array<Types.NoInfer<II>>
      ) => Effect.Effect<ReadonlyArray<Row>, E, R>
      readonly withContext: true
    }
)

Source from the content-addressed store, hash-verified

264 * @category resolvers
265 */
266export const grouped = <T extends string, I, II, K, RI, A, IA, Row, E, RA = never, R = never>(
267 tag: T,
268 options:
269 | {
270 readonly Request: Schema.Schema<I, II, RI>
271 readonly RequestGroupKey: (request: Types.NoInfer<I>) => K
272 readonly Result: Schema.Schema<A, IA>
273 readonly ResultGroupKey: (result: Types.NoInfer<A>, row: Types.NoInfer<Row>) => K
274 readonly execute: (
275 requests: Array<Types.NoInfer<II>>
276 ) => Effect.Effect<ReadonlyArray<Row>, E>
277 readonly withContext?: false
278 }
279 | {
280 readonly Request: Schema.Schema<I, II, RI>
281 readonly RequestGroupKey: (request: Types.NoInfer<I>) => K
282 readonly Result: Schema.Schema<A, IA, RA>
283 readonly ResultGroupKey: (result: Types.NoInfer<A>, row: Types.NoInfer<Row>) => K
284 readonly execute: (
285 requests: Array<Types.NoInfer<II>>
286 ) => Effect.Effect<ReadonlyArray<Row>, E, R>
287 readonly withContext: true
288 }
289): Effect.Effect<SqlResolver<T, I, Array<A>, E, RI>, never, RA | R> => {
290 const decodeResults = Schema.decodeUnknown(Schema.Array(options.Result))
291 const resolver = RequestResolver.makeBatched(
292 (requests: NonEmptyArray<SqlRequest<T, Array<A>, E>>) => {
293 const [inputs, spanLinks] = partitionRequests(requests)
294 const resultMap = MutableHashMap.empty<K, Array<A>>()
295 return options.execute(inputs as any).pipe(
296 Effect.bindTo("rawResults"),
297 Effect.bind("results", ({ rawResults }) => decodeResults(rawResults)),
298 Effect.tap(({ rawResults, results }) => {
299 for (let i = 0, len = results.length; i < len; i++) {
300 const result = results[i]
301 const key = options.ResultGroupKey(result, rawResults[i])
302 const group = MutableHashMap.get(resultMap, key)
303 if (group._tag === "None") {
304 MutableHashMap.set(resultMap, key, [result])
305 } else {
306 group.value.push(result)
307 }
308 }
309
310 return Effect.forEach(
311 requests,
312 (request) => {
313 const key = options.RequestGroupKey(request.input as I)
314 const result = MutableHashMap.get(resultMap, key)
315 return Request.succeed(request, result._tag === "None" ? [] : result.value)
316 },
317 { discard: true }
318 )
319 }),
320 Effect.catchAllCause((cause) =>
321 Effect.forEach(
322 requests,
323 (request) => Request.failCause(request, cause),

Callers

nothing calls this directly

Calls 8

partitionRequestsFunction · 0.85
makeResolverFunction · 0.85
failCauseMethod · 0.80
identifiedMethod · 0.65
pipeMethod · 0.65
getMethod · 0.65
setMethod · 0.65
executeMethod · 0.45

Tested by

no test coverage detected