(
tag: T,
options:
| {
readonly Request: Schema.Schema<I, II, RI>
readonly Result: Schema.Schema<A, IA>
readonly execute: (
requests: Array<Types.NoInfer<II>>
) => Effect.Effect<ReadonlyArray<_>, E>
readonly withContext?: false
}
| {
readonly Request: Schema.Schema<I, II, RI>
readonly Result: Schema.Schema<A, IA, RA>
readonly execute: (
requests: Array<Types.NoInfer<II>>
) => Effect.Effect<ReadonlyArray<_>, E, R>
readonly withContext: true
}
)
| 194 | * @category resolvers |
| 195 | */ |
| 196 | export const ordered = <T extends string, I, II, RI, A, IA, _, E, RA = never, R = never>( |
| 197 | tag: T, |
| 198 | options: |
| 199 | | { |
| 200 | readonly Request: Schema.Schema<I, II, RI> |
| 201 | readonly Result: Schema.Schema<A, IA> |
| 202 | readonly execute: ( |
| 203 | requests: Array<Types.NoInfer<II>> |
| 204 | ) => Effect.Effect<ReadonlyArray<_>, E> |
| 205 | readonly withContext?: false |
| 206 | } |
| 207 | | { |
| 208 | readonly Request: Schema.Schema<I, II, RI> |
| 209 | readonly Result: Schema.Schema<A, IA, RA> |
| 210 | readonly execute: ( |
| 211 | requests: Array<Types.NoInfer<II>> |
| 212 | ) => Effect.Effect<ReadonlyArray<_>, E, R> |
| 213 | readonly withContext: true |
| 214 | } |
| 215 | ): Effect.Effect< |
| 216 | SqlResolver<T, I, A, E | ResultLengthMismatch, RI>, |
| 217 | never, |
| 218 | RA | R |
| 219 | > => { |
| 220 | const decodeResults = Schema.decodeUnknown(Schema.Array(options.Result)) |
| 221 | const resolver = RequestResolver.makeBatched( |
| 222 | (requests: NonEmptyArray<SqlRequest<T, A, E | ResultLengthMismatch>>) => { |
| 223 | const [inputs, spanLinks] = partitionRequests(requests) |
| 224 | return options.execute(inputs as any).pipe( |
| 225 | Effect.filterOrFail( |
| 226 | (results) => results.length === inputs.length, |
| 227 | ({ length }) => |
| 228 | new ResultLengthMismatch({ |
| 229 | expected: inputs.length, |
| 230 | actual: length |
| 231 | }) |
| 232 | ), |
| 233 | Effect.flatMap(decodeResults), |
| 234 | Effect.flatMap( |
| 235 | Effect.forEach((result, i) => Request.succeed(requests[i], result), { |
| 236 | discard: true |
| 237 | }) |
| 238 | ), |
| 239 | Effect.catchAllCause((cause) => |
| 240 | Effect.forEach( |
| 241 | requests, |
| 242 | (request) => Request.failCause(request, cause), |
| 243 | { discard: true } |
| 244 | ) |
| 245 | ), |
| 246 | Effect.withSpan(`sql.Resolver.batch ${tag}`, { |
| 247 | kind: "client", |
| 248 | links: spanLinks, |
| 249 | attributes: { "request.count": inputs.length }, |
| 250 | captureStackTrace: false |
| 251 | }) |
| 252 | ) as Effect.Effect<void> |
| 253 | } |
nothing calls this directly
no test coverage detected