New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@prelude/array

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@prelude/array - npm Package Compare versions

Comparing version
2.2.0
to
2.3.0
+1
cjs/permutations.test.d.ts
export {};
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const A = __importStar(require("./index.js"));
const p = _ => Array.from(A.permutations(_.split(''))).map(_ => _.join(''));
test('permutations', () => {
expect(p('')).toEqual([
''
]);
expect(p('a')).toEqual([
'a'
]);
expect(p('ab')).toEqual([
'ab',
'ba'
]);
expect(p('abc')).toEqual([
'abc',
'bac',
'cab',
'acb',
'bca',
'cba'
]);
expect(p('abcd')).toEqual([
'abcd',
'bacd',
'cabd',
'acbd',
'bcad',
'cbad',
'dbac',
'bdac',
'adbc',
'dabc',
'badc',
'abdc',
'acdb',
'cadb',
'dacb',
'adcb',
'cdab',
'dcab',
'dcba',
'cdba',
'bdca',
'dbca',
'cbda',
'bcda'
]);
});
//# sourceMappingURL=permutations.test.js.map
{"version":3,"file":"permutations.test.js","sourceRoot":"","sources":["../src/permutations.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8CAA+B;AAE/B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAE3E,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;IACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpB,EAAE;KACH,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACrB,GAAG;KACJ,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtB,IAAI;QACJ,IAAI;KACL,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACN,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACxB,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;KACP,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const A = __importStar(require("./index.js"));
test('deleteSwapRandom', () => {
const a = A.indices(1000);
const b = A.clone(a);
expect(a).toEqual(b);
const c = [];
while (b.length) {
c.push(A.deleteSwapRandom(b));
}
expect(c).toHaveLength(1000);
expect(A.sorted(c, A.Cmp.numbers)).toEqual(a);
});
test('unique', () => {
expect(A.unique([3, 5, 5, 7, 3, 7], _ => _)).toEqual([3, 5, 7]);
});
test('groups', () => {
expect(A.groups([3, 5, 4, 2, 5, 7, 2], _ => _ % 2)).toEqual([
[3, 5, 5, 7],
[4, 2, 2]
]);
});
//# sourceMappingURL=simple.test.js.map
{"version":3,"file":"simple.test.js","sourceRoot":"","sources":["../src/simple.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8CAA+B;AAE/B,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,MAAM,CAAC,GAAa,EAAE,CAAA;IACtB,OAAO,CAAC,CAAC,MAAM,EAAE;QACf,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;KAC9B;IACD,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,CAAC,CAAA;AACrE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;QACd,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;KACZ,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
const resolveSnapshotPath =
(testPath, snapshotExtension) =>
testPath
.replace('.test' + '.js', '.test' + snapshotExtension)
.replace('/cjs/', '/src/')
const resolveTestPath =
(snapshotFilePath, snapshotExtension) =>
snapshotFilePath
.replace(snapshotExtension, '.js')
.replace('/src/', '/cjs/')
const testPathForConsistencyCheck =
'./cjs/index.test.js'
module.exports = {
resolveSnapshotPath,
resolveTestPath,
testPathForConsistencyCheck
}
import * as A from './index.js';
const p = _ => Array.from(A.permutations(_.split(''))).map(_ => _.join(''));
test('permutations', () => {
expect(p('')).toEqual([
''
]);
expect(p('a')).toEqual([
'a'
]);
expect(p('ab')).toEqual([
'ab',
'ba'
]);
expect(p('abc')).toEqual([
'abc',
'bac',
'cab',
'acb',
'bca',
'cba'
]);
expect(p('abcd')).toEqual([
'abcd',
'bacd',
'cabd',
'acbd',
'bcad',
'cbad',
'dbac',
'bdac',
'adbc',
'dabc',
'badc',
'abdc',
'acdb',
'cadb',
'dacb',
'adcb',
'cdab',
'dcab',
'dcba',
'cdba',
'bdca',
'dbca',
'cbda',
'bcda'
]);
});
//# sourceMappingURL=permutations.test.js.map
{"version":3,"file":"permutations.test.js","sourceRoot":"","sources":["../src/permutations.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAA;AAE/B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAE3E,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;IACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpB,EAAE;KACH,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACrB,GAAG;KACJ,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtB,IAAI;QACJ,IAAI;KACL,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACN,CAAC,CAAA;IACF,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACxB,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;KACP,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
import * as A from './index.js';
test('deleteSwapRandom', () => {
const a = A.indices(1000);
const b = A.clone(a);
expect(a).toEqual(b);
const c = [];
while (b.length) {
c.push(A.deleteSwapRandom(b));
}
expect(c).toHaveLength(1000);
expect(A.sorted(c, A.Cmp.numbers)).toEqual(a);
});
test('unique', () => {
expect(A.unique([3, 5, 5, 7, 3, 7], _ => _)).toEqual([3, 5, 7]);
});
test('groups', () => {
expect(A.groups([3, 5, 4, 2, 5, 7, 2], _ => _ % 2)).toEqual([
[3, 5, 5, 7],
[4, 2, 2]
]);
});
//# sourceMappingURL=simple.test.js.map
{"version":3,"file":"simple.test.js","sourceRoot":"","sources":["../src/simple.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,YAAY,CAAA;AAE/B,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACpB,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,MAAM,CAAC,GAAa,EAAE,CAAA;IACtB,OAAO,CAAC,CAAC,MAAM,EAAE;QACf,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;KAC9B;IACD,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,CAAC,CAAA;AACrE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;QACd,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;KACZ,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
import * as A from './index.js'
const p = _ => Array.from(A.permutations(_.split(''))).map(_ => _.join(''))
test('permutations', () => {
expect(p('')).toEqual([
''
])
expect(p('a')).toEqual([
'a'
])
expect(p('ab')).toEqual([
'ab',
'ba'
])
expect(p('abc')).toEqual([
'abc',
'bac',
'cab',
'acb',
'bca',
'cba'
])
expect(p('abcd')).toEqual([
'abcd',
'bacd',
'cabd',
'acbd',
'bcad',
'cbad',
'dbac',
'bdac',
'adbc',
'dabc',
'badc',
'abdc',
'acdb',
'cadb',
'dacb',
'adcb',
'cdab',
'dcab',
'dcba',
'cdba',
'bdca',
'dbca',
'cbda',
'bcda'
])
})
import * as A from './index.js'
test('deleteSwapRandom', () => {
const a = A.indices(1000)
const b = A.clone(a)
expect(a).toEqual(b)
const c: number[] = []
while (b.length) {
c.push(A.deleteSwapRandom(b))
}
expect(c).toHaveLength(1000)
expect(A.sorted(c, A.Cmp.numbers)).toEqual(a)
})
test('unique', () => {
expect(A.unique([ 3, 5, 5, 7, 3, 7 ], _ => _)).toEqual([ 3, 5, 7 ])
})
test('groups', () => {
expect(A.groups([ 3, 5, 4, 2, 5, 7, 2 ], _ => _ % 2)).toEqual([
[ 3, 5, 5, 7 ],
[ 4, 2, 2 ]
])
})
+1
-1
/**
* Like `at` but wraps using modulo on length.
* @throws {TypeError} if array is empty or index is negative or not safe integer.
* @throws {TypeError} if array is empty or index is not a safe integer.
*/
declare const modulo: <T>(values: T[], index: number) => T;
export default modulo;

@@ -5,14 +5,15 @@ "use strict";

* Like `at` but wraps using modulo on length.
* @throws {TypeError} if array is empty or index is negative or not safe integer.
* @throws {TypeError} if array is empty or index is not a safe integer.
*/
const modulo = (values, index) => {
if (values.length === 0) {
if (!Number.isSafeInteger(index)) {
throw new TypeError(`Expected safe integer index, got ${index}.`);
}
const n = values.length;
if (n === 0) {
throw new TypeError('Expected non empty array.');
}
if (!Number.isSafeInteger(index) || index < 0) {
throw new TypeError(`Expected non negative safe integer index, got ${index}.`);
}
return values[index % values.length];
return values[((index % n) + n) % n];
};
exports.default = modulo;
//# sourceMappingURL=modulo.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"modulo.js","sourceRoot":"","sources":["../src/modulo.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,MAAM,MAAM,GACV,CAAI,MAAW,EAAE,KAAa,EAAK,EAAE;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAA;KACjD;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;QAC7C,MAAM,IAAI,SAAS,CAAC,iDAAiD,KAAK,GAAG,CAAC,CAAA;KAC/E;IACD,OAAO,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AACtC,CAAC,CAAA;AAEH,kBAAe,MAAM,CAAA"}
{"version":3,"file":"modulo.js","sourceRoot":"","sources":["../src/modulo.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,MAAM,MAAM,GACV,CAAI,MAAW,EAAE,KAAa,EAAK,EAAE;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QAChC,MAAM,IAAI,SAAS,CAAC,oCAAoC,KAAK,GAAG,CAAC,CAAA;KAClE;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IACvB,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAA;KACjD;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACtC,CAAC,CAAA;AAEH,kBAAe,MAAM,CAAA"}

@@ -13,7 +13,4 @@ clean:

build-test:
@npx tsc -m commonjs -p test/tsconfig.json
build: build-cjs build-mjs
build: build-cjs build-mjs build-test
rebuild: clean build

@@ -20,0 +17,0 @@

/**
* Like `at` but wraps using modulo on length.
* @throws {TypeError} if array is empty or index is negative or not safe integer.
* @throws {TypeError} if array is empty or index is not a safe integer.
*/
declare const modulo: <T>(values: T[], index: number) => T;
export default modulo;
/**
* Like `at` but wraps using modulo on length.
* @throws {TypeError} if array is empty or index is negative or not safe integer.
* @throws {TypeError} if array is empty or index is not a safe integer.
*/
const modulo = (values, index) => {
if (values.length === 0) {
if (!Number.isSafeInteger(index)) {
throw new TypeError(`Expected safe integer index, got ${index}.`);
}
const n = values.length;
if (n === 0) {
throw new TypeError('Expected non empty array.');
}
if (!Number.isSafeInteger(index) || index < 0) {
throw new TypeError(`Expected non negative safe integer index, got ${index}.`);
}
return values[index % values.length];
return values[((index % n) + n) % n];
};
export default modulo;
//# sourceMappingURL=modulo.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"modulo.js","sourceRoot":"","sources":["../src/modulo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,GACV,CAAI,MAAW,EAAE,KAAa,EAAK,EAAE;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAA;KACjD;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;QAC7C,MAAM,IAAI,SAAS,CAAC,iDAAiD,KAAK,GAAG,CAAC,CAAA;KAC/E;IACD,OAAO,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AACtC,CAAC,CAAA;AAEH,eAAe,MAAM,CAAA"}
{"version":3,"file":"modulo.js","sourceRoot":"","sources":["../src/modulo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,GACV,CAAI,MAAW,EAAE,KAAa,EAAK,EAAE;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;QAChC,MAAM,IAAI,SAAS,CAAC,oCAAoC,KAAK,GAAG,CAAC,CAAA;KAClE;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IACvB,IAAI,CAAC,KAAK,CAAC,EAAE;QACX,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAA;KACjD;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AACtC,CAAC,CAAA;AAEH,eAAe,MAAM,CAAA"}
{
"name": "@prelude/array",
"version": "2.2.0",
"version": "2.3.0",
"description": "Array module.",

@@ -29,9 +29,9 @@ "type": "module",

"@tsconfig/node16": "1.0.2",
"@types/jest": "27.0.3",
"eslint": "8.5.0",
"jest": "27.4.5",
"typescript": "4.5.4"
"@types/jest": "27.4.0",
"eslint": "8.8.0",
"jest": "27.4.7",
"typescript": "4.5.5"
},
"dependencies": {
"@prelude/cmp": "1.4.3"
"@prelude/cmp": "2.0.0"
},

@@ -38,0 +38,0 @@ "module": "./mjs/index.js",

/**
* Like `at` but wraps using modulo on length.
* @throws {TypeError} if array is empty or index is negative or not safe integer.
* @throws {TypeError} if array is empty or index is not a safe integer.
*/
const modulo =
<T>(values: T[], index: number): T => {
if (values.length === 0) {
if (!Number.isSafeInteger(index)) {
throw new TypeError(`Expected safe integer index, got ${index}.`)
}
const n = values.length
if (n === 0) {
throw new TypeError('Expected non empty array.')
}
if (!Number.isSafeInteger(index) || index < 0) {
throw new TypeError(`Expected non negative safe integer index, got ${index}.`)
}
return values[index % values.length]
return values[((index % n) + n) % n]
}
export default modulo