@nemigo/helpers 2.9.0 → 3.0.0-alpha

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.
@@ -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
- state?: IState<boolean>;
47
+ /**
48
+ * Общее состояние (и выполнение функции и задержка)
49
+ */
50
+ state?: (v: boolean, step: "start" | "delay" | "running" | "reset") => void;
48
51
  /**
49
52
  * @default "urgent"
50
53
  */
@@ -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?.set(false);
77
+ state?.(false, "reset");
78
78
  };
79
79
  return (...args) => {
80
80
  _args = args;
81
81
  if (_promise)
82
82
  return _promise;
83
- state?.set(true);
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
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nemigo/helpers",
3
- "version": "2.9.0",
3
+ "version": "3.0.0-alpha",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
6
  "author": {
@@ -200,9 +200,6 @@
200
200
  "default": "./dist/zipper.js"
201
201
  }
202
202
  },
203
- "dependencies": {
204
- "@std/msgpack": "npm:@jsr/std__msgpack"
205
- },
206
203
  "devDependencies": {
207
204
  "@nemigo/configs": "2.7.1"
208
205
  }