| 113 | * @since 4.0.0 |
| 114 | */ |
| 115 | export const findOne = <Req extends Schema.Constraint, Res extends Schema.Constraint, E, R>( |
| 116 | options: { |
| 117 | readonly Request: Req |
| 118 | readonly Result: Res |
| 119 | readonly execute: (request: Req["Encoded"]) => Effect.Effect<ReadonlyArray<unknown>, E, R> |
| 120 | } |
| 121 | ) => { |
| 122 | const encodeRequest = Schema.encodeEffect(options.Request) |
| 123 | const decode = Schema.decodeUnknownEffect(options.Result) |
| 124 | return ( |
| 125 | request: Req["Type"] |
| 126 | ): Effect.Effect< |
| 127 | Res["Type"], |
| 128 | E | Schema.SchemaError | Cause.NoSuchElementError, |
| 129 | R | Req["EncodingServices"] | Res["DecodingServices"] |
| 130 | > => |
| 131 | Effect.flatMap( |
| 132 | Effect.flatMap(encodeRequest(request), options.execute), |
| 133 | (arr): Effect.Effect< |
| 134 | Res["Type"], |
| 135 | Schema.SchemaError | Cause.NoSuchElementError, |
| 136 | Req["EncodingServices"] | Res["DecodingServices"] |
| 137 | > => Arr.isReadonlyArrayNonEmpty(arr) ? decode(arr[0]) : Effect.fail(new Cause.NoSuchElementError()) |
| 138 | ) |
| 139 | } |
| 140 | |
| 141 | /** |
| 142 | * Builds a query function that encodes the request, decodes the first result row |