diff --git a/.changeset/rich-pumas-protect.md b/.changeset/rich-pumas-protect.md new file mode 100644 index 0000000000..e8d499a826 --- /dev/null +++ b/.changeset/rich-pumas-protect.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +preserve `Array.replace` `Array.replaceOption` non emptiness 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)) 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)