Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions types/ramda/test/aperture-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ import * as R from 'ramda';
11,
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
);
const res3 = R.aperture(1000, R.repeat(1, 1001));
};
24 changes: 19 additions & 5 deletions types/ramda/tools.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -331,11 +331,25 @@ export type Take<N extends number, Tuple extends any[], ReturnTuple extends any[
: never;

/**
* define an n-length tuple type
*/

export type Tuple<T, N extends number> = N extends N ? number extends N ? T[] : _TupleOf<T, N, []> : never;
type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : _TupleOf<T, N, [T, ...R]>;
* Define an n-length tuple type.
*
* Implemented by growing exponentially (powers of 2) towards the target length to avoid
* problems with recursion depth ("Type instantiation is excessively deep").
*
* <created by @vzhou842>
*/
type Shift<A extends any[]> = ((...args: A) => void) extends (...args: [A[0], ...infer R]) => void ? R : never;
type GrowExpReverse<A extends any[], N extends number, P extends any[][]> = A['length'] extends N
? A
: [...A, ...P[0]][N] extends undefined
? GrowExpReverse<[...A, ...P[0]], N, P>
: GrowExpReverse<A, N, Shift<P>>;
type GrowExp<A extends any[], N extends number, P extends any[][]> = A['length'] extends N
? A
: [...A, ...A][N] extends undefined
? GrowExp<[...A, ...A], N, [A, ...P]>
: GrowExpReverse<A, N, P>;
export type Tuple<T, N extends number> = N extends 0 ? [] : N extends 1 ? [T] : GrowExp<[T, T], N, [[T]]>;

/**
* map Tuple of ordinary type to Tuple of array type
Expand Down