summaryrefslogtreecommitdiff
path: root/src/lang/ts-lang/util
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-11-05 01:20:07 -0800
committerKai Stevenson <kai@kaistevenson.com>2025-11-06 20:28:00 -0800
commitd8a969e231135978c4dd1fa67559101f506ad6f3 (patch)
tree7a556db33abe541fa3f5902690ca93d782c0ecc7 /src/lang/ts-lang/util
parente86c68dffaffee6ba44d98ba06761245f6d5b670 (diff)
recursion works for types with depth limit 5
Diffstat (limited to 'src/lang/ts-lang/util')
-rw-r--r--src/lang/ts-lang/util/number.ts12
-rw-r--r--src/lang/ts-lang/util/utils.ts14
2 files changed, 26 insertions, 0 deletions
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<Numbers extends readonly number[]> =
? 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<M extends number, N extends number> = SubNumbersInternal<
+ NumberToArray<M>,
+ NumberToArray<N>
+> 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 readonly any[]> = 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<Tail, Head>
+ : Head extends Last
+ ? Last extends Head
+ ? ArrayEqual<Tail, Head>
+ : false
+ : false
+ : true;