(
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
}
)
| 264 | * @category resolvers |
| 265 | */ |
| 266 | export 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), |
nothing calls this directly
no test coverage detected
searching dependent graphs…