@stacksjs/arrays 0.70.57 → 0.70.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/arr.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./contains";
2
+ export * from "./helpers";
3
+ export * from "./math";
@@ -0,0 +1,18 @@
1
+ export function contains(needle, haystack) {
2
+ return haystack.some((hay) => needle.includes(hay));
3
+ }
4
+ export function containsAll(needles, haystack) {
5
+ return needles.every((needle) => contains(needle, haystack));
6
+ }
7
+ export function containsAny(needles, haystack) {
8
+ return needles.some((needle) => contains(needle, haystack));
9
+ }
10
+ export function containsNone(needles, haystack) {
11
+ return !containsAny(needles, haystack);
12
+ }
13
+ export function containsOnly(needles, haystack) {
14
+ return containsAll(haystack, needles);
15
+ }
16
+ export function doesNotContain(needle, haystack) {
17
+ return !contains(needle, haystack);
18
+ }
@@ -0,0 +1,85 @@
1
+ import { clamp } from "@stacksjs/utils";
2
+ export function toArray(array) {
3
+ array = array ?? [];
4
+ return Array.isArray(array) ? array : [array];
5
+ }
6
+ export function flatten(array) {
7
+ return toArray(array).reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
8
+ }
9
+ export function mergeArrayable(...args) {
10
+ return args.flatMap((i) => toArray(i));
11
+ }
12
+ export function partition(array, ...filters) {
13
+ const result = Array.from({ length: filters.length + 1 }).fill(null).map(() => []);
14
+ array.forEach((e, idx, arr) => {
15
+ let i = 0;
16
+ for (const filter of filters) {
17
+ if (filter(e, idx, arr)) {
18
+ result[i].push(e);
19
+ return;
20
+ }
21
+ i += 1;
22
+ }
23
+ result[i].push(e);
24
+ });
25
+ return result;
26
+ }
27
+ export function uniq(array) {
28
+ return Array.from(new Set(array));
29
+ }
30
+ export function unique(array) {
31
+ return uniq(array);
32
+ }
33
+ export function uniqueBy(array, equalFn) {
34
+ return array.reduce((acc, cur) => {
35
+ if (acc.findIndex((item) => equalFn(cur, item)) === -1)
36
+ acc.push(cur);
37
+ return acc;
38
+ }, []);
39
+ }
40
+ export function last(array) {
41
+ return at(array, -1);
42
+ }
43
+ export function remove(array, value) {
44
+ if (!array)
45
+ return !1;
46
+ const index = array.indexOf(value);
47
+ if (index >= 0) {
48
+ array.splice(index, 1);
49
+ return !0;
50
+ }
51
+ return !1;
52
+ }
53
+ export function at(array, index) {
54
+ const len = array.length;
55
+ if (!len)
56
+ return;
57
+ if (index < 0)
58
+ index += len;
59
+ return array[index];
60
+ }
61
+ export function move(array, from, to) {
62
+ const len = array.length;
63
+ if (!len)
64
+ return [];
65
+ if (from < 0)
66
+ from += len;
67
+ if (to < 0)
68
+ to += len;
69
+ const item = array.splice(from, 1)[0];
70
+ array.splice(to, 0, item);
71
+ return array;
72
+ }
73
+ export function clampArrayRange(arr, n) {
74
+ return clamp(n, 0, arr.length - 1);
75
+ }
76
+ export function sample(arr, count) {
77
+ return Array.from({ length: count }, () => arr[Math.floor(Math.random() * arr.length)]);
78
+ }
79
+ export function shuffle(array) {
80
+ for (let i = array.length - 1;i > 0; i--) {
81
+ const j = Math.floor(Math.random() * (i + 1));
82
+ [array[i], array[j]] = [array[j], array[i]];
83
+ }
84
+ return array;
85
+ }
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
- // @bun
2
- function M(z,E){return E.some((G)=>z.includes(G))}function W(z,E){return z.every((G)=>M(G,E))}function X(z,E){return z.some((G)=>M(G,E))}function D(z,E){return!X(z,E)}function O(z,E){return W(E,z)}function S(z,E){return!M(z,E)}import{clamp as p}from"@stacksjs/utils";function P(z){return z=z??[],Array.isArray(z)?z:[z]}function Y(z){return P(z).reduce((E,G)=>E.concat(Array.isArray(G)?Y(G):G),[])}function T(...z){return z.flatMap((E)=>P(E))}function j(z,...E){let G=Array.from({length:E.length+1}).fill(null).map(()=>[]);return z.forEach((H,I,J)=>{let L=0;for(let U of E){if(U(H,I,J)){G[L].push(H);return}L+=1}G[L].push(H)}),G}function Z(z){return Array.from(new Set(z))}function m(z){return Z(z)}function V(z,E){return z.reduce((G,H)=>{if(G.findIndex((J)=>E(H,J))===-1)G.push(H);return G},[])}function F(z){return _(z,-1)}function N(z,E){if(!z)return!1;let G=z.indexOf(E);if(G>=0)return z.splice(G,1),!0;return!1}function _(z,E){let G=z.length;if(!G)return;if(E<0)E+=G;return z[E]}function R(z,E,G){let H=z.length;if(!H)return[];if(E<0)E+=H;if(G<0)G+=H;let I=z.splice(E,1)[0];return z.splice(G,0,I),z}function C(z,E){return p(E,0,z.length-1)}function $(z,E){return Array.from({length:E},()=>z[Math.floor(Math.random()*z.length)])}function w(z){for(let E=z.length-1;E>0;E--){let G=Math.floor(Math.random()*(E+1));[z[E],z[G]]=[z[G],z[E]]}return z}function K(z){if(z.length===0)throw Error("Cannot compute average of an empty array");return B(z)/z.length}function d(z){return K(z)}function Q(z){if(z.length===0)throw Error("Cannot compute median of an empty array");let E=[...z].sort((I,J)=>I-J),G=Math.floor(E.length/2),H;if(E.length%2!==0)H=E[G];else H=(E[G]+E[G-1])/2;return H}function b(z){if(z.length===0)throw Error("Cannot compute mode of an empty array");let E=new Map;for(let I of z)E.set(I,(E.get(I)||0)+1);let G=0,H=z[0];for(let[I,J]of E)if(J>G)G=J,H=I;return H}function B(z){return z.reduce((E,G)=>E+G,0)}function o(z){let E=1;for(let G of z)if(E*=G,Number.isFinite(E)&&Math.abs(E)>Number.MAX_SAFE_INTEGER)throw RangeError(`[arrays.product] Result exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}); use BigInt for large products.`);return E}function x(z){if(z.length===0)throw Error("Cannot compute min of an empty array");return Math.min(...z)}function g(z){if(z.length===0)throw Error("Cannot compute max of an empty array");return Math.max(...z)}function q(z){return g(z)-x(z)}function k(z){let E=K(z);return K(z.map((G)=>(G-E)**2))}function f(z){return Math.sqrt(k(z))}function i(z,E){return(E-K(z))/f(z)}function l(z,E){let G=[...z].sort((U,A)=>U-A),H=E/100*(G.length-1),I=Math.floor(H),J=Math.ceil(H),L=H-I;if(J===I)return G[H]??0;return(1-L)*(G[I]??0)+L*(G[J]??0)}function c(z){let E=Q(z.slice(0,Math.floor(z.length/2)));return Q(z.slice(Math.ceil(z.length/2)))-E}function s(z,E){if(z.length!==E.length)throw Error("Arrays must have the same length");let G=K(z),H=K(E);return K(z.map((I,J)=>(I-G)*(E[J]-H)))}var r={contains(z,E){return M(z,E)},containsAll(z,E){return W(z,E)},containsAny(z,E){return X(z,E)},containsNone(z,E){return D(z,E)},containsOnly(z,E){return O(z,E)},doesNotContain(z,E){return S(z,E)},toArray(z){return P(z)},flatten(z){return Y(z)},mergeArrayable(...z){return T(...z)},partition(z,E){return j(z,E)},random(z,E=1){return $(z,E).filter((G)=>G!=null)},sample(z,E=1){return $(z,E)},unique(z){return Z(z)},uniqueBy(z,E){return V(z,E)},last(z){return F(z)},remove(z,E){return N(z,E)},at(z,E){return _(z,E)},range(z){return q(z)},move(z,E,G){return R(z,E,G)},clampArrayRange(z,E){return C(z,E)},shuffle(z){return w(z)},sum(z){return B(z)},average(z){return K(z)},avg(z){return K(z)},median(z){return Q(z)},mode(z){return b(z)}};export{i as zScore,k as variance,V as uniqueBy,m as unique,Z as uniq,P as toArray,B as sum,f as standardDeviation,w as shuffle,$ as sample,N as remove,q as range,o as product,l as percentile,j as partition,R as move,b as mode,x as min,T as mergeArrayable,Q as median,g as max,F as last,c as interquartileRange,Y as flatten,S as doesNotContain,s as covariance,O as containsOnly,D as containsNone,X as containsAny,W as containsAll,M as contains,C as clampArrayRange,d as avg,K as average,_ as at,Gz as arr,r as Arr};
1
+ export * from "./arr";
2
+ export * as arr from "./arr";
3
+ export * from "./macro";
package/dist/macro.js ADDED
@@ -0,0 +1,97 @@
1
+ import { contains, containsAll, containsAny, containsNone, containsOnly, doesNotContain } from "./contains";
2
+ import {
3
+ at,
4
+ clampArrayRange,
5
+ flatten,
6
+ last,
7
+ mergeArrayable,
8
+ move,
9
+ partition,
10
+ remove,
11
+ sample,
12
+ shuffle,
13
+ toArray,
14
+ uniq,
15
+ uniqueBy
16
+ } from "./helpers";
17
+ import { average, median, mode, range, sum } from "./math";
18
+ export const Arr = {
19
+ contains(needle, haystack) {
20
+ return contains(needle, haystack);
21
+ },
22
+ containsAll(needles, haystack) {
23
+ return containsAll(needles, haystack);
24
+ },
25
+ containsAny(needles, haystack) {
26
+ return containsAny(needles, haystack);
27
+ },
28
+ containsNone(needles, haystack) {
29
+ return containsNone(needles, haystack);
30
+ },
31
+ containsOnly(needles, haystack) {
32
+ return containsOnly(needles, haystack);
33
+ },
34
+ doesNotContain(needle, haystack) {
35
+ return doesNotContain(needle, haystack);
36
+ },
37
+ toArray(array) {
38
+ return toArray(array);
39
+ },
40
+ flatten(array) {
41
+ return flatten(array);
42
+ },
43
+ mergeArrayable(...args) {
44
+ return mergeArrayable(...args);
45
+ },
46
+ partition(array, filter) {
47
+ return partition(array, filter);
48
+ },
49
+ random(arr, count = 1) {
50
+ return sample(arr, count).filter((item) => item != null);
51
+ },
52
+ sample(arr, count = 1) {
53
+ return sample(arr, count);
54
+ },
55
+ unique(arr) {
56
+ return uniq(arr);
57
+ },
58
+ uniqueBy(arr, equalFn) {
59
+ return uniqueBy(arr, equalFn);
60
+ },
61
+ last(arr) {
62
+ return last(arr);
63
+ },
64
+ remove(arr, value) {
65
+ return remove(arr, value);
66
+ },
67
+ at(arr, index) {
68
+ return at(arr, index);
69
+ },
70
+ range(arr) {
71
+ return range(arr);
72
+ },
73
+ move(arr, from, to) {
74
+ return move(arr, from, to);
75
+ },
76
+ clampArrayRange(arr, n) {
77
+ return clampArrayRange(arr, n);
78
+ },
79
+ shuffle(arr) {
80
+ return shuffle(arr);
81
+ },
82
+ sum(arr) {
83
+ return sum(arr);
84
+ },
85
+ average(arr) {
86
+ return average(arr);
87
+ },
88
+ avg(arr) {
89
+ return average(arr);
90
+ },
91
+ median(arr) {
92
+ return median(arr);
93
+ },
94
+ mode(arr) {
95
+ return mode(arr);
96
+ }
97
+ }, arr = Arr;
package/dist/math.js ADDED
@@ -0,0 +1,84 @@
1
+ export function average(arr) {
2
+ if (arr.length === 0)
3
+ throw Error("Cannot compute average of an empty array");
4
+ return sum(arr) / arr.length;
5
+ }
6
+ export function avg(arr) {
7
+ return average(arr);
8
+ }
9
+ export function median(arr) {
10
+ if (arr.length === 0)
11
+ throw Error("Cannot compute median of an empty array");
12
+ const sorted = [...arr].sort((a, b) => a - b), mid = Math.floor(sorted.length / 2);
13
+ let medianValue;
14
+ if (sorted.length % 2 !== 0)
15
+ medianValue = sorted[mid];
16
+ else
17
+ medianValue = (sorted[mid] + sorted[mid - 1]) / 2;
18
+ return medianValue;
19
+ }
20
+ export function mode(arr) {
21
+ if (arr.length === 0)
22
+ throw Error("Cannot compute mode of an empty array");
23
+ const counts = new Map;
24
+ for (const v of arr)
25
+ counts.set(v, (counts.get(v) || 0) + 1);
26
+ let maxCount = 0, result = arr[0];
27
+ for (const [value, count] of counts)
28
+ if (count > maxCount) {
29
+ maxCount = count;
30
+ result = value;
31
+ }
32
+ return result;
33
+ }
34
+ export function sum(array) {
35
+ return array.reduce((acc, cur) => acc + cur, 0);
36
+ }
37
+ export function product(array) {
38
+ let acc = 1;
39
+ for (const cur of array) {
40
+ acc *= cur;
41
+ if (Number.isFinite(acc) && Math.abs(acc) > Number.MAX_SAFE_INTEGER)
42
+ throw RangeError(`[arrays.product] Result exceeds Number.MAX_SAFE_INTEGER (${Number.MAX_SAFE_INTEGER}); use BigInt for large products.`);
43
+ }
44
+ return acc;
45
+ }
46
+ export function min(array) {
47
+ if (array.length === 0)
48
+ throw Error("Cannot compute min of an empty array");
49
+ return Math.min(...array);
50
+ }
51
+ export function max(array) {
52
+ if (array.length === 0)
53
+ throw Error("Cannot compute max of an empty array");
54
+ return Math.max(...array);
55
+ }
56
+ export function range(array) {
57
+ return max(array) - min(array);
58
+ }
59
+ export function variance(array) {
60
+ const mean = average(array);
61
+ return average(array.map((num) => (num - mean) ** 2));
62
+ }
63
+ export function standardDeviation(array) {
64
+ return Math.sqrt(variance(array));
65
+ }
66
+ export function zScore(array, num) {
67
+ return (num - average(array)) / standardDeviation(array);
68
+ }
69
+ export function percentile(array, num) {
70
+ const sorted = [...array].sort((a, b) => a - b), index = num / 100 * (sorted.length - 1), lower = Math.floor(index), upper = Math.ceil(index), weight = index - lower;
71
+ if (upper === lower)
72
+ return sorted[index] ?? 0;
73
+ return (1 - weight) * (sorted[lower] ?? 0) + weight * (sorted[upper] ?? 0);
74
+ }
75
+ export function interquartileRange(array) {
76
+ const q1 = median(array.slice(0, Math.floor(array.length / 2)));
77
+ return median(array.slice(Math.ceil(array.length / 2))) - q1;
78
+ }
79
+ export function covariance(array1, array2) {
80
+ if (array1.length !== array2.length)
81
+ throw Error("Arrays must have the same length");
82
+ const mean1 = average(array1), mean2 = average(array2);
83
+ return average(array1.map((num1, i) => (num1 - mean1) * (array2[i] - mean2)));
84
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/arrays",
3
3
  "type": "module",
4
- "version": "0.70.57",
4
+ "version": "0.70.59",
5
5
  "description": "The Stacks array utilities.",
6
6
  "author": "Chris Breuer",
7
7
  "contributors": [
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "better-dx": "^0.2.12",
58
- "@stacksjs/utils": "0.70.57"
58
+ "@stacksjs/utils": "0.70.59"
59
59
  },
60
60
  "sideEffects": false
61
61
  }