Skip to content

Commit 3c03a0d

Browse files
authored
Replace: Add support for generating longer strings (#1060)
1 parent a463c30 commit 3c03a0d

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

source/replace.d.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,16 @@ export type Replace<
6060
Search extends string,
6161
Replacement extends string,
6262
Options extends ReplaceOptions = {},
63+
> = _Replace<Input, Search, Replacement, Options>;
64+
65+
type _Replace<
66+
Input extends string,
67+
Search extends string,
68+
Replacement extends string,
69+
Options extends ReplaceOptions,
70+
Accumulator extends string = '',
6371
> = Input extends `${infer Head}${Search}${infer Tail}`
6472
? Options['all'] extends true
65-
? `${Head}${Replacement}${Replace<Tail, Search, Replacement, Options>}`
73+
? _Replace<Tail, Search, Replacement, Options, `${Accumulator}${Head}${Replacement}`>
6674
: `${Head}${Replacement}${Tail}`
67-
: Input;
75+
: `${Accumulator}${Input}`;

test-d/replace.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {expectType} from 'tsd';
2-
import type {Replace} from '../index';
2+
import type {Replace, StringRepeat} from '../index';
33

44
declare function replace<
55
Input extends string,
@@ -27,3 +27,13 @@ expectType<'10-42-00'>(replaceAll('10:42:00', ':', '-'));
2727
expectType<'userName'>(replaceAll('__userName__', '__', ''));
2828
expectType<'MyCoolTitle'>(replaceAll('My Cool Title', ' ', ''));
2929
expectType<'fobarfobar'>(replaceAll('foobarfoobar', 'ob', 'b'));
30+
31+
// Recursion depth at which a non-tail recursive implementation starts to fail.
32+
type FiftyZeroes = StringRepeat<'0', 50>;
33+
type FiftyOnes = StringRepeat<'1', 50>;
34+
expectType<FiftyOnes>({} as Replace<FiftyZeroes, '0', '1', {all: true}>);
35+
36+
// Maximum allowed recursion depth for a tail recursive implementation.
37+
type NineHundredNinetyNineZeroes = StringRepeat<'0', 999>;
38+
type NineHundredNinetyNineOnes = StringRepeat<'1', 999>;
39+
expectType<NineHundredNinetyNineOnes>({} as Replace<NineHundredNinetyNineZeroes, '0', '1', {all: true}>);

test-d/split.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {expectType} from 'tsd';
2-
import type {Split} from '../index';
2+
import type {Split, StringRepeat} from '../index';
33
import type {BuildTuple} from '../source/internal';
44

55
declare function split<
@@ -31,9 +31,9 @@ expectType<[]>(split('', ''));
3131
expectType<['']>(split('', ' '));
3232

3333
// Recursion depth at which a non-tail recursive implementation starts to fail.
34-
const fiftyZeroes = '00000000000000000000000000000000000000000000000000';
35-
expectType<BuildTuple<50, '0'>>(split(fiftyZeroes, ''));
34+
type FiftyZeroes = StringRepeat<'0', 50>;
35+
expectType<BuildTuple<50, '0'>>({} as Split<FiftyZeroes, ''>);
3636

3737
// Maximum allowed recursion depth for a tail recursive implementation.
38-
const nineHundredNinetyNineZeroes = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
39-
expectType<BuildTuple<999, '0'>>(split(nineHundredNinetyNineZeroes, ''));
38+
type NineHundredNinetyNineZeroes = StringRepeat<'0', 999>;
39+
expectType<BuildTuple<999, '0'>>({} as Split<NineHundredNinetyNineZeroes, ''>);

0 commit comments

Comments
 (0)