From fc81d42887253715630eb39773b9fa65651e1431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 11:39:01 +0800 Subject: [PATCH 1/7] :sparkles: feat(array-methods): add `Array.Reverse` method --- lib/Array/index.d.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index 198867a..a4b4211 100644 --- a/lib/Array/index.d.ts +++ b/lib/Array/index.d.ts @@ -357,6 +357,23 @@ export type Pop< */ export type Push = [...Arr, E]; +/** + * This method is like `Array.prototype.revers`, it reverses the array. + * + * @param Arr The array to be reversed. + * @param Result The array to store the final reversed result in the process + * procedure. + * @returns The reversed array. + * + * @example + * type Reverse1 = Array.Reverse<[1, 2, 3]>; // [3, 2, 1] + * type Reverse2 = Array.Reverse<[]>; // [] + */ +export type Reverse + = Arr extends [infer F, ...infer Rest] + ? Reverse + : Result; + } export default Array; \ No newline at end of file From fb6eebeed3b8bbf0b421141ee214c28c063b1dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 11:41:54 +0800 Subject: [PATCH 2/7] :recycle: refactor(array-methods): use `0[]` as `Count` in `Array.At` method --- lib/Array/index.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index a4b4211..b3fc3e3 100644 --- a/lib/Array/index.d.ts +++ b/lib/Array/index.d.ts @@ -25,7 +25,7 @@ declare namespace Array { export type CreateArrayFromLength< L extends number, T extends unknown = undefined, - Count extends T[] = [] + Count extends unknown[] = [] > = Integer.IsNegative extends true ? [] : Count["length"] extends L @@ -53,7 +53,7 @@ export type CreateArrayFromLength< export type At< Arr extends unknown[], N extends number, - Count extends unknown[] = [] + Count extends 0[] = [] > = Integer.Eq extends true ? never : Integer.IsNegative extends true @@ -65,7 +65,7 @@ export type At< ? F : never : Arr extends [infer F, ...infer Rest] - ? At + ? At : never; /** From 4f6ac7be3c469e4db472ce05e420698b30dda50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 11:57:20 +0800 Subject: [PATCH 3/7] :test_tube: test(Boolean.Not): fix a typo `Nor` to `Not` --- test/lib-Boolean.test.ts | 4 ++++ test/script/lib-gen.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/test/lib-Boolean.test.ts b/test/lib-Boolean.test.ts index 4bb8067..22894a4 100644 --- a/test/lib-Boolean.test.ts +++ b/test/lib-Boolean.test.ts @@ -25,6 +25,10 @@ type CaseLibBoolean = [ Expect, false>>, Expect, true>>, + // Boolean.Not + Expect, true>>, + Expect, false>>, + // Boolean.Nor Expect, true>>, Expect, false>>, diff --git a/test/script/lib-gen.sh b/test/script/lib-gen.sh index 96049b8..ff664ce 100644 --- a/test/script/lib-gen.sh +++ b/test/script/lib-gen.sh @@ -54,7 +54,7 @@ declare -A test_cases=( ["Boolean.And"]="false‖false∷false false‖true∷false true‖false∷false true‖true∷true" ["Boolean.Or"]="false‖false∷false false‖true∷true true‖false∷true true‖true∷true" - ["Boolean.Nor"]="false∷true true∷false" + ["Boolean.Not"]="false∷true true∷false" ["Boolean.Nand"]="false‖false∷true false‖true∷true true‖false∷true true‖true∷false" ["Boolean.Nor"]="false‖false∷true false‖true∷false true‖false∷false true‖true∷false" ["Boolean.MultipleAnd"]="[true,true,true]∷true [true,false,true]∷false [false,false,false]∷false" From 6ef7bdb920754527cb0b5af8d5db7a6c2b123a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 12:20:16 +0800 Subject: [PATCH 4/7] :sparkles: feat(array-methods): add `Array.Shift` method --- lib/Array/index.d.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index b3fc3e3..f00e376 100644 --- a/lib/Array/index.d.ts +++ b/lib/Array/index.d.ts @@ -374,6 +374,43 @@ export type Reverse ? Reverse : Result; +/** + * This method is like `Array.prototype.shift`, but it cannot change the array itself + * (types are not references). So we can use `Mode` to determine whether this method + * returns the rest part or returns the shifted element. + * + * @param Arr The array to be shifted. + * @param Mode If you choose mode `"get-rest"`, this method will return the rest + * part of array. If you choose mode `"get-shift-element"`, this method will return the + * shifted element. Default to `"get-rest"` + * @returns When `Mode` is `"get-rest"`, returns the rest part. When `Mode` is `"get- + * shift-element"`, returns the shifted element. + * + * @example + * // "get-rest" mode + * type Shift1 = Array.Shift<[1, 2, 3]>; // [2, 3] + * type Shift2 = Array.Shift<[1], "get-rest">; // [] + * type Shift3 = Array.Shift<[], "get-rest">; // never + * + * // "get-pop-element" mode + * type Pop4 = Array.Pop<[1, 2, 3], "get-pop-element">; // 3 + * type Pop5 = Array.Pop<[1], "get-pop-element">; // 1 + * type Pop6 = Array.Pop<[], "get-pop-element">; // never + */ +export type Shift< + Arr extends unknown[], + Mode extends + | "get-rest" + | "get-shift-element" + = "get-rest" +> = Mode extends "get-rest" + ? Arr extends [infer ShiftElement, ...infer Rest] + ? Rest + : never + : Arr extends [infer ShiftElement, ...infer Rest] + ? ShiftElement + : never; + } export default Array; \ No newline at end of file From b49d9e43b3b6ecb9b501d9469f4bb2ca67765042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 12:21:56 +0800 Subject: [PATCH 5/7] :tongue: typo(comment): fix typo `pop` to `shift` --- lib/Array/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index f00e376..2322e17 100644 --- a/lib/Array/index.d.ts +++ b/lib/Array/index.d.ts @@ -392,10 +392,10 @@ export type Reverse * type Shift2 = Array.Shift<[1], "get-rest">; // [] * type Shift3 = Array.Shift<[], "get-rest">; // never * - * // "get-pop-element" mode - * type Pop4 = Array.Pop<[1, 2, 3], "get-pop-element">; // 3 - * type Pop5 = Array.Pop<[1], "get-pop-element">; // 1 - * type Pop6 = Array.Pop<[], "get-pop-element">; // never + * // "get-shift-element" mode + * type Shift4 = Array.Shift<[1, 2, 3], "get-shift-element">; // 1 + * type Shift5 = Array.Shift<[1], "get-shift-element">; // 1 + * type Shift6 = Array.Shift<[], "get-shift-element">; // never */ export type Shift< Arr extends unknown[], From ff8f96ef5f11959a6e45ad4828fa6b822bda207d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 13:39:47 +0800 Subject: [PATCH 6/7] :memo: doc(changelog): add `Array.Reverse` and `Array.Shift` methods to next version --- changelog/next.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/changelog/next.md b/changelog/next.md index 05218c5..1018098 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -48,6 +48,12 @@ + Add a new method of `Array` namespace: + `Array.LastIndexOf` +### 2025-07--09 (feature/array-methods → main) + ++ Add two new methods of `Array` namespace: + + `Array.Reverse` + + `Array.Shift` + ## ⚡ Improvements ## 🐦‍🔥 No longer broken \ No newline at end of file From ba18770e47e38db3d3dc5a159d3aa7724d916643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AshGrey=F0=9F=A5=95?= Date: Wed, 9 Jul 2025 13:46:09 +0800 Subject: [PATCH 7/7] :tongue: typo(tsdoc): fix typo `revers` to `reverse` --- lib/Array/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index 2322e17..ca46c08 100644 --- a/lib/Array/index.d.ts +++ b/lib/Array/index.d.ts @@ -358,7 +358,7 @@ export type Pop< export type Push = [...Arr, E]; /** - * This method is like `Array.prototype.revers`, it reverses the array. + * This method is like `Array.prototype.reverse`, it reverses the array. * * @param Arr The array to be reversed. * @param Result The array to store the final reversed result in the process