@vielzeug/toolkit 1.0.12 → 1.0.13
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/array/chunk.cjs +1 -1
- package/dist/array/chunk.cjs.map +1 -1
- package/dist/array/chunk.js +15 -12
- package/dist/array/chunk.js.map +1 -1
- package/dist/array/group.cjs +1 -1
- package/dist/array/group.cjs.map +1 -1
- package/dist/array/group.js +9 -9
- package/dist/array/group.js.map +1 -1
- package/dist/array/list.cjs +1 -1
- package/dist/array/list.cjs.map +1 -1
- package/dist/array/list.js +28 -24
- package/dist/array/list.js.map +1 -1
- package/dist/array/pick.cjs.map +1 -1
- package/dist/array/pick.js.map +1 -1
- package/dist/date/timeDiff.cjs +1 -1
- package/dist/date/timeDiff.cjs.map +1 -1
- package/dist/date/timeDiff.js +10 -12
- package/dist/date/timeDiff.js.map +1 -1
- package/dist/function/curry.cjs +1 -1
- package/dist/function/curry.cjs.map +1 -1
- package/dist/function/curry.js +3 -3
- package/dist/function/curry.js.map +1 -1
- package/dist/function/debounce.cjs +1 -1
- package/dist/function/debounce.cjs.map +1 -1
- package/dist/function/debounce.js +22 -5
- package/dist/function/debounce.js.map +1 -1
- package/dist/function/memo.cjs +1 -1
- package/dist/function/memo.cjs.map +1 -1
- package/dist/function/memo.js +14 -13
- package/dist/function/memo.js.map +1 -1
- package/dist/function/retry.cjs +1 -1
- package/dist/function/retry.cjs.map +1 -1
- package/dist/function/retry.js +13 -13
- package/dist/function/retry.js.map +1 -1
- package/dist/function/sleep.cjs +1 -1
- package/dist/function/sleep.cjs.map +1 -1
- package/dist/function/sleep.js +8 -3
- package/dist/function/sleep.js.map +1 -1
- package/dist/function/throttle.cjs +1 -1
- package/dist/function/throttle.cjs.map +1 -1
- package/dist/function/throttle.js +33 -6
- package/dist/function/throttle.js.map +1 -1
- package/dist/index.d.ts +62 -51
- package/dist/math/average.cjs +1 -1
- package/dist/math/average.cjs.map +1 -1
- package/dist/math/average.js +18 -12
- package/dist/math/average.js.map +1 -1
- package/dist/math/median.cjs.map +1 -1
- package/dist/math/median.js.map +1 -1
- package/dist/math/range.cjs +1 -1
- package/dist/math/range.cjs.map +1 -1
- package/dist/math/range.js +14 -6
- package/dist/math/range.js.map +1 -1
- package/dist/math/sum.cjs +1 -1
- package/dist/math/sum.cjs.map +1 -1
- package/dist/math/sum.js +11 -18
- package/dist/math/sum.js.map +1 -1
- package/dist/object/clone.cjs +1 -1
- package/dist/object/clone.cjs.map +1 -1
- package/dist/object/clone.js +13 -3
- package/dist/object/clone.js.map +1 -1
- package/dist/object/merge.cjs +1 -1
- package/dist/object/merge.cjs.map +1 -1
- package/dist/object/merge.js +11 -15
- package/dist/object/merge.js.map +1 -1
- package/dist/object/seek.cjs +1 -1
- package/dist/object/seek.cjs.map +1 -1
- package/dist/object/seek.js +8 -6
- package/dist/object/seek.js.map +1 -1
- package/dist/random/uuid.cjs +1 -1
- package/dist/random/uuid.cjs.map +1 -1
- package/dist/random/uuid.js +6 -3
- package/dist/random/uuid.js.map +1 -1
- package/dist/string/camelCase.cjs +1 -1
- package/dist/string/camelCase.cjs.map +1 -1
- package/dist/string/camelCase.js +3 -3
- package/dist/string/camelCase.js.map +1 -1
- package/dist/string/similarity.cjs +1 -1
- package/dist/string/similarity.cjs.map +1 -1
- package/dist/string/similarity.js +24 -21
- package/dist/string/similarity.js.map +1 -1
- package/dist/string/truncate.cjs +1 -1
- package/dist/string/truncate.cjs.map +1 -1
- package/dist/string/truncate.js +14 -5
- package/dist/string/truncate.js.map +1 -1
- package/dist/typed/is.cjs +1 -1
- package/dist/typed/is.cjs.map +1 -1
- package/dist/typed/is.js +30 -31
- package/dist/typed/is.js.map +1 -1
- package/dist/typed/isEmpty.cjs +1 -1
- package/dist/typed/isEmpty.cjs.map +1 -1
- package/dist/typed/isEmpty.js +6 -6
- package/dist/typed/isEmpty.js.map +1 -1
- package/dist/typed/isEqual.cjs +1 -1
- package/dist/typed/isEqual.cjs.map +1 -1
- package/dist/typed/isEqual.js +22 -17
- package/dist/typed/isEqual.js.map +1 -1
- package/package.json +1 -1
package/dist/array/chunk.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../function/assert.cjs"),u=require("../typed/isArray.cjs"),c=require("../typed/isString.cjs");function y(e,r=2,g={}){o.assert(u.isArray(e)||c.isString(e),"Argument must be an array or string.",{args:{input:e},type:TypeError}),o.assert(r>=1,"Chunk size must be at least 1.",{args:{size:r},type:RangeError});const{overlap:l=!1,pad:a=" "}=g;if(c.isString(e)&&l){const s=a+e+a,t=s.length-r+1;return Array.from({length:t},(h,n)=>s.slice(n,n+r))}return Array.from({length:Math.ceil(e.length/r)},(s,t)=>e.slice(t*r,t*r+r))}exports.chunk=y;
|
|
2
2
|
//# sourceMappingURL=chunk.cjs.map
|
package/dist/array/chunk.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.cjs","sources":["../../src/array/chunk.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isString } from '../typed/isString';\n\ntype ChunkOptions = {\n overlap?: boolean;\n pad?: string;\n};\n\ntype ChunkResult<T> = (T extends string ? string : T[])[];\n\n/**\n * Splits an array or string into chunks of a specified size.\n *\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk(\"hello\", 2) // [\"he\", \"ll\", \"o\"]\n * chunk(\"hello\", 2, { overlap: true }) // [\" h\", \"he\", \"el\", \"ll\", \"lo\", \"o \"]\n * ```\n *\n * @param input - The input array or string to be chunked.\n * @param size - The size of each chunk.\n * @param [options] - Additional options for chunking.\n * @param [options.overlap] -\n * @param [options.pad] -\n *\n * @returns An array of chunks.\n *\n * @throws {RangeError} If the chunk size is invalid.\n * @throws {TypeError} If the input type is invalid.\n */\nexport function chunk<T>(input: T[] | string, size = 2, options: ChunkOptions = {}): ChunkResult<T> {\n assert(isArray(input as T[]) || isString(input), 'Argument must be an array or string.', {\n args: { input },\n type: TypeError,\n });\n\n const { overlap = false, pad = ' ' } = options;\n\n if (isString(input) && overlap) {\n const padded =
|
|
1
|
+
{"version":3,"file":"chunk.cjs","sources":["../../src/array/chunk.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isString } from '../typed/isString';\n\ntype ChunkOptions = {\n overlap?: boolean;\n pad?: string;\n};\n\ntype ChunkResult<T> = (T extends string ? string : T[])[];\n\n/**\n * Splits an array or string into chunks of a specified size.\n *\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk(\"hello\", 2) // [\"he\", \"ll\", \"o\"]\n * chunk(\"hello\", 2, { overlap: true }) // [\" h\", \"he\", \"el\", \"ll\", \"lo\", \"o \"]\n * ```\n *\n * @param input - The input array or string to be chunked.\n * @param size - The size of each chunk.\n * @param [options] - Additional options for chunking.\n * @param [options.overlap] -\n * @param [options.pad] -\n *\n * @returns An array of chunks.\n *\n * @throws {RangeError} If the chunk size is invalid.\n * @throws {TypeError} If the input type is invalid.\n */\nexport function chunk<T>(input: T[] | string, size = 2, options: ChunkOptions = {}): ChunkResult<T> {\n assert(isArray(input as T[]) || isString(input), 'Argument must be an array or string.', {\n args: { input },\n type: TypeError,\n });\n\n assert(size >= 1, 'Chunk size must be at least 1.', {\n args: { size },\n type: RangeError,\n });\n\n const { overlap = false, pad = ' ' } = options;\n\n if (isString(input) && overlap) {\n const padded = pad + input + pad;\n const numChunks = padded.length - size + 1;\n return Array.from({ length: numChunks }, (_, i) => padded.slice(i, i + size)) as ChunkResult<T>;\n }\n\n return Array.from({ length: Math.ceil(input.length / size) }, (_, i) =>\n input.slice(i * size, i * size + size),\n ) as ChunkResult<T>;\n}\n"],"names":["chunk","input","size","options","assert","isArray","isString","overlap","pad","padded","numChunks","_","i"],"mappings":"+LAgCO,SAASA,EAASC,EAAqBC,EAAO,EAAGC,EAAwB,CAAA,EAAoB,CAClGC,EAAAA,OAAOC,EAAAA,QAAQJ,CAAY,GAAKK,EAAAA,SAASL,CAAK,EAAG,uCAAwC,CACvF,KAAM,CAAE,MAAAA,CAAA,EACR,KAAM,SAAA,CACP,EAEDG,SAAOF,GAAQ,EAAG,iCAAkC,CAClD,KAAM,CAAE,KAAAA,CAAA,EACR,KAAM,UAAA,CACP,EAED,KAAM,CAAE,QAAAK,EAAU,GAAO,IAAAC,EAAM,KAAQL,EAEvC,GAAIG,EAAAA,SAASL,CAAK,GAAKM,EAAS,CAC9B,MAAME,EAASD,EAAMP,EAAQO,EACvBE,EAAYD,EAAO,OAASP,EAAO,EACzC,OAAO,MAAM,KAAK,CAAE,OAAQQ,GAAa,CAACC,EAAGC,IAAMH,EAAO,MAAMG,EAAGA,EAAIV,CAAI,CAAC,CAC9E,CAEA,OAAO,MAAM,KAAK,CAAE,OAAQ,KAAK,KAAKD,EAAM,OAASC,CAAI,CAAA,EAAK,CAACS,EAAGC,IAChEX,EAAM,MAAMW,EAAIV,EAAMU,EAAIV,EAAOA,CAAI,CAAA,CAEzC"}
|
package/dist/array/chunk.js
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
import { assert as
|
|
1
|
+
import { assert as m } from "../function/assert.js";
|
|
2
2
|
import { isArray as c } from "../typed/isArray.js";
|
|
3
|
-
import { isString as
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
args: { input:
|
|
3
|
+
import { isString as s } from "../typed/isString.js";
|
|
4
|
+
function p(t, r = 2, g = {}) {
|
|
5
|
+
m(c(t) || s(t), "Argument must be an array or string.", {
|
|
6
|
+
args: { input: t },
|
|
7
7
|
type: TypeError
|
|
8
|
+
}), m(r >= 1, "Chunk size must be at least 1.", {
|
|
9
|
+
args: { size: r },
|
|
10
|
+
type: RangeError
|
|
8
11
|
});
|
|
9
|
-
const { overlap:
|
|
10
|
-
if (
|
|
11
|
-
const t =
|
|
12
|
-
return Array.from({ length:
|
|
12
|
+
const { overlap: l = !1, pad: e = " " } = g;
|
|
13
|
+
if (s(t) && l) {
|
|
14
|
+
const o = e + t + e, a = o.length - r + 1;
|
|
15
|
+
return Array.from({ length: a }, (f, n) => o.slice(n, n + r));
|
|
13
16
|
}
|
|
14
17
|
return Array.from(
|
|
15
|
-
{ length: Math.ceil(
|
|
16
|
-
(
|
|
18
|
+
{ length: Math.ceil(t.length / r) },
|
|
19
|
+
(o, a) => t.slice(a * r, a * r + r)
|
|
17
20
|
);
|
|
18
21
|
}
|
|
19
22
|
export {
|
|
20
|
-
|
|
23
|
+
p as chunk
|
|
21
24
|
};
|
|
22
25
|
//# sourceMappingURL=chunk.js.map
|
package/dist/array/chunk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","sources":["../../src/array/chunk.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isString } from '../typed/isString';\n\ntype ChunkOptions = {\n overlap?: boolean;\n pad?: string;\n};\n\ntype ChunkResult<T> = (T extends string ? string : T[])[];\n\n/**\n * Splits an array or string into chunks of a specified size.\n *\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk(\"hello\", 2) // [\"he\", \"ll\", \"o\"]\n * chunk(\"hello\", 2, { overlap: true }) // [\" h\", \"he\", \"el\", \"ll\", \"lo\", \"o \"]\n * ```\n *\n * @param input - The input array or string to be chunked.\n * @param size - The size of each chunk.\n * @param [options] - Additional options for chunking.\n * @param [options.overlap] -\n * @param [options.pad] -\n *\n * @returns An array of chunks.\n *\n * @throws {RangeError} If the chunk size is invalid.\n * @throws {TypeError} If the input type is invalid.\n */\nexport function chunk<T>(input: T[] | string, size = 2, options: ChunkOptions = {}): ChunkResult<T> {\n assert(isArray(input as T[]) || isString(input), 'Argument must be an array or string.', {\n args: { input },\n type: TypeError,\n });\n\n const { overlap = false, pad = ' ' } = options;\n\n if (isString(input) && overlap) {\n const padded =
|
|
1
|
+
{"version":3,"file":"chunk.js","sources":["../../src/array/chunk.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { isArray } from '../typed/isArray';\nimport { isString } from '../typed/isString';\n\ntype ChunkOptions = {\n overlap?: boolean;\n pad?: string;\n};\n\ntype ChunkResult<T> = (T extends string ? string : T[])[];\n\n/**\n * Splits an array or string into chunks of a specified size.\n *\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk(\"hello\", 2) // [\"he\", \"ll\", \"o\"]\n * chunk(\"hello\", 2, { overlap: true }) // [\" h\", \"he\", \"el\", \"ll\", \"lo\", \"o \"]\n * ```\n *\n * @param input - The input array or string to be chunked.\n * @param size - The size of each chunk.\n * @param [options] - Additional options for chunking.\n * @param [options.overlap] -\n * @param [options.pad] -\n *\n * @returns An array of chunks.\n *\n * @throws {RangeError} If the chunk size is invalid.\n * @throws {TypeError} If the input type is invalid.\n */\nexport function chunk<T>(input: T[] | string, size = 2, options: ChunkOptions = {}): ChunkResult<T> {\n assert(isArray(input as T[]) || isString(input), 'Argument must be an array or string.', {\n args: { input },\n type: TypeError,\n });\n\n assert(size >= 1, 'Chunk size must be at least 1.', {\n args: { size },\n type: RangeError,\n });\n\n const { overlap = false, pad = ' ' } = options;\n\n if (isString(input) && overlap) {\n const padded = pad + input + pad;\n const numChunks = padded.length - size + 1;\n return Array.from({ length: numChunks }, (_, i) => padded.slice(i, i + size)) as ChunkResult<T>;\n }\n\n return Array.from({ length: Math.ceil(input.length / size) }, (_, i) =>\n input.slice(i * size, i * size + size),\n ) as ChunkResult<T>;\n}\n"],"names":["chunk","input","size","options","assert","isArray","isString","overlap","pad","padded","numChunks","_","i"],"mappings":";;;AAgCO,SAASA,EAASC,GAAqBC,IAAO,GAAGC,IAAwB,CAAA,GAAoB;AAClG,EAAAC,EAAOC,EAAQJ,CAAY,KAAKK,EAASL,CAAK,GAAG,wCAAwC;AAAA,IACvF,MAAM,EAAE,OAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP,GAEDG,EAAOF,KAAQ,GAAG,kCAAkC;AAAA,IAClD,MAAM,EAAE,MAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAED,QAAM,EAAE,SAAAK,IAAU,IAAO,KAAAC,IAAM,QAAQL;AAEvC,MAAIG,EAASL,CAAK,KAAKM,GAAS;AAC9B,UAAME,IAASD,IAAMP,IAAQO,GACvBE,IAAYD,EAAO,SAASP,IAAO;AACzC,WAAO,MAAM,KAAK,EAAE,QAAQQ,KAAa,CAACC,GAAGC,MAAMH,EAAO,MAAMG,GAAGA,IAAIV,CAAI,CAAC;AAAA,EAC9E;AAEA,SAAO,MAAM;AAAA,IAAK,EAAE,QAAQ,KAAK,KAAKD,EAAM,SAASC,CAAI,EAAA;AAAA,IAAK,CAACS,GAAGC,MAChEX,EAAM,MAAMW,IAAIV,GAAMU,IAAIV,IAAOA,CAAI;AAAA,EAAA;AAEzC;"}
|
package/dist/array/group.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../function/assert.cjs"),u=require("../typed/isArray.cjs");function i(e,o){f.assert(u.isArray(e),u.IS_ARRAY_ERROR_MSG,{args:{array:e},type:TypeError});const t={},c=typeof o=="function"?o:r=>r[o];for(const r of e){const n=c(r),s=n==null?"_":String(n);t[s]||(t[s]=[]),t[s].push(r)}return t}i.fp=!0;exports.group=i;
|
|
2
2
|
//# sourceMappingURL=group.cjs.map
|
package/dist/array/group.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.cjs","sources":["../../src/array/group.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport type { Selector } from '../types';\n\n/**\n * Groups the elements of an array based on the given key.\n *\n * @example\n * ```ts\n * const data = [{ a: 2 }, { a: 1 }];\n * group(data, 'a') // { '1': [{ a: 2 }], '2': [{ a: 1 }] };\n * ```\n *\n * @param array - The array to group.\n * @param selector - The function to generate the key for each element. It can be a string representing the key or a function that returns the key.\n *\n * @returns an object with keys as the grouped values and values as arrays of elements.\n *\n * @throws {TypeError} If the provided array is not an array.\n */\nexport function group<T,
|
|
1
|
+
{"version":3,"file":"group.cjs","sources":["../../src/array/group.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport type { Selector } from '../types';\n\n/**\n * Groups the elements of an array based on the given key.\n *\n * @example\n * ```ts\n * const data = [{ a: 2 }, { a: 1 }];\n * group(data, 'a') // { '1': [{ a: 2 }], '2': [{ a: 1 }] };\n * ```\n *\n * @param array - The array to group.\n * @param selector - The function to generate the key for each element. It can be a string representing the key or a function that returns the key.\n *\n * @returns an object with keys as the grouped values and values as arrays of elements.\n *\n * @throws {TypeError} If the provided array is not an array.\n */\nexport function group<T, _K extends keyof T, R extends string | number | symbol>(\n array: T[],\n selector: Selector<T>,\n): Record<R, T[]> {\n assert(isArray(array), IS_ARRAY_ERROR_MSG, { args: { array }, type: TypeError });\n\n const result = {} as Record<R, T[]>;\n const getKey = typeof selector === 'function' ? selector : (item: T) => item[selector];\n\n for (const item of array) {\n const rawKey = getKey(item);\n const key = (rawKey === undefined || rawKey === null ? '_' : String(rawKey)) as R;\n\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n }\n\n return result;\n}\n\ngroup.fp = true;\n"],"names":["group","array","selector","assert","isArray","IS_ARRAY_ERROR_MSG","result","getKey","item","rawKey","key"],"mappings":"4JAoBO,SAASA,EACdC,EACAC,EACgB,CAChBC,EAAAA,OAAOC,EAAAA,QAAQH,CAAK,EAAGI,qBAAoB,CAAE,KAAM,CAAE,MAAAJ,CAAA,EAAS,KAAM,UAAW,EAE/E,MAAMK,EAAS,CAAA,EACTC,EAAS,OAAOL,GAAa,WAAaA,EAAYM,GAAYA,EAAKN,CAAQ,EAErF,UAAWM,KAAQP,EAAO,CACxB,MAAMQ,EAASF,EAAOC,CAAI,EACpBE,EAA+BD,GAAW,KAAO,IAAM,OAAOA,CAAM,EAErEH,EAAOI,CAAG,IACbJ,EAAOI,CAAG,EAAI,CAAA,GAEhBJ,EAAOI,CAAG,EAAE,KAAKF,CAAI,CACvB,CAEA,OAAOF,CACT,CAEAN,EAAM,GAAK"}
|
package/dist/array/group.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { assert as
|
|
2
|
-
import { IS_ARRAY_ERROR_MSG as s, isArray as
|
|
3
|
-
function
|
|
4
|
-
|
|
5
|
-
const t = {},
|
|
1
|
+
import { assert as p } from "../function/assert.js";
|
|
2
|
+
import { IS_ARRAY_ERROR_MSG as s, isArray as u } from "../typed/isArray.js";
|
|
3
|
+
function c(r, n) {
|
|
4
|
+
p(u(r), s, { args: { array: r }, type: TypeError });
|
|
5
|
+
const t = {}, i = typeof n == "function" ? n : (o) => o[n];
|
|
6
6
|
for (const o of r) {
|
|
7
|
-
const
|
|
8
|
-
t[
|
|
7
|
+
const e = i(o), f = e == null ? "_" : String(e);
|
|
8
|
+
t[f] || (t[f] = []), t[f].push(o);
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
c.fp = !0;
|
|
13
13
|
export {
|
|
14
|
-
|
|
14
|
+
c as group
|
|
15
15
|
};
|
|
16
16
|
//# sourceMappingURL=group.js.map
|
package/dist/array/group.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sources":["../../src/array/group.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport type { Selector } from '../types';\n\n/**\n * Groups the elements of an array based on the given key.\n *\n * @example\n * ```ts\n * const data = [{ a: 2 }, { a: 1 }];\n * group(data, 'a') // { '1': [{ a: 2 }], '2': [{ a: 1 }] };\n * ```\n *\n * @param array - The array to group.\n * @param selector - The function to generate the key for each element. It can be a string representing the key or a function that returns the key.\n *\n * @returns an object with keys as the grouped values and values as arrays of elements.\n *\n * @throws {TypeError} If the provided array is not an array.\n */\nexport function group<T,
|
|
1
|
+
{"version":3,"file":"group.js","sources":["../../src/array/group.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport type { Selector } from '../types';\n\n/**\n * Groups the elements of an array based on the given key.\n *\n * @example\n * ```ts\n * const data = [{ a: 2 }, { a: 1 }];\n * group(data, 'a') // { '1': [{ a: 2 }], '2': [{ a: 1 }] };\n * ```\n *\n * @param array - The array to group.\n * @param selector - The function to generate the key for each element. It can be a string representing the key or a function that returns the key.\n *\n * @returns an object with keys as the grouped values and values as arrays of elements.\n *\n * @throws {TypeError} If the provided array is not an array.\n */\nexport function group<T, _K extends keyof T, R extends string | number | symbol>(\n array: T[],\n selector: Selector<T>,\n): Record<R, T[]> {\n assert(isArray(array), IS_ARRAY_ERROR_MSG, { args: { array }, type: TypeError });\n\n const result = {} as Record<R, T[]>;\n const getKey = typeof selector === 'function' ? selector : (item: T) => item[selector];\n\n for (const item of array) {\n const rawKey = getKey(item);\n const key = (rawKey === undefined || rawKey === null ? '_' : String(rawKey)) as R;\n\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n }\n\n return result;\n}\n\ngroup.fp = true;\n"],"names":["group","array","selector","assert","isArray","IS_ARRAY_ERROR_MSG","result","getKey","item","rawKey","key"],"mappings":";;AAoBO,SAASA,EACdC,GACAC,GACgB;AAChB,EAAAC,EAAOC,EAAQH,CAAK,GAAGI,GAAoB,EAAE,MAAM,EAAE,OAAAJ,EAAA,GAAS,MAAM,WAAW;AAE/E,QAAMK,IAAS,CAAA,GACTC,IAAS,OAAOL,KAAa,aAAaA,IAAW,CAACM,MAAYA,EAAKN,CAAQ;AAErF,aAAWM,KAAQP,GAAO;AACxB,UAAMQ,IAASF,EAAOC,CAAI,GACpBE,IAA+BD,KAAW,OAAO,MAAM,OAAOA,CAAM;AAE1E,IAAKH,EAAOI,CAAG,MACbJ,EAAOI,CAAG,IAAI,CAAA,IAEhBJ,EAAOI,CAAG,EAAE,KAAKF,CAAI;AAAA,EACvB;AAEA,SAAOF;AACT;AAEAN,EAAM,KAAK;"}
|
package/dist/array/list.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../function/debounce.cjs"),d=require("./chunk.cjs"),x=require("./search.cjs"),T=10,b=.5,y=1;function f(s,i,
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../function/debounce.cjs"),d=require("./chunk.cjs"),x=require("./search.cjs"),T=10,b=.5,y=1;function f(s,i,r){const a=r?[...s].sort(r):[...s];return d.chunk(a,i)}function m(s,i,r=""){return(r?x.search(s,r,b):s).filter(i)}function D(s,i={}){let{limit:r=T,filterFn:a=()=>!0,sortFn:o}=i,c=[...s],t=0,h="",l=m(c,a),n=f(l,r,o);const u=()=>{l=m(c,a,h),n=f(l,r,o);const e=Math.max(0,n.length-1);return t=Math.max(0,Math.min(t,e)),n[t]??[]};return{get current(){return n[t]??[]},set data(e){c=[...e],t=0,u()},filter(e){return a=e,t=0,u()},set limit(e){r=Math.max(y,e),u()},get meta(){return{end:Math.min(r*(t+1),l.length),isEmpty:l.length===0,isFirst:t===0,isLast:t===n.length-1,limit:r,page:t+1,pages:Math.ceil(l.length/r),start:Math.max(0,r*t+1),total:l.length}},next(){t<n.length-1&&t++},set page(e){const g=e-1,M=g<0?n.length+g:g;t=Math.max(0,Math.min(M,n.length-1))},get pages(){return n},prev(){t>0&&t--},reset(){return t=0,h="",a=i.filterFn??(()=>!0),u()},search:p.debounce(e=>(h=e,u())),sort(e){return o=e,u()},*[Symbol.iterator](){for(const e of n)yield e}}}exports.list=D;
|
|
2
2
|
//# sourceMappingURL=list.cjs.map
|
package/dist/array/list.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.cjs","sources":["../../src/array/list.ts"],"sourcesContent":["import { debounce } from '../function/debounce';\nimport type { Predicate } from '../types';\nimport { chunk } from './chunk';\nimport { search } from './search';\n\ntype Config<T> = {\n filterFn?: Predicate<T>;\n limit?: number;\n sortFn?: (a: T, b: T) => number;\n};\n\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_SEARCH_TONE = 0.5;\nconst MIN_LIMIT = 1;\n\nfunction getPages<T>(data: T[], size: number, sortFn: Config<T>['sortFn']): T[][] {\n const sortedData = sortFn ? [...data].sort(sortFn) : [...data];\n return chunk<T>(sortedData, size) as T[][];\n}\n\nfunction getData<T>(data: T[], currentFilterFn: Predicate<T>, query = ''): T[] {\n const searchResults = query ? search(data, query, DEFAULT_SEARCH_TONE) : data;\n return searchResults.filter(currentFilterFn) as T[];\n}\n\nexport function list<T>(initialData: T[], config: Config<T> = {}) {\n let { limit = DEFAULT_LIMIT, filterFn = () => true, sortFn } = config;\n let rawData = [...initialData];\n let offset = 0;\n let query = '';\n let data = getData(rawData, filterFn);\n let pages = getPages(data, limit, sortFn);\n\n const update = () => {\n data = getData(rawData, filterFn, query);\n pages = getPages(data, limit, sortFn);\n offset = Math.max(0,
|
|
1
|
+
{"version":3,"file":"list.cjs","sources":["../../src/array/list.ts"],"sourcesContent":["import { debounce } from '../function/debounce';\nimport type { Predicate } from '../types';\nimport { chunk } from './chunk';\nimport { search } from './search';\n\ntype Config<T> = {\n filterFn?: Predicate<T>;\n limit?: number;\n sortFn?: (a: T, b: T) => number;\n};\n\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_SEARCH_TONE = 0.5;\nconst MIN_LIMIT = 1;\n\nfunction getPages<T>(data: T[], size: number, sortFn: Config<T>['sortFn']): T[][] {\n const sortedData = sortFn ? [...data].sort(sortFn) : [...data];\n return chunk<T>(sortedData, size) as T[][];\n}\n\nfunction getData<T>(data: T[], currentFilterFn: Predicate<T>, query = ''): T[] {\n const searchResults = query ? search(data, query, DEFAULT_SEARCH_TONE) : data;\n return searchResults.filter(currentFilterFn) as T[];\n}\n\nexport function list<T>(initialData: T[], config: Config<T> = {}) {\n let { limit = DEFAULT_LIMIT, filterFn = () => true, sortFn } = config;\n let rawData = [...initialData];\n let offset = 0;\n let query = '';\n let data = getData(rawData, filterFn);\n let pages = getPages(data, limit, sortFn);\n\n const update = () => {\n data = getData(rawData, filterFn, query);\n pages = getPages(data, limit, sortFn);\n // Ensure offset is valid for the new page count\n // If pages is empty, offset should be 0. Max index is pages.length - 1\n const maxOffset = Math.max(0, pages.length - 1);\n offset = Math.max(0, Math.min(offset, maxOffset));\n return pages[offset] ?? [];\n };\n\n return {\n get current() {\n return pages[offset] ?? [];\n },\n set data(newData: T[]) {\n rawData = [...newData];\n offset = 0;\n update();\n },\n filter(predicate: (item: T) => boolean) {\n filterFn = predicate;\n offset = 0;\n return update();\n },\n set limit(newLimit: number) {\n limit = Math.max(MIN_LIMIT, newLimit);\n update();\n },\n get meta() {\n return {\n end: Math.min(limit * (offset + 1), data.length),\n isEmpty: data.length === 0,\n isFirst: offset === 0,\n isLast: offset === pages.length - 1,\n limit: limit,\n page: offset + 1,\n pages: Math.ceil(data.length / limit),\n start: Math.max(0, limit * offset + 1),\n total: data.length,\n };\n },\n next() {\n if (offset < pages.length - 1) {\n offset++;\n }\n },\n set page(page: number) {\n const index = page - 1;\n const value = index < 0 ? pages.length + index : index;\n offset = Math.max(0, Math.min(value, pages.length - 1));\n },\n get pages() {\n return pages;\n },\n prev() {\n if (offset > 0) {\n offset--;\n }\n },\n reset() {\n offset = 0;\n query = '';\n filterFn = config.filterFn ?? (() => true);\n return update();\n },\n search: debounce((str: string) => {\n query = str;\n return update();\n }),\n sort(fn?: (a: T, b: T) => number) {\n sortFn = fn;\n return update();\n },\n *[Symbol.iterator]() {\n for (const page of pages) {\n yield page;\n }\n },\n };\n}\n"],"names":["DEFAULT_LIMIT","DEFAULT_SEARCH_TONE","MIN_LIMIT","getPages","data","size","sortFn","sortedData","chunk","getData","currentFilterFn","query","search","list","initialData","config","limit","filterFn","rawData","offset","pages","update","maxOffset","newData","predicate","newLimit","page","index","value","debounce","str","fn"],"mappings":"+KAWMA,EAAgB,GAChBC,EAAsB,GACtBC,EAAY,EAElB,SAASC,EAAYC,EAAWC,EAAcC,EAAoC,CAChF,MAAMC,EAAaD,EAAS,CAAC,GAAGF,CAAI,EAAE,KAAKE,CAAM,EAAI,CAAC,GAAGF,CAAI,EAC7D,OAAOI,EAAAA,MAASD,EAAYF,CAAI,CAClC,CAEA,SAASI,EAAWL,EAAWM,EAA+BC,EAAQ,GAAS,CAE7E,OADsBA,EAAQC,EAAAA,OAAOR,EAAMO,EAAOV,CAAmB,EAAIG,GACpD,OAAOM,CAAe,CAC7C,CAEO,SAASG,EAAQC,EAAkBC,EAAoB,GAAI,CAChE,GAAI,CAAE,MAAAC,EAAQhB,EAAe,SAAAiB,EAAW,IAAM,GAAM,OAAAX,GAAWS,EAC3DG,EAAU,CAAC,GAAGJ,CAAW,EACzBK,EAAS,EACTR,EAAQ,GACRP,EAAOK,EAAQS,EAASD,CAAQ,EAChCG,EAAQjB,EAASC,EAAMY,EAAOV,CAAM,EAExC,MAAMe,EAAS,IAAM,CACnBjB,EAAOK,EAAQS,EAASD,EAAUN,CAAK,EACvCS,EAAQjB,EAASC,EAAMY,EAAOV,CAAM,EAGpC,MAAMgB,EAAY,KAAK,IAAI,EAAGF,EAAM,OAAS,CAAC,EAC9C,OAAAD,EAAS,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAQG,CAAS,CAAC,EACzCF,EAAMD,CAAM,GAAK,CAAA,CAC1B,EAEA,MAAO,CACL,IAAI,SAAU,CACZ,OAAOC,EAAMD,CAAM,GAAK,CAAA,CAC1B,EACA,IAAI,KAAKI,EAAc,CACrBL,EAAU,CAAC,GAAGK,CAAO,EACrBJ,EAAS,EACTE,EAAA,CACF,EACA,OAAOG,EAAiC,CACtC,OAAAP,EAAWO,EACXL,EAAS,EACFE,EAAA,CACT,EACA,IAAI,MAAMI,EAAkB,CAC1BT,EAAQ,KAAK,IAAId,EAAWuB,CAAQ,EACpCJ,EAAA,CACF,EACA,IAAI,MAAO,CACT,MAAO,CACL,IAAK,KAAK,IAAIL,GAASG,EAAS,GAAIf,EAAK,MAAM,EAC/C,QAASA,EAAK,SAAW,EACzB,QAASe,IAAW,EACpB,OAAQA,IAAWC,EAAM,OAAS,EAClC,MAAAJ,EACA,KAAMG,EAAS,EACf,MAAO,KAAK,KAAKf,EAAK,OAASY,CAAK,EACpC,MAAO,KAAK,IAAI,EAAGA,EAAQG,EAAS,CAAC,EACrC,MAAOf,EAAK,MAAA,CAEhB,EACA,MAAO,CACDe,EAASC,EAAM,OAAS,GAC1BD,GAEJ,EACA,IAAI,KAAKO,EAAc,CACrB,MAAMC,EAAQD,EAAO,EACfE,EAAQD,EAAQ,EAAIP,EAAM,OAASO,EAAQA,EACjDR,EAAS,KAAK,IAAI,EAAG,KAAK,IAAIS,EAAOR,EAAM,OAAS,CAAC,CAAC,CACxD,EACA,IAAI,OAAQ,CACV,OAAOA,CACT,EACA,MAAO,CACDD,EAAS,GACXA,GAEJ,EACA,OAAQ,CACN,OAAAA,EAAS,EACTR,EAAQ,GACRM,EAAWF,EAAO,WAAa,IAAM,IAC9BM,EAAA,CACT,EACA,OAAQQ,EAAAA,SAAUC,IAChBnB,EAAQmB,EACDT,EAAA,EACR,EACD,KAAKU,EAA6B,CAChC,OAAAzB,EAASyB,EACFV,EAAA,CACT,EACA,EAAE,OAAO,QAAQ,GAAI,CACnB,UAAWK,KAAQN,EACjB,MAAMM,CAEV,CAAA,CAEJ"}
|
package/dist/array/list.js
CHANGED
|
@@ -2,47 +2,51 @@ import { debounce as M } from "../function/debounce.js";
|
|
|
2
2
|
import { chunk as x } from "./chunk.js";
|
|
3
3
|
import { search as d } from "./search.js";
|
|
4
4
|
const D = 10, E = 0.5, F = 1;
|
|
5
|
-
function m(a, o,
|
|
6
|
-
const s =
|
|
5
|
+
function m(a, o, r) {
|
|
6
|
+
const s = r ? [...a].sort(r) : [...a];
|
|
7
7
|
return x(s, o);
|
|
8
8
|
}
|
|
9
|
-
function f(a, o,
|
|
10
|
-
return (
|
|
9
|
+
function f(a, o, r = "") {
|
|
10
|
+
return (r ? d(a, r, E) : a).filter(o);
|
|
11
11
|
}
|
|
12
12
|
function _(a, o = {}) {
|
|
13
|
-
let { limit:
|
|
14
|
-
const i = () =>
|
|
13
|
+
let { limit: r = D, filterFn: s = () => !0, sortFn: h } = o, u = [...a], t = 0, c = "", l = f(u, s), n = m(l, r, h);
|
|
14
|
+
const i = () => {
|
|
15
|
+
l = f(u, s, c), n = m(l, r, h);
|
|
16
|
+
const e = Math.max(0, n.length - 1);
|
|
17
|
+
return t = Math.max(0, Math.min(t, e)), n[t] ?? [];
|
|
18
|
+
};
|
|
15
19
|
return {
|
|
16
20
|
get current() {
|
|
17
21
|
return n[t] ?? [];
|
|
18
22
|
},
|
|
19
|
-
set data(
|
|
20
|
-
|
|
23
|
+
set data(e) {
|
|
24
|
+
u = [...e], t = 0, i();
|
|
21
25
|
},
|
|
22
|
-
filter(
|
|
23
|
-
return s =
|
|
26
|
+
filter(e) {
|
|
27
|
+
return s = e, t = 0, i();
|
|
24
28
|
},
|
|
25
|
-
set limit(
|
|
26
|
-
|
|
29
|
+
set limit(e) {
|
|
30
|
+
r = Math.max(F, e), i();
|
|
27
31
|
},
|
|
28
32
|
get meta() {
|
|
29
33
|
return {
|
|
30
|
-
end: Math.min(
|
|
34
|
+
end: Math.min(r * (t + 1), l.length),
|
|
31
35
|
isEmpty: l.length === 0,
|
|
32
36
|
isFirst: t === 0,
|
|
33
37
|
isLast: t === n.length - 1,
|
|
34
|
-
limit:
|
|
38
|
+
limit: r,
|
|
35
39
|
page: t + 1,
|
|
36
|
-
pages: Math.ceil(l.length /
|
|
37
|
-
start: Math.max(0,
|
|
40
|
+
pages: Math.ceil(l.length / r),
|
|
41
|
+
start: Math.max(0, r * t + 1),
|
|
38
42
|
total: l.length
|
|
39
43
|
};
|
|
40
44
|
},
|
|
41
45
|
next() {
|
|
42
46
|
t < n.length - 1 && t++;
|
|
43
47
|
},
|
|
44
|
-
set page(
|
|
45
|
-
const
|
|
48
|
+
set page(e) {
|
|
49
|
+
const g = e - 1, p = g < 0 ? n.length + g : g;
|
|
46
50
|
t = Math.max(0, Math.min(p, n.length - 1));
|
|
47
51
|
},
|
|
48
52
|
get pages() {
|
|
@@ -52,15 +56,15 @@ function _(a, o = {}) {
|
|
|
52
56
|
t > 0 && t--;
|
|
53
57
|
},
|
|
54
58
|
reset() {
|
|
55
|
-
return t = 0,
|
|
59
|
+
return t = 0, c = "", s = o.filterFn ?? (() => !0), i();
|
|
56
60
|
},
|
|
57
|
-
search: M((
|
|
58
|
-
sort(
|
|
59
|
-
return
|
|
61
|
+
search: M((e) => (c = e, i())),
|
|
62
|
+
sort(e) {
|
|
63
|
+
return h = e, i();
|
|
60
64
|
},
|
|
61
65
|
*[Symbol.iterator]() {
|
|
62
|
-
for (const
|
|
63
|
-
yield
|
|
66
|
+
for (const e of n)
|
|
67
|
+
yield e;
|
|
64
68
|
}
|
|
65
69
|
};
|
|
66
70
|
}
|
package/dist/array/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sources":["../../src/array/list.ts"],"sourcesContent":["import { debounce } from '../function/debounce';\nimport type { Predicate } from '../types';\nimport { chunk } from './chunk';\nimport { search } from './search';\n\ntype Config<T> = {\n filterFn?: Predicate<T>;\n limit?: number;\n sortFn?: (a: T, b: T) => number;\n};\n\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_SEARCH_TONE = 0.5;\nconst MIN_LIMIT = 1;\n\nfunction getPages<T>(data: T[], size: number, sortFn: Config<T>['sortFn']): T[][] {\n const sortedData = sortFn ? [...data].sort(sortFn) : [...data];\n return chunk<T>(sortedData, size) as T[][];\n}\n\nfunction getData<T>(data: T[], currentFilterFn: Predicate<T>, query = ''): T[] {\n const searchResults = query ? search(data, query, DEFAULT_SEARCH_TONE) : data;\n return searchResults.filter(currentFilterFn) as T[];\n}\n\nexport function list<T>(initialData: T[], config: Config<T> = {}) {\n let { limit = DEFAULT_LIMIT, filterFn = () => true, sortFn } = config;\n let rawData = [...initialData];\n let offset = 0;\n let query = '';\n let data = getData(rawData, filterFn);\n let pages = getPages(data, limit, sortFn);\n\n const update = () => {\n data = getData(rawData, filterFn, query);\n pages = getPages(data, limit, sortFn);\n offset = Math.max(0,
|
|
1
|
+
{"version":3,"file":"list.js","sources":["../../src/array/list.ts"],"sourcesContent":["import { debounce } from '../function/debounce';\nimport type { Predicate } from '../types';\nimport { chunk } from './chunk';\nimport { search } from './search';\n\ntype Config<T> = {\n filterFn?: Predicate<T>;\n limit?: number;\n sortFn?: (a: T, b: T) => number;\n};\n\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_SEARCH_TONE = 0.5;\nconst MIN_LIMIT = 1;\n\nfunction getPages<T>(data: T[], size: number, sortFn: Config<T>['sortFn']): T[][] {\n const sortedData = sortFn ? [...data].sort(sortFn) : [...data];\n return chunk<T>(sortedData, size) as T[][];\n}\n\nfunction getData<T>(data: T[], currentFilterFn: Predicate<T>, query = ''): T[] {\n const searchResults = query ? search(data, query, DEFAULT_SEARCH_TONE) : data;\n return searchResults.filter(currentFilterFn) as T[];\n}\n\nexport function list<T>(initialData: T[], config: Config<T> = {}) {\n let { limit = DEFAULT_LIMIT, filterFn = () => true, sortFn } = config;\n let rawData = [...initialData];\n let offset = 0;\n let query = '';\n let data = getData(rawData, filterFn);\n let pages = getPages(data, limit, sortFn);\n\n const update = () => {\n data = getData(rawData, filterFn, query);\n pages = getPages(data, limit, sortFn);\n // Ensure offset is valid for the new page count\n // If pages is empty, offset should be 0. Max index is pages.length - 1\n const maxOffset = Math.max(0, pages.length - 1);\n offset = Math.max(0, Math.min(offset, maxOffset));\n return pages[offset] ?? [];\n };\n\n return {\n get current() {\n return pages[offset] ?? [];\n },\n set data(newData: T[]) {\n rawData = [...newData];\n offset = 0;\n update();\n },\n filter(predicate: (item: T) => boolean) {\n filterFn = predicate;\n offset = 0;\n return update();\n },\n set limit(newLimit: number) {\n limit = Math.max(MIN_LIMIT, newLimit);\n update();\n },\n get meta() {\n return {\n end: Math.min(limit * (offset + 1), data.length),\n isEmpty: data.length === 0,\n isFirst: offset === 0,\n isLast: offset === pages.length - 1,\n limit: limit,\n page: offset + 1,\n pages: Math.ceil(data.length / limit),\n start: Math.max(0, limit * offset + 1),\n total: data.length,\n };\n },\n next() {\n if (offset < pages.length - 1) {\n offset++;\n }\n },\n set page(page: number) {\n const index = page - 1;\n const value = index < 0 ? pages.length + index : index;\n offset = Math.max(0, Math.min(value, pages.length - 1));\n },\n get pages() {\n return pages;\n },\n prev() {\n if (offset > 0) {\n offset--;\n }\n },\n reset() {\n offset = 0;\n query = '';\n filterFn = config.filterFn ?? (() => true);\n return update();\n },\n search: debounce((str: string) => {\n query = str;\n return update();\n }),\n sort(fn?: (a: T, b: T) => number) {\n sortFn = fn;\n return update();\n },\n *[Symbol.iterator]() {\n for (const page of pages) {\n yield page;\n }\n },\n };\n}\n"],"names":["DEFAULT_LIMIT","DEFAULT_SEARCH_TONE","MIN_LIMIT","getPages","data","size","sortFn","sortedData","chunk","getData","currentFilterFn","query","search","list","initialData","config","limit","filterFn","rawData","offset","pages","update","maxOffset","newData","predicate","newLimit","page","index","value","debounce","str","fn"],"mappings":";;;AAWA,MAAMA,IAAgB,IAChBC,IAAsB,KACtBC,IAAY;AAElB,SAASC,EAAYC,GAAWC,GAAcC,GAAoC;AAChF,QAAMC,IAAaD,IAAS,CAAC,GAAGF,CAAI,EAAE,KAAKE,CAAM,IAAI,CAAC,GAAGF,CAAI;AAC7D,SAAOI,EAASD,GAAYF,CAAI;AAClC;AAEA,SAASI,EAAWL,GAAWM,GAA+BC,IAAQ,IAAS;AAE7E,UADsBA,IAAQC,EAAOR,GAAMO,GAAOV,CAAmB,IAAIG,GACpD,OAAOM,CAAe;AAC7C;AAEO,SAASG,EAAQC,GAAkBC,IAAoB,IAAI;AAChE,MAAI,EAAE,OAAAC,IAAQhB,GAAe,UAAAiB,IAAW,MAAM,IAAM,QAAAX,MAAWS,GAC3DG,IAAU,CAAC,GAAGJ,CAAW,GACzBK,IAAS,GACTR,IAAQ,IACRP,IAAOK,EAAQS,GAASD,CAAQ,GAChCG,IAAQjB,EAASC,GAAMY,GAAOV,CAAM;AAExC,QAAMe,IAAS,MAAM;AACnB,IAAAjB,IAAOK,EAAQS,GAASD,GAAUN,CAAK,GACvCS,IAAQjB,EAASC,GAAMY,GAAOV,CAAM;AAGpC,UAAMgB,IAAY,KAAK,IAAI,GAAGF,EAAM,SAAS,CAAC;AAC9C,WAAAD,IAAS,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAQG,CAAS,CAAC,GACzCF,EAAMD,CAAM,KAAK,CAAA;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,IAAI,UAAU;AACZ,aAAOC,EAAMD,CAAM,KAAK,CAAA;AAAA,IAC1B;AAAA,IACA,IAAI,KAAKI,GAAc;AACrB,MAAAL,IAAU,CAAC,GAAGK,CAAO,GACrBJ,IAAS,GACTE,EAAA;AAAA,IACF;AAAA,IACA,OAAOG,GAAiC;AACtC,aAAAP,IAAWO,GACXL,IAAS,GACFE,EAAA;AAAA,IACT;AAAA,IACA,IAAI,MAAMI,GAAkB;AAC1B,MAAAT,IAAQ,KAAK,IAAId,GAAWuB,CAAQ,GACpCJ,EAAA;AAAA,IACF;AAAA,IACA,IAAI,OAAO;AACT,aAAO;AAAA,QACL,KAAK,KAAK,IAAIL,KAASG,IAAS,IAAIf,EAAK,MAAM;AAAA,QAC/C,SAASA,EAAK,WAAW;AAAA,QACzB,SAASe,MAAW;AAAA,QACpB,QAAQA,MAAWC,EAAM,SAAS;AAAA,QAClC,OAAAJ;AAAA,QACA,MAAMG,IAAS;AAAA,QACf,OAAO,KAAK,KAAKf,EAAK,SAASY,CAAK;AAAA,QACpC,OAAO,KAAK,IAAI,GAAGA,IAAQG,IAAS,CAAC;AAAA,QACrC,OAAOf,EAAK;AAAA,MAAA;AAAA,IAEhB;AAAA,IACA,OAAO;AACL,MAAIe,IAASC,EAAM,SAAS,KAC1BD;AAAA,IAEJ;AAAA,IACA,IAAI,KAAKO,GAAc;AACrB,YAAMC,IAAQD,IAAO,GACfE,IAAQD,IAAQ,IAAIP,EAAM,SAASO,IAAQA;AACjD,MAAAR,IAAS,KAAK,IAAI,GAAG,KAAK,IAAIS,GAAOR,EAAM,SAAS,CAAC,CAAC;AAAA,IACxD;AAAA,IACA,IAAI,QAAQ;AACV,aAAOA;AAAA,IACT;AAAA,IACA,OAAO;AACL,MAAID,IAAS,KACXA;AAAA,IAEJ;AAAA,IACA,QAAQ;AACN,aAAAA,IAAS,GACTR,IAAQ,IACRM,IAAWF,EAAO,aAAa,MAAM,KAC9BM,EAAA;AAAA,IACT;AAAA,IACA,QAAQQ,EAAS,CAACC,OAChBnB,IAAQmB,GACDT,EAAA,EACR;AAAA,IACD,KAAKU,GAA6B;AAChC,aAAAzB,IAASyB,GACFV,EAAA;AAAA,IACT;AAAA,IACA,EAAE,OAAO,QAAQ,IAAI;AACnB,iBAAWK,KAAQN;AACjB,cAAMM;AAAA,IAEV;AAAA,EAAA;AAEJ;"}
|
package/dist/array/pick.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick.cjs","sources":["../../src/array/pick.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\
|
|
1
|
+
{"version":3,"file":"pick.cjs","sources":["../../src/array/pick.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\n\n/**\n * Picks the first element from an array that satisfies a predicate function\n *\n * @example\n * ```ts\n * const arr = [1, 2, 3, 4];\n * pick(arr, x => x * x, x => x > 2) // 9\n * await pick(arr, async x => x * x, x => x > 2) // 9\n * ```\n *\n * @param array - The array to search.\n * @param callback - A function that is called for each element in the array.\n * @param predicate - A function that is called to validate each element in the array.\n *\n * @return The first element that satisfies the predicate, or undefined if no such element is found.\n *\n * @throws {TypeError} If the first argument is not an array.\n */\nexport function pick<T, R = T>(\n array: T[],\n callback: (item: T, index: number, array: T[]) => R,\n predicate?: (item: T, index: number, array: T[]) => boolean,\n): R | undefined {\n assert(isArray(array), IS_ARRAY_ERROR_MSG, { args: { array }, type: TypeError });\n\n const isValid = predicate ?? ((value: T) => !isNil(value));\n\n for (let index = 0; index < array.length; index++) {\n if (isValid(array[index], index, array)) {\n return callback(array[index], index, array);\n }\n }\n\n return undefined;\n}\n\npick.fp = true;\n"],"names":["pick","array","callback","predicate","assert","isArray","IS_ARRAY_ERROR_MSG","isValid","value","isNil","index"],"mappings":"4LAsBO,SAASA,EACdC,EACAC,EACAC,EACe,CACfC,EAAAA,OAAOC,EAAAA,QAAQJ,CAAK,EAAGK,qBAAoB,CAAE,KAAM,CAAE,MAAAL,CAAA,EAAS,KAAM,UAAW,EAE/E,MAAMM,EAAUJ,IAAeK,GAAa,CAACC,EAAAA,MAAMD,CAAK,GAExD,QAASE,EAAQ,EAAGA,EAAQT,EAAM,OAAQS,IACxC,GAAIH,EAAQN,EAAMS,CAAK,EAAGA,EAAOT,CAAK,EACpC,OAAOC,EAASD,EAAMS,CAAK,EAAGA,EAAOT,CAAK,CAKhD,CAEAD,EAAK,GAAK"}
|
package/dist/array/pick.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick.js","sources":["../../src/array/pick.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\
|
|
1
|
+
{"version":3,"file":"pick.js","sources":["../../src/array/pick.ts"],"sourcesContent":["import { assert } from '../function/assert';\nimport { IS_ARRAY_ERROR_MSG, isArray } from '../typed/isArray';\nimport { isNil } from '../typed/isNil';\n\n/**\n * Picks the first element from an array that satisfies a predicate function\n *\n * @example\n * ```ts\n * const arr = [1, 2, 3, 4];\n * pick(arr, x => x * x, x => x > 2) // 9\n * await pick(arr, async x => x * x, x => x > 2) // 9\n * ```\n *\n * @param array - The array to search.\n * @param callback - A function that is called for each element in the array.\n * @param predicate - A function that is called to validate each element in the array.\n *\n * @return The first element that satisfies the predicate, or undefined if no such element is found.\n *\n * @throws {TypeError} If the first argument is not an array.\n */\nexport function pick<T, R = T>(\n array: T[],\n callback: (item: T, index: number, array: T[]) => R,\n predicate?: (item: T, index: number, array: T[]) => boolean,\n): R | undefined {\n assert(isArray(array), IS_ARRAY_ERROR_MSG, { args: { array }, type: TypeError });\n\n const isValid = predicate ?? ((value: T) => !isNil(value));\n\n for (let index = 0; index < array.length; index++) {\n if (isValid(array[index], index, array)) {\n return callback(array[index], index, array);\n }\n }\n\n return undefined;\n}\n\npick.fp = true;\n"],"names":["pick","array","callback","predicate","assert","isArray","IS_ARRAY_ERROR_MSG","isValid","value","isNil","index"],"mappings":";;;AAsBO,SAASA,EACdC,GACAC,GACAC,GACe;AACf,EAAAC,EAAOC,EAAQJ,CAAK,GAAGK,GAAoB,EAAE,MAAM,EAAE,OAAAL,EAAA,GAAS,MAAM,WAAW;AAE/E,QAAMM,IAAUJ,MAAc,CAACK,MAAa,CAACC,EAAMD,CAAK;AAExD,WAASE,IAAQ,GAAGA,IAAQT,EAAM,QAAQS;AACxC,QAAIH,EAAQN,EAAMS,CAAK,GAAGA,GAAOT,CAAK;AACpC,aAAOC,EAASD,EAAMS,CAAK,GAAGA,GAAOT,CAAK;AAKhD;AAEAD,EAAK,KAAK;"}
|
package/dist/date/timeDiff.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let c=["YEAR","MONTH","WEEK","DAY","HOUR","MINUTE","SECOND"];const f=1e3,N=60*f,m=60*N,n=24*m,D=7*n,_=30*n,S=365*n,R=[{ms:S,unit:"YEAR"},{ms:_,unit:"MONTH"},{ms:D,unit:"WEEK"},{ms:n,unit:"DAY"},{ms:m,unit:"HOUR"},{ms:N,unit:"MINUTE"},{ms:f,unit:"SECOND"}];function M(t,e=new Date,l=c){const o=typeof t=="string"?Date.parse(t):t.getTime(),a=typeof e=="string"?Date.parse(e):e.getTime();if(Number.isNaN(o)||Number.isNaN(a))return{unit:"INVALID_DATE",value:0};const i=R.filter(E=>l.includes(E.unit)),s=Math.abs(o-a),r=i[i.length-1]?.unit??"SECOND";if(s<=0)return{unit:r,value:0};const u=i.find(E=>s>=E.ms);return u?{unit:u.unit,value:Math.floor(s/u.ms)}:{unit:r,value:0}}M.defaultUnits=t=>{c=t};exports.timeDiff=M;
|
|
2
2
|
//# sourceMappingURL=timeDiff.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeDiff.cjs","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n
|
|
1
|
+
{"version":3,"file":"timeDiff.cjs","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_DAY","MS_PER_WEEK","MS_PER_MONTH","MS_PER_YEAR","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"gFAIA,IAAIA,EAA2B,CAAC,OAAQ,QAAS,OAAQ,MAAO,OAAQ,SAAU,QAAQ,EAE1F,MAAMC,EAAgB,IAChBC,EAAgB,GAAKD,EACrBE,EAAc,GAAKD,EACnBE,EAAa,GAAKD,EAClBE,EAAc,EAAID,EAClBE,EAAe,GAAKF,EACpBG,EAAc,IAAMH,EAEpBI,EAAa,CACjB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAc,KAAM,OAAA,EAC1B,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAY,KAAM,KAAA,EACxB,CAAE,GAAID,EAAa,KAAM,MAAA,EACzB,CAAE,GAAID,EAAe,KAAM,QAAA,EAC3B,CAAE,GAAID,EAAe,KAAM,QAAA,CAC7B,EAmBO,SAASQ,EACdC,EACAC,MAAuB,KACvBC,EAA2BZ,EACf,CACZ,MAAMa,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAClDI,EAAQ,OAAOH,GAAM,SAAW,KAAK,MAAMA,CAAC,EAAIA,EAAE,QAAA,EAExD,GAAI,OAAO,MAAME,CAAK,GAAK,OAAO,MAAMC,CAAK,EAC3C,MAAO,CAAE,KAAM,eAAgB,MAAO,CAAA,EAGxC,MAAMC,EAAQP,EAAW,OAAQQ,GAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,EAC9DC,EAAO,KAAK,IAAIJ,EAAQC,CAAK,EAC7BI,EAAeH,EAAMA,EAAM,OAAS,CAAC,GAAG,MAAQ,SAEtD,GAAIE,GAAQ,EACV,MAAO,CAAE,KAAMC,EAAc,MAAO,CAAA,EAItC,MAAMC,EAAWJ,EAAM,KAAMC,GAAMC,GAAQD,EAAE,EAAE,EAE/C,OAAIG,EACK,CAAE,KAAMA,EAAS,KAAM,MAAO,KAAK,MAAMF,EAAOE,EAAS,EAAE,CAAA,EAG7D,CAAE,KAAMD,EAAc,MAAO,CAAA,CACtC,CAEAT,EAAS,aAAgBM,GAAsB,CAC7Cf,EAAee,CACjB"}
|
package/dist/date/timeDiff.js
CHANGED
|
@@ -8,22 +8,20 @@ const N = [
|
|
|
8
8
|
{ ms: 6e4, unit: "MINUTE" },
|
|
9
9
|
{ ms: 1e3, unit: "SECOND" }
|
|
10
10
|
];
|
|
11
|
-
function
|
|
12
|
-
const
|
|
13
|
-
if (Number.isNaN(
|
|
11
|
+
function D(t, n = /* @__PURE__ */ new Date(), S = R) {
|
|
12
|
+
const i = typeof t == "string" ? Date.parse(t) : t.getTime(), M = typeof n == "string" ? Date.parse(n) : n.getTime();
|
|
13
|
+
if (Number.isNaN(i) || Number.isNaN(M))
|
|
14
14
|
return { unit: "INVALID_DATE", value: 0 };
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
17
|
-
return { unit:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return { unit: S, value: Math.floor(s / E) };
|
|
21
|
-
return { unit: M, value: 0 };
|
|
15
|
+
const E = N.filter((e) => S.includes(e.unit)), _ = Math.abs(i - M), u = E[E.length - 1]?.unit ?? "SECOND";
|
|
16
|
+
if (_ <= 0)
|
|
17
|
+
return { unit: u, value: 0 };
|
|
18
|
+
const s = E.find((e) => _ >= e.ms);
|
|
19
|
+
return s ? { unit: s.unit, value: Math.floor(_ / s.ms) } : { unit: u, value: 0 };
|
|
22
20
|
}
|
|
23
|
-
|
|
21
|
+
D.defaultUnits = (t) => {
|
|
24
22
|
R = t;
|
|
25
23
|
};
|
|
26
24
|
export {
|
|
27
|
-
|
|
25
|
+
D as timeDiff
|
|
28
26
|
};
|
|
29
27
|
//# sourceMappingURL=timeDiff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeDiff.js","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n
|
|
1
|
+
{"version":3,"file":"timeDiff.js","sources":["../../src/date/timeDiff.ts"],"sourcesContent":["export type TimeUnit = 'YEAR' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'INVALID_DATE';\nexport type TimeDirection = 'FUTURE' | 'PAST';\nexport type TimeResult = { unit: TimeUnit; value: number };\n\nlet defaultUnits: TimeUnit[] = ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];\n\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND;\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE;\nconst MS_PER_DAY = 24 * MS_PER_HOUR;\nconst MS_PER_WEEK = 7 * MS_PER_DAY;\nconst MS_PER_MONTH = 30 * MS_PER_DAY;\nconst MS_PER_YEAR = 365 * MS_PER_DAY;\n\nconst TIME_UNITS = [\n { ms: MS_PER_YEAR, unit: 'YEAR' as const },\n { ms: MS_PER_MONTH, unit: 'MONTH' as const },\n { ms: MS_PER_WEEK, unit: 'WEEK' as const },\n { ms: MS_PER_DAY, unit: 'DAY' as const },\n { ms: MS_PER_HOUR, unit: 'HOUR' as const },\n { ms: MS_PER_MINUTE, unit: 'MINUTE' as const },\n { ms: MS_PER_SECOND, unit: 'SECOND' as const },\n];\n\n/**\n * Calculates the remaining time until a target date.\n *\n * @example\n * ```ts\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 5)); // { value: 5, unit: 'DAY' }\n * timeDiff(new Date(Date.now() - 1000 * 60 * 60 * 24 * 3), 'past'); // { value: 3, unit: 'DAY' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 31)); // { value: 1, unit: 'MONTH' }\n * timeDiff(new Date(Date.now() + 1000 * 60 * 60 * 24 * 365)); // { value: 1, unit: 'YEAR' }\n * ```\n *\n * @param a - The target date (Date object or ISO string).\n * @param b - The target date (Date object or ISO string).\n * @param allowedUnits - (optional) array of units to filter the result. If provided, only these units will be considered.\n *\n * @returns An object containing the remaining time and its unit ('DAY', 'HOUR', or 'MINUTE').\n */\nexport function timeDiff(\n a: Date | string,\n b: Date | string = new Date(),\n allowedUnits: TimeUnit[] = defaultUnits,\n): TimeResult {\n const aDate = typeof a === 'string' ? Date.parse(a) : a.getTime();\n const bDate = typeof b === 'string' ? Date.parse(b) : b.getTime();\n\n if (Number.isNaN(aDate) || Number.isNaN(bDate)) {\n return { unit: 'INVALID_DATE', value: 0 };\n }\n\n const units = TIME_UNITS.filter((u) => allowedUnits.includes(u.unit));\n const diff = Math.abs(aDate - bDate);\n const smallestUnit = units[units.length - 1]?.unit ?? 'SECOND';\n\n if (diff <= 0) {\n return { unit: smallestUnit, value: 0 };\n }\n\n // Find the largest unit that fits\n const bestUnit = units.find((u) => diff >= u.ms);\n\n if (bestUnit) {\n return { unit: bestUnit.unit, value: Math.floor(diff / bestUnit.ms) };\n }\n\n return { unit: smallestUnit, value: 0 };\n}\n\ntimeDiff.defaultUnits = (units: TimeUnit[]) => {\n defaultUnits = units;\n};\n"],"names":["defaultUnits","TIME_UNITS","timeDiff","a","b","allowedUnits","aDate","bDate","units","u","diff","smallestUnit","bestUnit"],"mappings":"AAIA,IAAIA,IAA2B,CAAC,QAAQ,SAAS,QAAQ,OAAO,QAAQ,UAAU,QAAQ;AAU1F,MAAMC,IAAa;AAAA,EACjB,EAAE,IAAI,SAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,QAAc,MAAM,QAAA;AAAA,EAC1B,EAAE,IAAI,QAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,OAAY,MAAM,MAAA;AAAA,EACxB,EAAE,IAAI,MAAa,MAAM,OAAA;AAAA,EACzB,EAAE,IAAI,KAAe,MAAM,SAAA;AAAA,EAC3B,EAAE,IAAI,KAAe,MAAM,SAAA;AAC7B;AAmBO,SAASC,EACdC,GACAC,wBAAuB,KAAA,GACvBC,IAA2BL,GACf;AACZ,QAAMM,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA,GAClDI,IAAQ,OAAOH,KAAM,WAAW,KAAK,MAAMA,CAAC,IAAIA,EAAE,QAAA;AAExD,MAAI,OAAO,MAAME,CAAK,KAAK,OAAO,MAAMC,CAAK;AAC3C,WAAO,EAAE,MAAM,gBAAgB,OAAO,EAAA;AAGxC,QAAMC,IAAQP,EAAW,OAAO,CAACQ,MAAMJ,EAAa,SAASI,EAAE,IAAI,CAAC,GAC9DC,IAAO,KAAK,IAAIJ,IAAQC,CAAK,GAC7BI,IAAeH,EAAMA,EAAM,SAAS,CAAC,GAAG,QAAQ;AAEtD,MAAIE,KAAQ;AACV,WAAO,EAAE,MAAMC,GAAc,OAAO,EAAA;AAItC,QAAMC,IAAWJ,EAAM,KAAK,CAACC,MAAMC,KAAQD,EAAE,EAAE;AAE/C,SAAIG,IACK,EAAE,MAAMA,EAAS,MAAM,OAAO,KAAK,MAAMF,IAAOE,EAAS,EAAE,EAAA,IAG7D,EAAE,MAAMD,GAAc,OAAO,EAAA;AACtC;AAEAT,EAAS,eAAe,CAACM,MAAsB;AAC7C,EAAAR,IAAeQ;AACjB;"}
|
package/dist/function/curry.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function c(e,u=e.length){const t=(...r)=>r.length>=u?e(...r):(...n)=>t(...r,...n);return t}exports.curry=c;
|
|
2
2
|
//# sourceMappingURL=curry.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curry.cjs","sources":["../../src/function/curry.ts"],"sourcesContent":["/**\n * Curries a function, allowing it to be called with partial arguments.\n *\n * @example\n * ```ts\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n * curriedAdd(1)(2) // 3;\n * ```\n *\n * @param fn - The function to curry.\n *\n * @returns A curried version of the function.\n */\n\n//
|
|
1
|
+
{"version":3,"file":"curry.cjs","sources":["../../src/function/curry.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\n/**\n * Curries a function, allowing it to be called with partial arguments.\n *\n * @example\n * ```ts\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n * curriedAdd(1)(2) // 3;\n * ```\n *\n * @param fn - The function to curry.\n * @param arity - The number of arguments the function expects. Defaults to the function's length.\n *\n * @returns A curried version of the function.\n */\n\n// Take first N items from tuple T\ntype Take<N extends number, T extends readonly unknown[], Acc extends readonly unknown[] = []> = Acc['length'] extends N\n ? Acc\n : T extends readonly [infer H, ...infer R]\n ? Take<N, R, readonly [...Acc, H]>\n : Acc;\n// Curried: at each step, accept a non-empty tuple of args A,\n// ensure it's a prefix of P, then either return R (if done) or recurse.\nexport type Curried<P extends readonly unknown[], R> = P extends readonly []\n ? () => R\n : <A extends readonly [unknown, ...(readonly unknown[])]>(\n ...args: A\n ) => P extends readonly [...A, ...infer Rest] ? (Rest extends readonly [] ? R : Curried<Rest, R>) : never;\n// Overloads to reflect default arity vs. a custom arity.\nexport function curry<T extends (...args: any[]) => any>(fn: T): Curried<Parameters<T>, ReturnType<T>>;\nexport function curry<T extends (...args: any[]) => any, N extends number>(\n fn: T,\n arity: N,\n): Curried<Take<N, Parameters<T>>, ReturnType<T>>;\n// Runtime implementation\nexport function curry(fn: (...args: any[]) => any, arity = fn.length) {\n const curried = (...args: any[]): any => {\n if (args.length >= arity) {\n return fn(...args);\n }\n return (...rest: any[]) => curried(...args, ...rest);\n };\n return curried as any;\n}\n"],"names":["curry","fn","arity","curried","args","rest"],"mappings":"gFAsCO,SAASA,EAAMC,EAA6BC,EAAQD,EAAG,OAAQ,CACpE,MAAME,EAAU,IAAIC,IACdA,EAAK,QAAUF,EACVD,EAAG,GAAGG,CAAI,EAEZ,IAAIC,IAAgBF,EAAQ,GAAGC,EAAM,GAAGC,CAAI,EAErD,OAAOF,CACT"}
|
package/dist/function/curry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curry.js","sources":["../../src/function/curry.ts"],"sourcesContent":["/**\n * Curries a function, allowing it to be called with partial arguments.\n *\n * @example\n * ```ts\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n * curriedAdd(1)(2) // 3;\n * ```\n *\n * @param fn - The function to curry.\n *\n * @returns A curried version of the function.\n */\n\n//
|
|
1
|
+
{"version":3,"file":"curry.js","sources":["../../src/function/curry.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\n/**\n * Curries a function, allowing it to be called with partial arguments.\n *\n * @example\n * ```ts\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n * curriedAdd(1)(2) // 3;\n * ```\n *\n * @param fn - The function to curry.\n * @param arity - The number of arguments the function expects. Defaults to the function's length.\n *\n * @returns A curried version of the function.\n */\n\n// Take first N items from tuple T\ntype Take<N extends number, T extends readonly unknown[], Acc extends readonly unknown[] = []> = Acc['length'] extends N\n ? Acc\n : T extends readonly [infer H, ...infer R]\n ? Take<N, R, readonly [...Acc, H]>\n : Acc;\n// Curried: at each step, accept a non-empty tuple of args A,\n// ensure it's a prefix of P, then either return R (if done) or recurse.\nexport type Curried<P extends readonly unknown[], R> = P extends readonly []\n ? () => R\n : <A extends readonly [unknown, ...(readonly unknown[])]>(\n ...args: A\n ) => P extends readonly [...A, ...infer Rest] ? (Rest extends readonly [] ? R : Curried<Rest, R>) : never;\n// Overloads to reflect default arity vs. a custom arity.\nexport function curry<T extends (...args: any[]) => any>(fn: T): Curried<Parameters<T>, ReturnType<T>>;\nexport function curry<T extends (...args: any[]) => any, N extends number>(\n fn: T,\n arity: N,\n): Curried<Take<N, Parameters<T>>, ReturnType<T>>;\n// Runtime implementation\nexport function curry(fn: (...args: any[]) => any, arity = fn.length) {\n const curried = (...args: any[]): any => {\n if (args.length >= arity) {\n return fn(...args);\n }\n return (...rest: any[]) => curried(...args, ...rest);\n };\n return curried as any;\n}\n"],"names":["curry","fn","arity","curried","args","rest"],"mappings":"AAsCO,SAASA,EAAMC,GAA6BC,IAAQD,EAAG,QAAQ;AACpE,QAAME,IAAU,IAAIC,MACdA,EAAK,UAAUF,IACVD,EAAG,GAAGG,CAAI,IAEZ,IAAIC,MAAgBF,EAAQ,GAAGC,GAAM,GAAGC,CAAI;AAErD,SAAOF;AACT;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./assert.cjs");function v(s,o=300){l.assert(typeof s=="function","First argument must be a function",{args:{fn:s},type:TypeError}),l.assert(typeof o=="number"&&o>=0,"Delay must be a non-negative number",{args:{delay:o},type:TypeError});let e,t,r,c;const i=()=>{e!==void 0&&(clearTimeout(e),e=void 0)},a=()=>{if(i(),!t)return;const u=t,d=r;return t=void 0,r=void 0,c=s.apply(d,u),c},n=function(...u){t=u,r=this,i(),e=setTimeout(a,o)};return n.cancel=()=>{i(),t=void 0,r=void 0},n.flush=()=>a(),n.pending=()=>e!==void 0,n}exports.debounce=v;
|
|
2
2
|
//# sourceMappingURL=debounce.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.cjs","sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"debounce.cjs","sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { assert } from './assert';\n\nexport type Debounced<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounce a function (trailing). Use `flush` to invoke immediately,\n * `cancel` to clear, and `pending` to check if an invocation is scheduled.\n */\nexport function debounce<T extends Fn>(fn: T, delay = 300): Debounced<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const invoke = () => {\n clearTimer();\n if (!lastArgs) return undefined; // nothing to invoke\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n lastArgs = undefined;\n lastThis = undefined;\n // biome-ignore lint/suspicious/noExplicitAny: -\n lastResult = fn.apply(ctx as any, args);\n return lastResult;\n };\n\n const debounced = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n lastArgs = args;\n lastThis = this;\n clearTimer();\n timer = setTimeout(invoke, delay);\n } as Debounced<T>;\n\n debounced.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n };\n\n debounced.flush = () => invoke() as ReturnType<T> | undefined;\n\n debounced.pending = () => timer !== undefined;\n\n return debounced;\n}\n"],"names":["debounce","fn","delay","assert","timer","lastArgs","lastThis","lastResult","clearTimer","invoke","args","ctx","debounced"],"mappings":"gHAaO,SAASA,EAAuBC,EAAOC,EAAQ,IAAmB,CACvEC,EAAAA,OAAO,OAAOF,GAAO,WAAY,oCAAqC,CACpE,KAAM,CAAE,GAAAA,CAAA,EACR,KAAM,SAAA,CACP,EACDE,EAAAA,OAAO,OAAOD,GAAU,UAAYA,GAAS,EAAG,sCAAuC,CACrF,KAAM,CAAE,MAAAA,CAAA,EACR,KAAM,SAAA,CACP,EAED,IAAIE,EACAC,EACAC,EACAC,EAEJ,MAAMC,EAAa,IAAM,CACnBJ,IAAU,SACZ,aAAaA,CAAK,EAClBA,EAAQ,OAEZ,EAEMK,EAAS,IAAM,CAEnB,GADAD,EAAA,EACI,CAACH,EAAU,OACf,MAAMK,EAAOL,EACPM,EAAML,EACZ,OAAAD,EAAW,OACXC,EAAW,OAEXC,EAAaN,EAAG,MAAMU,EAAYD,CAAI,EAC/BH,CACT,EAEMK,EAAY,YAAyCF,EAAqB,CAC9EL,EAAWK,EACXJ,EAAW,KACXE,EAAA,EACAJ,EAAQ,WAAWK,EAAQP,CAAK,CAClC,EAEA,OAAAU,EAAU,OAAS,IAAM,CACvBJ,EAAA,EACAH,EAAW,OACXC,EAAW,MACb,EAEAM,EAAU,MAAQ,IAAMH,EAAA,EAExBG,EAAU,QAAU,IAAMR,IAAU,OAE7BQ,CACT"}
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { assert as l } from "./assert.js";
|
|
2
|
+
function v(i, o = 300) {
|
|
3
|
+
l(typeof i == "function", "First argument must be a function", {
|
|
4
|
+
args: { fn: i },
|
|
5
|
+
type: TypeError
|
|
6
|
+
}), l(typeof o == "number" && o >= 0, "Delay must be a non-negative number", {
|
|
7
|
+
args: { delay: o },
|
|
8
|
+
type: TypeError
|
|
9
|
+
});
|
|
10
|
+
let t, e, r, c;
|
|
11
|
+
const s = () => {
|
|
12
|
+
t !== void 0 && (clearTimeout(t), t = void 0);
|
|
13
|
+
}, a = () => {
|
|
14
|
+
if (s(), !e) return;
|
|
15
|
+
const u = e, m = r;
|
|
16
|
+
return e = void 0, r = void 0, c = i.apply(m, u), c;
|
|
17
|
+
}, n = function(...u) {
|
|
18
|
+
e = u, r = this, s(), t = setTimeout(a, o);
|
|
5
19
|
};
|
|
20
|
+
return n.cancel = () => {
|
|
21
|
+
s(), e = void 0, r = void 0;
|
|
22
|
+
}, n.flush = () => a(), n.pending = () => t !== void 0, n;
|
|
6
23
|
}
|
|
7
24
|
export {
|
|
8
|
-
|
|
25
|
+
v as debounce
|
|
9
26
|
};
|
|
10
27
|
//# sourceMappingURL=debounce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debounce.js","sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"debounce.js","sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { assert } from './assert';\n\nexport type Debounced<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounce a function (trailing). Use `flush` to invoke immediately,\n * `cancel` to clear, and `pending` to check if an invocation is scheduled.\n */\nexport function debounce<T extends Fn>(fn: T, delay = 300): Debounced<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const invoke = () => {\n clearTimer();\n if (!lastArgs) return undefined; // nothing to invoke\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n lastArgs = undefined;\n lastThis = undefined;\n // biome-ignore lint/suspicious/noExplicitAny: -\n lastResult = fn.apply(ctx as any, args);\n return lastResult;\n };\n\n const debounced = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n lastArgs = args;\n lastThis = this;\n clearTimer();\n timer = setTimeout(invoke, delay);\n } as Debounced<T>;\n\n debounced.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n };\n\n debounced.flush = () => invoke() as ReturnType<T> | undefined;\n\n debounced.pending = () => timer !== undefined;\n\n return debounced;\n}\n"],"names":["debounce","fn","delay","assert","timer","lastArgs","lastThis","lastResult","clearTimer","invoke","args","ctx","debounced"],"mappings":";AAaO,SAASA,EAAuBC,GAAOC,IAAQ,KAAmB;AACvE,EAAAC,EAAO,OAAOF,KAAO,YAAY,qCAAqC;AAAA,IACpE,MAAM,EAAE,IAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP,GACDE,EAAO,OAAOD,KAAU,YAAYA,KAAS,GAAG,uCAAuC;AAAA,IACrF,MAAM,EAAE,OAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAED,MAAIE,GACAC,GACAC,GACAC;AAEJ,QAAMC,IAAa,MAAM;AACvB,IAAIJ,MAAU,WACZ,aAAaA,CAAK,GAClBA,IAAQ;AAAA,EAEZ,GAEMK,IAAS,MAAM;AAEnB,QADAD,EAAA,GACI,CAACH,EAAU;AACf,UAAMK,IAAOL,GACPM,IAAML;AACZ,WAAAD,IAAW,QACXC,IAAW,QAEXC,IAAaN,EAAG,MAAMU,GAAYD,CAAI,GAC/BH;AAAA,EACT,GAEMK,IAAY,YAAyCF,GAAqB;AAC9E,IAAAL,IAAWK,GACXJ,IAAW,MACXE,EAAA,GACAJ,IAAQ,WAAWK,GAAQP,CAAK;AAAA,EAClC;AAEA,SAAAU,EAAU,SAAS,MAAM;AACvB,IAAAJ,EAAA,GACAH,IAAW,QACXC,IAAW;AAAA,EACb,GAEAM,EAAU,QAAQ,MAAMH,EAAA,GAExBG,EAAU,UAAU,MAAMR,MAAU,QAE7BQ;AACT;"}
|
package/dist/function/memo.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function f
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function m(f,{ttl:o,maxSize:i,resolver:c}={}){const n=new Map,s=t=>{if(c)return c(...t);if(t.length===0)return"__empty__";if(t.length===1){const e=t[0],r=typeof e;if(r==="string"||r==="number"||r==="boolean")return`${r}:${e}`;if(e===null)return"null";if(e===void 0)return"undefined"}return JSON.stringify(t)};return(...t)=>{const e=s(t),r=Date.now(),u=n.get(e);if(u&&(!o||r-u.timestamp<o))return n.delete(e),n.set(e,u),u.value;const l=f(...t);return n.set(e,{timestamp:r,value:l}),i&&n.size>i&&n.delete(n.keys().next().value),l}}exports.memo=m;
|
|
2
2
|
//# sourceMappingURL=memo.cjs.map
|