Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions changelog/next.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@
+ Add a new method of `Array` namespace:
+ `Array.LastIndexOf<Arr, T>`

### 2025-07--09 (feature/array-methods → main)

+ Add two new methods of `Array` namespace:
+ `Array.Reverse<Arr>`
+ `Array.Shift<Arr, Mode>`

## ⚡ Improvements

## 🐦‍🔥 No longer broken
60 changes: 57 additions & 3 deletions lib/Array/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<L> extends true
? []
: Count["length"] extends L
Expand Down Expand Up @@ -53,7 +53,7 @@ export type CreateArrayFromLength<
export type At<
Arr extends unknown[],
N extends number,
Count extends unknown[] = []
Count extends 0[] = []
> = Integer.Eq<Arr["length"], 0> extends true
? never
: Integer.IsNegative<N> extends true
Expand All @@ -65,7 +65,7 @@ export type At<
? F
: never
: Arr extends [infer F, ...infer Rest]
? At<Rest, N, [...Count, F]>
? At<Rest, N, [...Count, 0]>
: never;

/**
Expand Down Expand Up @@ -357,6 +357,60 @@ export type Pop<
*/
export type Push<Arr extends unknown[], E extends unknown> = [...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 unknown[], Result extends unknown[] = []>
= Arr extends [infer F, ...infer Rest]
? Reverse<Rest, [F, ...Result]>
: 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;
4 changes: 4 additions & 0 deletions test/lib-Boolean.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ type CaseLibBoolean = [
Expect<Equal<Boolean.And<true, false>, false>>,
Expect<Equal<Boolean.And<true, true>, true>>,

// Boolean.Not
Expect<Equal<Boolean.Not<false>, true>>,
Expect<Equal<Boolean.Not<true>, false>>,

// Boolean.Nor
Expect<Equal<Boolean.Nor<false, false>, true>>,
Expect<Equal<Boolean.Nor<false, true>, false>>,
Expand Down
2 changes: 1 addition & 1 deletion test/script/lib-gen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down