Skip to content

Commit

Permalink
add filter refinement overloads to http client (#3595)
Browse files Browse the repository at this point in the history
  • Loading branch information
fubhy authored and tim-smart committed Sep 13, 2024
1 parent 31876b1 commit fd08152
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 23 deletions.
5 changes: 5 additions & 0 deletions .changeset/thick-coats-buy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@effect/platform": patch
---

Added refinement overloads to `HttpClient.filterOrFail` and `HttpClient.filterOrElse`
38 changes: 29 additions & 9 deletions packages/platform/src/HttpClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,31 +174,51 @@ export const catchTags: {
* @category filters
*/
export const filterOrElse: {
<A, B extends A, C, E2, R2>(
refinement: Predicate.Refinement<NoInfer<A>, B>,
orElse: (a: NoInfer<A>) => Effect.Effect<C, E2, R2>
): <E, R>(self: HttpClient<A, E, R>) => HttpClient<B | C, E | E2, R | R2>
<A, B, E2, R2>(
f: Predicate.Predicate<A>,
orElse: (a: A) => Effect.Effect<B, E2, R2>
): <E, R>(self: HttpClient<A, E, R>) => HttpClient<A | B, E2 | E, R2 | R>
predicate: Predicate.Predicate<NoInfer<A>>,
orElse: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>
): <E, R>(
self: HttpClient<A, E, R>
) => HttpClient<A | B, E2 | E, R2 | R>
<A, E, R, B extends A, C, E2, R2>(
self: HttpClient<A, E, R>,
refinement: Predicate.Refinement<A, B>,
orElse: (a: A) => Effect.Effect<C, E2, R2>
): HttpClient<B | C, E | E2, R | R2>
<A, E, R, B, E2, R2>(
self: HttpClient<A, E, R>,
f: Predicate.Predicate<A>,
predicate: Predicate.Predicate<A>,
orElse: (a: A) => Effect.Effect<B, E2, R2>
): HttpClient<A | B, E | E2, R | R2>
): HttpClient<A | B, E2 | E, R2 | R>
} = internal.filterOrElse

/**
* @since 1.0.0
* @category filters
*/
export const filterOrFail: {
<A, B extends A, E2>(
refinement: Predicate.Refinement<NoInfer<A>, B>,
orFailWith: (a: NoInfer<A>) => E2
): <E, R>(self: HttpClient<A, E, R>) => HttpClient<B, E | E2, R>
<A, E2>(
f: Predicate.Predicate<A>,
orFailWith: (a: A) => E2
predicate: Predicate.Predicate<NoInfer<A>>,
orFailWith: (a: NoInfer<A>) => E2
): <E, R>(self: HttpClient<A, E, R>) => HttpClient<A, E2 | E, R>
<A, B extends A, E, R, E2>(
self: HttpClient<A, E, R>,
refinement: Predicate.Refinement<A, B>,
orFailWith: (a: A) => E2
): HttpClient<B, E2 | E, R>
<A, E, R, E2>(
self: HttpClient<A, E, R>,
f: Predicate.Predicate<A>,
predicate: Predicate.Predicate<A>,
orFailWith: (a: A) => E2
): HttpClient<A, E | E2, R>
): HttpClient<A, E2 | E, R>
} = internal.filterOrFail

/**
Expand Down
46 changes: 32 additions & 14 deletions packages/platform/src/internal/httpClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -476,32 +476,50 @@ export const catchAll: {
)

/** @internal */
export const filterOrElse = dual<
export const filterOrElse: {
<A, B extends A, C, E2, R2>(
refinement: Predicate.Refinement<NoInfer<A>, B>,
orElse: (a: NoInfer<A>) => Effect.Effect<C, E2, R2>
): <E, R>(self: Client.HttpClient<A, E, R>) => Client.HttpClient<B | C, E | E2, R | R2>
<A, B, E2, R2>(
f: Predicate.Predicate<A>,
orElse: (a: A) => Effect.Effect<B, E2, R2>
) => <E, R>(
predicate: Predicate.Predicate<NoInfer<A>>,
orElse: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>
): <E, R>(
self: Client.HttpClient<A, E, R>
) => Client.HttpClient<A | B, E2 | E, R2 | R>,
) => Client.HttpClient<A | B, E2 | E, R2 | R>
<A, E, R, B extends A, C, E2, R2>(
self: Client.HttpClient<A, E, R>,
refinement: Predicate.Refinement<A, B>,
orElse: (a: A) => Effect.Effect<C, E2, R2>
): Client.HttpClient<B | C, E | E2, R | R2>
<A, E, R, B, E2, R2>(
self: Client.HttpClient<A, E, R>,
f: Predicate.Predicate<A>,
predicate: Predicate.Predicate<A>,
orElse: (a: A) => Effect.Effect<B, E2, R2>
) => Client.HttpClient<A | B, E2 | E, R2 | R>
>(3, (self, f, orElse) => transformResponse(self, Effect.filterOrElse(f, orElse)))
): Client.HttpClient<A | B, E2 | E, R2 | R>
} = dual(3, (self, f, orElse) => transformResponse(self, Effect.filterOrElse(f, orElse)))

/** @internal */
export const filterOrFail = dual<
export const filterOrFail: {
<A, B extends A, E2>(
refinement: Predicate.Refinement<NoInfer<A>, B>,
orFailWith: (a: NoInfer<A>) => E2
): <E, R>(self: Client.HttpClient<A, E, R>) => Client.HttpClient<B, E | E2, R>
<A, E2>(
f: Predicate.Predicate<A>,
predicate: Predicate.Predicate<NoInfer<A>>,
orFailWith: (a: NoInfer<A>) => E2
): <E, R>(self: Client.HttpClient<A, E, R>) => Client.HttpClient<A, E2 | E, R>
<A, B extends A, E, R, E2>(
self: Client.HttpClient<A, E, R>,
refinement: Predicate.Refinement<A, B>,
orFailWith: (a: A) => E2
) => <E, R>(self: Client.HttpClient<A, E, R>) => Client.HttpClient<A, E2 | E, R>,
): Client.HttpClient<B, E2 | E, R>
<A, E, R, E2>(
self: Client.HttpClient<A, E, R>,
f: Predicate.Predicate<A>,
predicate: Predicate.Predicate<A>,
orFailWith: (a: A) => E2
) => Client.HttpClient<A, E2 | E, R>
>(3, (self, f, orFailWith) => transformResponse(self, Effect.filterOrFail(f, orFailWith)))
): Client.HttpClient<A, E2 | E, R>
} = dual(3, (self, f, orFailWith) => transformResponse(self, Effect.filterOrFail(f, orFailWith)))

/** @internal */
export const map = dual<
Expand Down

0 comments on commit fd08152

Please sign in to comment.