diff --git a/package-lock.json b/package-lock.json index e2df39f8b..a778f4941 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "extra-array", - "version": "4.1.13", + "version": "4.1.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "extra-array", - "version": "4.1.13", + "version": "4.1.14", "license": "MIT", "devDependencies": { "@rollup/plugin-commonjs": "^24.1.0", diff --git a/package.json b/package.json index 966ce3929..9a28b0ab5 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "extra-array", - "version": "4.1.13", + "version": "4.1.14", "description": "An array is a collection of values, stored contiguously.", "main": "index.js", "module": "index.mjs", "sideEffects": false, + "private": true, "exports": { "require": "./index.js", "import": "./index.mjs" diff --git a/src/index.ts b/src/index.ts index a89e4e6cd..5cc4c70be 100644 --- a/src/index.ts +++ b/src/index.ts @@ -309,23 +309,23 @@ export function ientries(x: T[]): IEntries { // ------------- /** - * Get zero-based index for an element in array. + * Get unmirrored index for an element in array. * @param x an array - * @param i ±index - * @returns i' | x[i'] = x[i]; i' ∈ [0, |x|] + * @param i mirrored ±index + * @returns i' | x.at(i') = x.at(i); i' ∈ [0, |x|] */ export function index(x: T[], i: number): number { var X = x.length; - return i>=0? Math.min(i, X) : Math.max(X+i, 0); + return i>=0? Math.min(i, X) : (i>=-X? X+i : X); } /** - * Get zero-based index range for part of array. + * Get unmirrored index range for part of array. * @param x an array - * @param i begin ±index [0] - * @param I end ±index (exclusive) [|x|] - * @returns [i', I'] | i' ≤ I'; i', I' ∈ [0, |x|] + * @param i begin mirrored ±index [0] + * @param I end mirrored ±index (exclusive) [|x|] + * @returns [i', I'] | x.slice(i', I') = x.slice(i, I); i' ≤ I'; i', I' ∈ [0, |x|] */ export function indexRange(x: T[], i: number=0, I: number=x.length): [number, number] { var X = x.length; @@ -354,13 +354,10 @@ export function isEmpty(x: T[]): boolean { /** * Find the length of an array. * @param x an array - * @param i begin ±index [0] - * @param I end ±index (exclusive) [X] - * @returns |x[i..I]| + * @returns |x| */ -export function length(x: T[], i: number=0, I: number=x.length): number { - var [i, I] = indexRange(x, i, I); - return I-i; +export function length(x: T[]): number { + return x.length; } export {length as size}; @@ -370,7 +367,7 @@ export {length as size}; * @param x an array * @param n new length * @param vd default value - * @returns resized x + * @returns x | x[|x|..n] = vd; |x| = n */ export function resize$(x: T[], n: number, vd: T) { var X = x.length; x.length = n; @@ -403,7 +400,7 @@ export function clear$(x: T[]) { * @returns x[i] */ export function get(x: T[], i: number): T { - return x[index(x, i)]; + return x[i]; } export {get as at}; @@ -419,7 +416,10 @@ export {get as at}; * @returns [x[i₀], x[i₁], ...] | [i₀, i₁, ...] = is */ export function getAll(x: T[], is: number[]): T[] { - return is.map(i => get(x, i)); + var a = []; + for (var i of is) + a.push(x[i]); + return a; } @@ -431,7 +431,7 @@ export function getAll(x: T[], is: number[]): T[] { */ export function getPath(x: any[], p: number[]): any { for (var i of p) - x = is(x)? get(x, i) : undefined; + x = Array.isArray(x)? x[i] : undefined; return x; } @@ -444,8 +444,8 @@ export function getPath(x: any[], p: number[]): any { */ export function hasPath(x: any[], p: number[]): boolean { for (var i of p) { - if (!is(x)) return false; - x = get(x, i); + if (!Array.isArray(x)) return false; + x = x[i]; } return true; }