Skip to content

Commit

Permalink
add support for Refinements to Predicate.or, closes #3243 (#3250)
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti authored Jul 14, 2024
1 parent ca775ce commit 203658f
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
12 changes: 12 additions & 0 deletions .changeset/wet-snakes-mate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"effect": patch
---

add support for `Refinement`s to `Predicate.or`, closes #3243

```ts
import { Predicate } from "effect"

// Refinement<unknown, string | number>
const isStringOrNumber = Predicate.or(Predicate.isString, Predicate.isNumber)
```
18 changes: 17 additions & 1 deletion packages/effect/dtslint/Predicate.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { pipe } from "effect/Function"
import { hole, pipe } from "effect/Function"
import * as Predicate from "effect/Predicate"

declare const u: unknown
Expand Down Expand Up @@ -255,3 +255,19 @@ pipe(hasa, Predicate.and(hasb))

// $ExpectType Refinement<unknown, { a: unknown; } & { b: unknown; }>
Predicate.and(hasa, hasb)

// -------------------------------------------------------------------------------------
// or
// -------------------------------------------------------------------------------------

// $ExpectType Predicate<number>
pipe(hole<Predicate.Predicate<number>>(), Predicate.or(hole<Predicate.Predicate<number>>()))

// $ExpectType Predicate<number>
Predicate.or(hole<Predicate.Predicate<number>>(), hole<Predicate.Predicate<number>>())

// $ExpectType Refinement<unknown, string | number>
pipe(Predicate.isString, Predicate.or(Predicate.isNumber))

// $ExpectType Refinement<unknown, string | number>
Predicate.or(Predicate.isString, Predicate.isNumber)
2 changes: 2 additions & 0 deletions packages/effect/src/Predicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ export const not = <A>(self: Predicate<A>): Predicate<A> => (a) => !self(a)
* @since 2.0.0
*/
export const or: {
<A, C extends A>(that: Refinement<A, C>): <B extends A>(self: Refinement<A, B>) => Refinement<A, B | C>
<A, B extends A, C extends A>(self: Refinement<A, B>, that: Refinement<A, C>): Refinement<A, B | C>
<A>(that: Predicate<A>): (self: Predicate<A>) => Predicate<A>
<A>(self: Predicate<A>, that: Predicate<A>): Predicate<A>
} = dual(2, <A>(self: Predicate<A>, that: Predicate<A>): Predicate<A> => (a) => self(a) || that(a))
Expand Down

0 comments on commit 203658f

Please sign in to comment.