@nemigo/helpers 2.9.0 → 2.10.0
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/async/index.d.ts +4 -1
- package/dist/async/index.js +6 -3
- package/dist/index.d.ts +4 -0
- package/dist/index.js +35 -0
- package/package.json +1 -1
package/dist/async/index.d.ts
CHANGED
|
@@ -44,7 +44,10 @@ export declare const useStateGuard: <F extends AnyFunc>(func: F, state: IState<b
|
|
|
44
44
|
*/
|
|
45
45
|
export type ThrottleMode = "urgent" | "delay";
|
|
46
46
|
export interface ThrottleOptions {
|
|
47
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Общее состояние (и выполнение функции и задержка)
|
|
49
|
+
*/
|
|
50
|
+
state?: (v: boolean, step: "start" | "delay" | "running" | "reset") => void;
|
|
48
51
|
/**
|
|
49
52
|
* @default "urgent"
|
|
50
53
|
*/
|
package/dist/async/index.js
CHANGED
|
@@ -74,25 +74,28 @@ export const throttle = (func, { mode = "urgent", ms = 250, state }) => {
|
|
|
74
74
|
const call = async () => await func(..._args);
|
|
75
75
|
const reset = () => {
|
|
76
76
|
_promise = null;
|
|
77
|
-
state?.
|
|
77
|
+
state?.(false, "reset");
|
|
78
78
|
};
|
|
79
79
|
return (...args) => {
|
|
80
80
|
_args = args;
|
|
81
81
|
if (_promise)
|
|
82
82
|
return _promise;
|
|
83
|
-
state?.
|
|
83
|
+
state?.(true, "start");
|
|
84
84
|
const { resolve, reject, promise } = createManualPromise();
|
|
85
85
|
_promise = promise;
|
|
86
86
|
if (mode === "delay") {
|
|
87
|
+
state?.(true, "delay");
|
|
87
88
|
setTimeout(() => {
|
|
89
|
+
state?.(true, "running");
|
|
88
90
|
call().then(resolve).catch(reject).finally(reset);
|
|
89
91
|
}, ms);
|
|
90
92
|
}
|
|
91
93
|
else {
|
|
94
|
+
state?.(true, "running");
|
|
92
95
|
call()
|
|
93
96
|
.then(resolve)
|
|
94
97
|
.catch(reject)
|
|
95
|
-
.finally(() => void delay(ms).then(reset));
|
|
98
|
+
.finally(() => (state?.(true, "delay"), void delay(ms).then(reset)));
|
|
96
99
|
}
|
|
97
100
|
return _promise;
|
|
98
101
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export declare const pad: (v: number, l?: number) => string;
|
|
|
14
14
|
* Если значение не `object` - возвращается как есть
|
|
15
15
|
*/
|
|
16
16
|
export declare const parsify: <T>(v: T) => T;
|
|
17
|
+
/**
|
|
18
|
+
* С осознанным игнором undefined и для простых типов
|
|
19
|
+
*/
|
|
20
|
+
export declare const isDataEqual: (a: any, b: any) => boolean;
|
|
17
21
|
/**
|
|
18
22
|
* Агрегация функций в одну
|
|
19
23
|
*/
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,41 @@ export const parsify = (v) => {
|
|
|
17
17
|
return v;
|
|
18
18
|
return JSON.parse(JSON.stringify(v));
|
|
19
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* С осознанным игнором undefined и для простых типов
|
|
22
|
+
*/
|
|
23
|
+
export const isDataEqual = (a, b) => {
|
|
24
|
+
// oxlint-disable-next-line unicorn/no-abusive-eslint-disable (тут лучше так)
|
|
25
|
+
// oxlint-disable-next-line eslint/eqeqeq eslint/no-eq-null (тут лучше так)
|
|
26
|
+
// eslint-disable-next-line no-eq-null,eqeqeq
|
|
27
|
+
if (a == null || b == null || typeof a !== "object" || typeof b !== "object")
|
|
28
|
+
return false;
|
|
29
|
+
const keysA = Object.keys(a);
|
|
30
|
+
const keysB = Object.keys(b);
|
|
31
|
+
let lenA = 0, lenB = 0;
|
|
32
|
+
// Один проход: считаем defined ключи и сразу проверяем наличие в другом объекте
|
|
33
|
+
for (const k of keysA) {
|
|
34
|
+
if (a[k] !== undefined) {
|
|
35
|
+
lenA++;
|
|
36
|
+
if (!(k in b) || b[k] === undefined)
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
for (const k of keysB) {
|
|
41
|
+
if (b[k] !== undefined) {
|
|
42
|
+
lenB++;
|
|
43
|
+
if (!(k in a) || a[k] === undefined)
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (lenA !== lenB)
|
|
48
|
+
return false;
|
|
49
|
+
// Рекурсия только по подтверждённо существующим defined ключам
|
|
50
|
+
for (const k of keysA)
|
|
51
|
+
if (a[k] !== undefined && !isDataEqual(a[k], b[k]))
|
|
52
|
+
return false;
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
20
55
|
/**
|
|
21
56
|
* Агрегация функций в одну
|
|
22
57
|
*/
|