From d8a969e231135978c4dd1fa67559101f506ad6f3 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Wed, 5 Nov 2025 01:20:07 -0800 Subject: recursion works for types with depth limit 5 --- src/lang/ts-lang/util/number.ts | 12 ++++++++++++ src/lang/ts-lang/util/utils.ts | 14 ++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'src/lang/ts-lang/util') diff --git a/src/lang/ts-lang/util/number.ts b/src/lang/ts-lang/util/number.ts index 6e4e360..2fa6d85 100644 --- a/src/lang/ts-lang/util/number.ts +++ b/src/lang/ts-lang/util/number.ts @@ -20,6 +20,18 @@ export type AddNumbers = ? T["length"] : never; +export type SubNumbersInternal< + MS extends readonly unknown[], + NS extends readonly unknown[] +> = MS extends readonly [...NS, ...infer Tail] ? Tail : never; + +export type SubNumbers = SubNumbersInternal< + NumberToArray, + NumberToArray +> extends infer T extends readonly any[] + ? T["length"] + : never; + export type MultiplyInner< N extends number, MS extends readonly any[], diff --git a/src/lang/ts-lang/util/utils.ts b/src/lang/ts-lang/util/utils.ts index ac36ca1..d6d46f7 100644 --- a/src/lang/ts-lang/util/utils.ts +++ b/src/lang/ts-lang/util/utils.ts @@ -6,3 +6,17 @@ export type UnarrayIfOnlyHead = T extends [ : T extends [infer Head] ? Head : T; + +type ARR_EQUAL_SENTINEL = { __arrEq: true }; +export type ArrayEqual< + T extends readonly any[], + Last = ARR_EQUAL_SENTINEL +> = T extends [infer Head, ...infer Tail] + ? Last extends ARR_EQUAL_SENTINEL + ? ArrayEqual + : Head extends Last + ? Last extends Head + ? ArrayEqual + : false + : false + : true; -- cgit v1.2.3-70-g09d2