Skip to content

Commit 8b6c947

Browse files
Make Effect.liftPredicate and Either.liftPredicate reusable (#4687)
1 parent c50a63b commit 8b6c947

File tree

5 files changed

+52
-29
lines changed

5 files changed

+52
-29
lines changed

.changeset/happy-steaks-work.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
Modify the signatures of `Either.liftPredicate` and `Effect.predicate` to make them reusable.

packages/effect/dtslint/Effect.tst.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ describe("Effect", () => {
12561256
expect(pipe(
12571257
primitiveNumberOrString,
12581258
Effect.liftPredicate(Predicate.isString, (sn) => {
1259-
expect(sn).type.toBe<string | number>()
1259+
expect(sn).type.toBe<unknown>()
12601260
return "b" as const
12611261
})
12621262
)).type.toBe<Effect.Effect<string, "b">>()
@@ -1265,6 +1265,15 @@ describe("Effect", () => {
12651265
return "b" as const
12661266
})).type.toBe<Effect.Effect<string, "b">>()
12671267

1268+
expect(Effect.liftPredicate(hole<Predicate.Refinement<string | number, number>>(), (sn) => {
1269+
expect(sn).type.toBe<string | number>()
1270+
return "b" as const
1271+
})).type.toBe<(a: string | number) => Effect.Effect<number, "b">>()
1272+
expect(Effect.liftPredicate(Predicate.isString, (sn) => {
1273+
expect(sn).type.toBe<unknown>()
1274+
return "b" as const
1275+
})).type.toBe<(a: unknown) => Effect.Effect<string, "b">>()
1276+
12681277
expect(pipe(
12691278
primitiveNumberOrString,
12701279
Effect.liftPredicate(
@@ -1301,12 +1310,12 @@ describe("Effect", () => {
13011310
expect(pipe(
13021311
primitiveNumber,
13031312
Effect.liftPredicate(predicateNumbersOrStrings, (n) => {
1304-
expect(n).type.toBe<number>()
1313+
expect(n).type.toBe<string | number>()
13051314
return "b" as const
13061315
})
13071316
)).type.toBe<Effect.Effect<number, "b">>()
13081317
expect(Effect.liftPredicate(primitiveNumber, predicateNumbersOrStrings, (n) => {
1309-
expect(n).type.toBe<number>()
1318+
expect(n).type.toBe<string | number>()
13101319
return "b" as const
13111320
})).type.toBe<Effect.Effect<number, "b">>()
13121321

packages/effect/dtslint/Either.tst.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,20 @@ describe("Either", () => {
7474
const primitiveNumber = hole<number>()
7575
const stringOrNumber = hole<string | number>()
7676
const predicateNumberOrString = hole<Predicate.Predicate<number | string>>()
77+
const refinementNumberOrStringToNumber = hole<Predicate.Refinement<number | string, number>>()
78+
79+
expect(
80+
Either.liftPredicate(predicateNumberOrString, (sn) => {
81+
expect(sn).type.toBe<string | number>()
82+
return "b" as const
83+
})
84+
).type.toBe<(a: string | number) => Either.Either<string | number, "b">>()
85+
expect(
86+
Either.liftPredicate(refinementNumberOrStringToNumber, (sn) => {
87+
expect(sn).type.toBe<string | number>()
88+
return "b" as const
89+
})
90+
).type.toBe<(a: string | number) => Either.Either<number, "b">>()
7791

7892
expect(
7993
Either.liftPredicate(
@@ -121,16 +135,16 @@ describe("Either", () => {
121135
).type.toBe<Either.Either<string | number, "b">>()
122136

123137
expect(
124-
Either.liftPredicate(primitiveNumber, predicateNumberOrString, (n) => {
125-
expect(n).type.toBe<number>()
138+
Either.liftPredicate(primitiveNumber, predicateNumberOrString, (sn) => {
139+
expect(sn).type.toBe<string | number>()
126140
return "b" as const
127141
})
128142
).type.toBe<Either.Either<number, "b">>()
129143
expect(
130144
pipe(
131145
primitiveNumber,
132-
Either.liftPredicate(predicateNumberOrString, (n) => {
133-
expect(n).type.toBe<number>()
146+
Either.liftPredicate(predicateNumberOrString, (sn) => {
147+
expect(sn).type.toBe<string | number>()
134148
return "b" as const
135149
})
136150
)

packages/effect/src/Effect.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4971,12 +4971,12 @@ export const uninterruptibleMask: <A, E, R>(
49714971
*/
49724972
export const liftPredicate: {
49734973
<A, B extends A, E>(
4974-
refinement: Refinement<NoInfer<A>, B>,
4975-
orFailWith: (a: NoInfer<A>) => E
4974+
refinement: Refinement<A, B>,
4975+
orFailWith: (a: A) => E
49764976
): (a: A) => Effect<B, E>
4977-
<A, E>(predicate: Predicate<NoInfer<A>>, orFailWith: (a: NoInfer<A>) => E): (a: A) => Effect<A, E>
4977+
<B extends A, E, A = B>(predicate: Predicate<A>, orFailWith: (a: A) => E): (a: B) => Effect<B, E>
49784978
<A, E, B extends A>(self: A, refinement: Refinement<A, B>, orFailWith: (a: A) => E): Effect<B, E>
4979-
<A, E>(self: A, predicate: Predicate<NoInfer<A>>, orFailWith: (a: NoInfer<A>) => E): Effect<A, E>
4979+
<B extends A, E, A = B>(self: B, predicate: Predicate<A>, orFailWith: (a: A) => E): Effect<B, E>
49804980
} = effect.liftPredicate
49814981

49824982
/**

packages/effect/src/Either.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -421,19 +421,14 @@ export const match: {
421421
* import { pipe, Either } from "effect"
422422
*
423423
* const isPositive = (n: number): boolean => n > 0
424+
* const isPositiveEither = Either.liftPredicate(isPositive, n => `${n} is not positive`)
424425
*
425426
* assert.deepStrictEqual(
426-
* pipe(
427-
* 1,
428-
* Either.liftPredicate(isPositive, n => `${n} is not positive`)
429-
* ),
427+
* isPositiveEither(1),
430428
* Either.right(1)
431429
* )
432430
* assert.deepStrictEqual(
433-
* pipe(
434-
* 0,
435-
* Either.liftPredicate(isPositive, n => `${n} is not positive`)
436-
* ),
431+
* isPositiveEither(0),
437432
* Either.left("0 is not positive")
438433
* )
439434
* ```
@@ -442,21 +437,21 @@ export const match: {
442437
* @since 3.4.0
443438
*/
444439
export const liftPredicate: {
445-
<A, B extends A, E>(refinement: Refinement<NoInfer<A>, B>, orLeftWith: (a: NoInfer<A>) => E): (a: A) => Either<B, E>
446-
<A, E>(
447-
predicate: Predicate<NoInfer<A>>,
448-
orLeftWith: (a: NoInfer<A>) => E
449-
): (a: A) => Either<A, E>
440+
<A, B extends A, E>(refinement: Refinement<A, B>, orLeftWith: (a: A) => E): (a: A) => Either<B, E>
441+
<B extends A, E, A = B>(
442+
predicate: Predicate<A>,
443+
orLeftWith: (a: A) => E
444+
): (a: B) => Either<B, E>
450445
<A, E, B extends A>(
451446
self: A,
452447
refinement: Refinement<A, B>,
453448
orLeftWith: (a: A) => E
454449
): Either<B, E>
455-
<A, E>(
456-
self: A,
457-
predicate: Predicate<NoInfer<A>>,
458-
orLeftWith: (a: NoInfer<A>) => E
459-
): Either<A, E>
450+
<B extends A, E, A = B>(
451+
self: B,
452+
predicate: Predicate<A>,
453+
orLeftWith: (a: A) => E
454+
): Either<B, E>
460455
} = dual(
461456
3,
462457
<A, E>(a: A, predicate: Predicate<A>, orLeftWith: (a: A) => E): Either<A, E> =>

0 commit comments

Comments
 (0)