Skip to content

Commit 3c15d5f

Browse files
Array.window signature has been improved (#5679)
1 parent 24a1685 commit 3c15d5f

File tree

5 files changed

+38
-11
lines changed

5 files changed

+38
-11
lines changed

.changeset/famous-breads-kiss.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+
`Array.window` signature has been improved

packages/effect/dtslint/Array.tst.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -940,15 +940,26 @@ describe("Array", () => {
940940
})
941941

942942
it("window", () => {
943+
const two: number = 2
943944
// Array
944-
expect(Array.window(strings, 2)).type.toBe<Array<Array<string>>>()
945-
expect(pipe(strings, Array.window(2))).type.toBe<Array<Array<string>>>()
946-
expect(Array.window(2)(strings)).type.toBe<Array<Array<string>>>()
945+
expect(Array.window(strings, two)).type.toBe<Array<Array<string>>>()
946+
expect(pipe(strings, Array.window(two))).type.toBe<Array<Array<string>>>()
947+
expect(Array.window(two)(strings)).type.toBe<Array<Array<string>>>()
947948

948949
// NonEmptyArray
949-
expect(Array.window(nonEmptyStrings, 2)).type.toBe<Array<Array<string>>>()
950-
expect(pipe(nonEmptyStrings, Array.window(2))).type.toBe<Array<Array<string>>>()
951-
expect(Array.window(2)(nonEmptyStrings)).type.toBe<Array<Array<string>>>()
950+
expect(Array.window(nonEmptyStrings, two)).type.toBe<Array<Array<string>>>()
951+
expect(pipe(nonEmptyStrings, Array.window(two))).type.toBe<Array<Array<string>>>()
952+
expect(Array.window(two)(nonEmptyStrings)).type.toBe<Array<Array<string>>>()
953+
954+
// literal + Array
955+
expect(Array.window(strings, 2)).type.toBe<Array<[string, string]>>()
956+
expect(pipe(strings, Array.window(2))).type.toBe<Array<[string, string]>>()
957+
expect(Array.window(2)(strings)).type.toBe<Array<[string, string]>>()
958+
959+
// literal + NonEmptyArray
960+
expect(Array.window(nonEmptyStrings, 2)).type.toBe<Array<[string, string]>>()
961+
expect(pipe(nonEmptyStrings, Array.window(2))).type.toBe<Array<[string, string]>>()
962+
expect(Array.window(2)(nonEmptyStrings)).type.toBe<Array<[string, string]>>()
952963
})
953964

954965
it("reverse", () => {

packages/effect/dtslint/Types.tst.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import { describe, expect, it } from "tstyche"
33

44
describe("Types", () => {
55
it("TupleOf", () => {
6+
expect<Types.TupleOf<-1, number>>()
7+
.type.toBe<never>()
8+
expect<Types.TupleOf<0, number>>()
9+
.type.toBe<[]>()
610
expect<Types.TupleOf<3, number>>()
711
.type.toBe<[number, number, number]>()
812
})

packages/effect/src/Array.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import * as Order from "./Order.js"
1818
import * as Predicate from "./Predicate.js"
1919
import * as Record from "./Record.js"
2020
import * as Tuple from "./Tuple.js"
21-
import type { NoInfer } from "./Types.js"
21+
import type { NoInfer, TupleOf } from "./Types.js"
2222

2323
/**
2424
* @category type lambdas
@@ -2135,9 +2135,14 @@ export const chunksOf: {
21352135
* @since 3.13.2
21362136
*/
21372137
export const window: {
2138-
(n: number): <A>(self: Iterable<A>) => Array<Array<A>>
2139-
<A>(self: Iterable<A>, n: number): Array<Array<A>>
2140-
} = dual(2, <A>(self: Iterable<A>, n: number): Array<Array<A>> => {
2138+
<N extends number = number>(
2139+
n: N
2140+
): <A>(self: Iterable<A>) => Array<TupleOf<N, A>>
2141+
<A, N extends number = number>(
2142+
self: Iterable<A>,
2143+
n: N
2144+
): Array<TupleOf<N, A>>
2145+
} = dual(2, <A, const N extends number>(self: Iterable<A>, n: N): Array<Array<A>> => {
21412146
const input = fromIterable(self)
21422147
if (n > 0 && isNonEmptyReadonlyArray(input)) {
21432148
return Array.from(

packages/effect/src/Types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
* @since 2.0.0
55
*/
66

7-
type _TupleOf<T, N extends number, R extends Array<unknown>> = R["length"] extends N ? R : _TupleOf<T, N, [T, ...R]>
7+
type _TupleOf<T, N extends number, R extends Array<unknown>> = `${N}` extends `-${number}` ? never
8+
: R["length"] extends N ? R
9+
: _TupleOf<T, N, [T, ...R]>
810

911
/**
1012
* Represents a tuple with a fixed number of elements of type `T`.

0 commit comments

Comments
 (0)