UNPKG

ts-data-forge

Version:

[![npm version](https://img.shields.io/npm/v/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![npm downloads](https://img.shields.io/npm/dm/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![License](https://img.shields.

59 lines (50 loc) 1.52 kB
import { Num } from '../../number/index.mjs'; /** * Slices an array with automatically clamped start and end indices. * * @example * * ```ts * const letters = ['a', 'b', 'c', 'd', 'e']; * * const lastThree = Arr.sliceClamped(letters, -3, 10); * * const middleTwo = Arr.sliceClamped(1, 3)(letters); * * assert.deepStrictEqual(lastThree, ['a', 'b', 'c', 'd', 'e']); * * assert.deepStrictEqual(middleTwo, ['b', 'c']); * ``` */ export function sliceClamped<const Ar extends readonly unknown[]>( array: Ar, start: ArgArrayIndexWithNegative<Ar>, end: ArgArrayIndexWithNegative<Ar>, ): readonly Ar[number][]; export function sliceClamped( start: SizeType.ArgArrWithNegative, end: SizeType.ArgArrWithNegative, ): <E>(array: readonly E[]) => readonly E[]; export function sliceClamped<E>( ...args: | readonly [ readonly E[], SizeType.ArgArrWithNegative, SizeType.ArgArrWithNegative, ] | readonly [SizeType.ArgArrWithNegative, SizeType.ArgArrWithNegative] ): readonly E[] | ((array: readonly E[]) => readonly E[]) { switch (args.length) { case 3: { const [array, start, end] = args; const startClamped = Num.clamp(0, array.length)(start); // Ensure endClamped is not less than startClamped. const endClamped = Num.clamp(startClamped, array.length)(end); return array.slice(startClamped, endClamped); } case 2: { const [start, end] = args; return (array) => sliceClamped(array, start, end); } } }