import { IsEqual } from "./equal"; import { Abs, IfPositive, IsNegative, ParseNumber } from "./number"; import { IfGreaterOrEqual, IsGreaterOrEqual } from "./greater-than"; import { Sum } from "./sum"; import { Or } from "./or"; import { Push } from "./push"; import { IsEmptyArray } from "./array"; import { And } from "./and"; import { If } from "./if"; import { IsLowerThan } from "./lower-than"; import { IsArrayIndex } from "./is-array-index"; type SliceRemovedItemValue = Record<"__type-samurai_internal__", symbol>; type FilterRemoved< T extends readonly unknown[], Result extends unknown[] = [] > = T extends readonly [infer First, ...infer Rest extends unknown[]] ? FilterRemoved< Rest, First extends SliceRemovedItemValue ? Result : Push > : Result; /** * Type version of `Array.prototype.slice()` method. Returns a shallow copy of a portion of an array into a new array object selected from `start` to `end` (`end` not included) * @example * ```ts * // [2, 3] * type T0 = Slice<[1, 2, 3, 4], 1>; * // [2, 3] * type T1 = Slice<[1, 2, 3, 4], 1, 3>; * ``` */ type Slice< T extends readonly unknown[], Start extends number = 0, End extends number = T["length"] > = ( IsEmptyArray extends true ? "self" : IsGreaterOrEqual extends true ? "empty" : IsNegative extends true ? IsGreaterOrEqual, T["length"]> extends true ? "empty" : [ IfPositive>, Sum ] : And< Or, IsGreaterOrEqual, T["length"]>>, IsGreaterOrEqual > extends true ? "self" : [IfPositive>, End] ) extends infer Indexes ? Indexes extends "self" ? T : Indexes extends "empty" ? [] : Indexes extends [ infer NewStart extends number, infer NewEnd extends number ] ? IfGreaterOrEqual extends true ? [] : FilterRemoved<{ [K in keyof T]: IsArrayIndex extends true ? If< And< IsGreaterOrEqual, NewStart>, IsLowerThan, NewEnd> >, T[K], SliceRemovedItemValue > : T[K]; }> : T : T;