From a44e532cf3a6a498b12a5aacf8124aa267e24ba0 Mon Sep 17 00:00:00 2001 From: Maxim Khramtsov Date: Thu, 23 May 2024 18:09:04 +0200 Subject: [PATCH] make `Array.separate`, `Array.getRights`, `Array.getLefts`, `Array.getSomes` heterogeneous (#2744) Co-authored-by: maksim.khramtsov --- .changeset/short-drinks-notice.md | 5 ++++ packages/effect/dtslint/Array.ts | 48 ++++++++++++++++++++++++++++++ packages/effect/src/Array.ts | 19 ++++++++---- packages/effect/test/Array.test.ts | 4 +-- 4 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 .changeset/short-drinks-notice.md diff --git a/.changeset/short-drinks-notice.md b/.changeset/short-drinks-notice.md new file mode 100644 index 0000000000..e1a7ad13f0 --- /dev/null +++ b/.changeset/short-drinks-notice.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +make `Array.separate`, `Array.getRights`, `Array.getLefts`, `Array.getSomes` heterogeneous diff --git a/packages/effect/dtslint/Array.ts b/packages/effect/dtslint/Array.ts index 28f5b50d90..f23c245e20 100644 --- a/packages/effect/dtslint/Array.ts +++ b/packages/effect/dtslint/Array.ts @@ -1230,6 +1230,12 @@ pipe( // $ExpectType [unknown[], unknown[]] Array.separate([]) +// $ExpectType [never[], number[]] +Array.separate([Either.right(1)]) + +// $ExpectType [string[], never[]] +Array.separate([Either.left("a")]) + // $ExpectType [string[], number[]] Array.separate([Either.left("a"), Either.right(1)]) @@ -1239,6 +1245,12 @@ Array.separate(hole>>()) // $ExpectType [string[], number[]] Array.separate(hole>>()) +// $ExpectType [(string | Date)[], (number | boolean)[]] +Array.separate(hole | Either.Either>>()) + +// $ExpectType [(string | Date)[], (number | boolean)[]] +Array.separate(hole> | Iterable>>()) + // ------------------------------------------------------------------------------------- // getRights // ------------------------------------------------------------------------------------- @@ -1246,6 +1258,12 @@ Array.separate(hole>>()) // $ExpectType unknown[] Array.getRights([]) +// $ExpectType never[] +Array.getRights([Either.left("a")]) + +// $ExpectType number[] +Array.getRights([Either.right(1)]) + // $ExpectType number[] Array.getRights([Either.left("a"), Either.right(1)]) @@ -1255,6 +1273,12 @@ Array.getRights(hole>>()) // $ExpectType number[] Array.getRights(hole>>()) +// $ExpectType (number | boolean)[] +Array.getRights(hole | Either.Either>>()) + +// $ExpectType (number | boolean)[] +Array.getRights(hole> | Iterable>>()) + // ------------------------------------------------------------------------------------- // getLefts // ------------------------------------------------------------------------------------- @@ -1262,6 +1286,12 @@ Array.getRights(hole>>()) // $ExpectType unknown[] Array.getLefts([]) +// $ExpectType string[] +Array.getLefts([Either.left("a")]) + +// $ExpectType never[] +Array.getLefts([Either.right(1)]) + // $ExpectType string[] Array.getLefts([Either.left("a"), Either.right(1)]) @@ -1271,6 +1301,12 @@ Array.getLefts(hole>>()) // $ExpectType string[] Array.getLefts(hole>>()) +// $ExpectType (string | Date)[] +Array.getLefts(hole | Either.Either>>()) + +// $ExpectType (string | Date)[] +Array.getLefts(hole> | Iterable>>()) + // ------------------------------------------------------------------------------------- // getSomes // ------------------------------------------------------------------------------------- @@ -1278,6 +1314,12 @@ Array.getLefts(hole>>()) // $ExpectType unknown[] Array.getSomes([]) +// $ExpectType never[] +Array.getSomes([Option.none()]) + +// $ExpectType number[] +Array.getSomes([Option.some(1)]) + // $ExpectType number[] Array.getSomes([Option.none(), Option.some(1)]) @@ -1286,3 +1328,9 @@ Array.getSomes(hole>>()) // $ExpectType number[] Array.getSomes(hole>>()) + +// $ExpectType (string | number)[] +Array.getSomes(hole | Option.Option>>()) + +// $ExpectType (string | number)[] +Array.getSomes(hole> | Iterable>>()) diff --git a/packages/effect/src/Array.ts b/packages/effect/src/Array.ts index db1927fe30..4575f940b0 100644 --- a/packages/effect/src/Array.ts +++ b/packages/effect/src/Array.ts @@ -2254,7 +2254,10 @@ export const partitionMap: { * @category filtering * @since 2.0.0 */ -export const getSomes: (self: Iterable>) => Array = filterMap(identity) + +export const getSomes: >, X = any>( + self: T +) => Array>> = filterMap(identity as any) /** * Retrieves the `Left` values from an `Iterable` of `Either`s, collecting them into an array. @@ -2270,8 +2273,8 @@ export const getSomes: (self: Iterable>) => Array = filterMap(id * @category filtering * @since 2.0.0 */ -export const getLefts = (self: Iterable>): Array => { - const out: Array = [] +export const getLefts = >>(self: T): Array>> => { + const out: Array = [] for (const a of self) { if (E.isLeft(a)) { out.push(a.left) @@ -2295,8 +2298,10 @@ export const getLefts = (self: Iterable>): Array => { * @category filtering * @since 2.0.0 */ -export const getRights = (self: Iterable>): Array => { - const out: Array = [] +export const getRights = >>( + self: T +): Array>> => { + const out: Array = [] for (const a of self) { if (E.isRight(a)) { out.push(a.right) @@ -2377,7 +2382,9 @@ export const partition: { * @category filtering * @since 2.0.0 */ -export const separate: (self: Iterable>) => [Array, Array] = partitionMap( +export const separate: >>( + self: T +) => [Array>>, Array>>] = partitionMap( identity ) diff --git a/packages/effect/test/Array.test.ts b/packages/effect/test/Array.test.ts index 6d73e9bdf1..cd7098ef70 100644 --- a/packages/effect/test/Array.test.ts +++ b/packages/effect/test/Array.test.ts @@ -797,8 +797,8 @@ describe("ReadonlyArray", () => { it("separate", () => { expect(RA.separate([])).toEqual([[], []]) - expect(RA.separate([E.right(1), E.left("e"), E.right(2)])).toEqual([ - ["e"], + expect(RA.separate([E.right(1), E.left("e"), E.left(2), E.right(2)])).toEqual([ + ["e", 2], [1, 2] ]) })