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 diff --git a/lib/Array/index.d.ts b/lib/Array/index.d.ts index 198867a..ca46c08 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; /** @@ -357,6 +357,60 @@ export type Pop< */ export type Push = [...Arr, E]; +/** + * 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 + * 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; + +/** + * 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-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[], + 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 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"