From 4e78f283e7a1b1b4d4e46fbcb85c331ebabc69ad Mon Sep 17 00:00:00 2001 From: "maksim.khramtsov" Date: Tue, 20 Aug 2024 20:06:34 +0200 Subject: [PATCH 1/3] preserve `Array.replace` `Array.replaceOption` nonemptyness --- .changeset/rich-pumas-protect.md | 5 +++++ packages/effect/src/Array.ts | 26 ++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 .changeset/rich-pumas-protect.md diff --git a/.changeset/rich-pumas-protect.md b/.changeset/rich-pumas-protect.md new file mode 100644 index 0000000000..46b622c0d0 --- /dev/null +++ b/.changeset/rich-pumas-protect.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +preserve `Array.replace` `Array.replaceOption` nonemptyness diff --git a/packages/effect/src/Array.ts b/packages/effect/src/Array.ts index 329220363e..9d6e5f71b4 100644 --- a/packages/effect/src/Array.ts +++ b/packages/effect/src/Array.ts @@ -1055,8 +1055,17 @@ export const insertAt: { * @since 2.0.0 */ export const replace: { - (i: number, b: B): (self: Iterable) => Array - (self: Iterable, i: number, b: B): Array + ( + i: number, + b: B + ): = Iterable>( + self: S + ) => ReadonlyArray.With | B> + = Iterable>( + self: S, + i: number, + b: B + ): ReadonlyArray.With | B> } = dual(3, (self: Iterable, i: number, b: B): Array => modify(self, i, () => b)) /** @@ -1072,8 +1081,17 @@ export const replace: { * @since 2.0.0 */ export const replaceOption: { - (i: number, b: B): (self: Iterable) => Option> - (self: Iterable, i: number, b: B): Option> + ( + i: number, + b: B + ): = Iterable>( + self: Iterable + ) => Option | B>> + = Iterable>( + self: S, + i: number, + b: B + ): Option | B>> } = dual( 3, (self: Iterable, i: number, b: B): Option> => modifyOption(self, i, () => b) From 4561cd1154533738f1079c31963311b505017dcf Mon Sep 17 00:00:00 2001 From: "maksim.khramtsov" Date: Tue, 20 Aug 2024 21:03:24 +0200 Subject: [PATCH 2/3] fix typo --- .changeset/rich-pumas-protect.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rich-pumas-protect.md b/.changeset/rich-pumas-protect.md index 46b622c0d0..e8d499a826 100644 --- a/.changeset/rich-pumas-protect.md +++ b/.changeset/rich-pumas-protect.md @@ -2,4 +2,4 @@ "effect": minor --- -preserve `Array.replace` `Array.replaceOption` nonemptyness +preserve `Array.replace` `Array.replaceOption` non emptiness From d1c2f63d8c005ce36a0a524d6ffc0c65b3e023e9 Mon Sep 17 00:00:00 2001 From: "maksim.khramtsov" Date: Wed, 21 Aug 2024 11:06:58 +0200 Subject: [PATCH 3/3] add dtslint tests --- packages/effect/dtslint/Array.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/effect/dtslint/Array.ts b/packages/effect/dtslint/Array.ts index fc80439895..9c6ddb0888 100644 --- a/packages/effect/dtslint/Array.ts +++ b/packages/effect/dtslint/Array.ts @@ -1334,3 +1334,25 @@ Array.getSomes(hole | Option.Option>>()) // $ExpectType (string | number)[] Array.getSomes(hole> | Iterable>>()) + +// ------------------------------------------------------------------------------------- +// replace +// ------------------------------------------------------------------------------------- + +// $ExpectType string[] +Array.replace([], 0, "a") + +// $ExpectType ("a" | 1 | 2)[] +Array.replace(new Set([1, 2] as const), 0, "a" as const) + +// $ExpectType [number | "a", ...(number | "a")[]] +Array.replace(Array.of(1), 0, "a" as const) + +// $ExpectType string[] +pipe([], Array.replace(0, "a")) + +// $ExpectType ("a" | 1 | 2)[] +pipe(new Set([1, 2] as const), Array.replace(0, "a" as const)) + +// $ExpectType [number | "a", ...(number | "a")[]] +pipe(Array.of(1), Array.replace(0, "a" as const))