You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
1.3 KiB

import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Fill<[], 0>, []>>,
Expect<Equal<Fill<[], 0, 0, 3>, []>>,
Expect<Equal<Fill<[1, 2, 3], 0, 0, 0>, [1, 2, 3]>>,
Expect<Equal<Fill<[1, 2, 3], 0, 2, 2>, [1, 2, 3]>>,
Expect<Equal<Fill<[1, 2, 3], 0>, [0, 0, 0]>>,
Expect<Equal<Fill<[1, 2, 3], true>, [true, true, true]>>,
Expect<Equal<Fill<[1, 2, 3], true, 0, 1>, [true, 2, 3]>>,
Expect<Equal<Fill<[1, 2, 3], true, 1, 3>, [1, true, true]>>,
Expect<Equal<Fill<[1, 2, 3], true, 10, 0>, [1, 2, 3]>>,
Expect<Equal<Fill<[1, 2, 3], true, 10, 20>, [1, 2, 3]>>,
Expect<Equal<Fill<[1, 2, 3], true, 0, 10>, [true, true, true]>>,
]
type FillInternal<
T extends unknown[],
N,
Start extends number = 0,
End extends number = T['length'],
Left extends unknown[] = [],
Mid extends unknown[] = [],
Right extends unknown[] = T,
> =
Right extends [infer Head, ...infer Tail]
? Left['length'] extends Start
? Mid['length'] extends End
? [...Mid, Head, ...Tail]
: FillInternal<T, N, Start, End, Left, [...Mid, N], Tail>
: FillInternal<T, N, Start, End, [...Left, Head], [...Left, Head], Tail>
: [...Mid, ...Right]
;
type Fill<
T extends unknown[],
N,
Start extends number = 0,
End extends number = T['length'],
> = FillInternal<T, N, Start, End>
;