@develia/commons 0.4.16 → 0.4.19

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.
Files changed (287) hide show
  1. package/dist/cjs/array.js +22 -2
  2. package/dist/cjs/array.js.map +1 -1
  3. package/dist/cjs/async-pool-executor.js +26 -11
  4. package/dist/cjs/async-pool-executor.js.map +1 -1
  5. package/dist/cjs/browser/form-utilities.js +35 -34
  6. package/dist/cjs/browser/form-utilities.js.map +1 -1
  7. package/dist/cjs/browser/geo-location.js +1 -1
  8. package/dist/cjs/browser/geo-location.js.map +1 -1
  9. package/dist/cjs/browser/index.js +0 -0
  10. package/dist/cjs/browser/index.js.map +0 -0
  11. package/dist/cjs/browser/native-bridge.js +3 -1
  12. package/dist/cjs/browser/native-bridge.js.map +1 -1
  13. package/dist/cjs/cancellable-promise.js +34 -13
  14. package/dist/cjs/cancellable-promise.js.map +1 -1
  15. package/dist/cjs/clean-url-search-params.js +26 -3
  16. package/dist/cjs/clean-url-search-params.js.map +1 -1
  17. package/dist/cjs/collections/cache-dictionary.js +3 -3
  18. package/dist/cjs/collections/cache-dictionary.js.map +1 -1
  19. package/dist/cjs/collections/default-map.js +0 -0
  20. package/dist/cjs/collections/default-map.js.map +1 -1
  21. package/dist/cjs/collections/default-weak-map.js +0 -0
  22. package/dist/cjs/collections/default-weak-map.js.map +1 -1
  23. package/dist/cjs/collections/from.js +3 -3
  24. package/dist/cjs/collections/from.js.map +1 -1
  25. package/dist/cjs/collections/index.js +0 -0
  26. package/dist/cjs/collections/index.js.map +1 -1
  27. package/dist/cjs/draft.js +46 -11
  28. package/dist/cjs/draft.js.map +1 -1
  29. package/dist/cjs/event-bus.js +1 -1
  30. package/dist/cjs/event-bus.js.map +1 -1
  31. package/dist/cjs/functions.js +348 -0
  32. package/dist/cjs/functions.js.map +1 -0
  33. package/dist/cjs/index.js +1 -0
  34. package/dist/cjs/index.js.map +1 -1
  35. package/dist/cjs/key-value-pair.js +0 -0
  36. package/dist/cjs/key-value-pair.js.map +1 -1
  37. package/dist/cjs/lazy.js +0 -0
  38. package/dist/cjs/lazy.js.map +1 -1
  39. package/dist/cjs/math.js +3 -0
  40. package/dist/cjs/math.js.map +1 -1
  41. package/dist/cjs/order.js +0 -0
  42. package/dist/cjs/order.js.map +1 -1
  43. package/dist/cjs/parse.js +10 -1
  44. package/dist/cjs/parse.js.map +1 -1
  45. package/dist/cjs/patch.js +0 -0
  46. package/dist/cjs/patch.js.map +1 -1
  47. package/dist/cjs/range.js +0 -0
  48. package/dist/cjs/range.js.map +0 -0
  49. package/dist/cjs/stopwatch.js +0 -0
  50. package/dist/cjs/stopwatch.js.map +1 -1
  51. package/dist/cjs/string.js +8 -5
  52. package/dist/cjs/string.js.map +1 -1
  53. package/dist/cjs/timer.js +1 -1
  54. package/dist/cjs/timer.js.map +1 -1
  55. package/dist/cjs/timespan.js +21 -8
  56. package/dist/cjs/timespan.js.map +1 -1
  57. package/dist/cjs/type-code.js +0 -0
  58. package/dist/cjs/type-code.js.map +1 -1
  59. package/dist/cjs/type.js +20 -19
  60. package/dist/cjs/type.js.map +1 -1
  61. package/dist/cjs/types.js +0 -0
  62. package/dist/cjs/types.js.map +1 -1
  63. package/dist/cjs/utilities.js +175 -39
  64. package/dist/cjs/utilities.js.map +1 -1
  65. package/dist/esm/array.js +21 -2
  66. package/dist/esm/array.js.map +1 -1
  67. package/dist/esm/async-pool-executor.js +26 -11
  68. package/dist/esm/async-pool-executor.js.map +1 -1
  69. package/dist/esm/browser/form-utilities.js +35 -34
  70. package/dist/esm/browser/form-utilities.js.map +1 -1
  71. package/dist/esm/browser/geo-location.js +1 -1
  72. package/dist/esm/browser/geo-location.js.map +1 -1
  73. package/dist/esm/browser/index.js +0 -0
  74. package/dist/esm/browser/index.js.map +0 -0
  75. package/dist/esm/browser/native-bridge.js +3 -1
  76. package/dist/esm/browser/native-bridge.js.map +1 -1
  77. package/dist/esm/cancellable-promise.js +34 -13
  78. package/dist/esm/cancellable-promise.js.map +1 -1
  79. package/dist/esm/clean-url-search-params.js +26 -3
  80. package/dist/esm/clean-url-search-params.js.map +1 -1
  81. package/dist/esm/collections/cache-dictionary.js +3 -3
  82. package/dist/esm/collections/cache-dictionary.js.map +1 -1
  83. package/dist/esm/collections/default-map.js +0 -0
  84. package/dist/esm/collections/default-map.js.map +1 -1
  85. package/dist/esm/collections/default-weak-map.js +0 -0
  86. package/dist/esm/collections/default-weak-map.js.map +1 -1
  87. package/dist/esm/collections/from.js +3 -3
  88. package/dist/esm/collections/from.js.map +1 -1
  89. package/dist/esm/collections/index.js +0 -0
  90. package/dist/esm/collections/index.js.map +1 -1
  91. package/dist/esm/draft.js +46 -11
  92. package/dist/esm/draft.js.map +1 -1
  93. package/dist/esm/event-bus.js +1 -1
  94. package/dist/esm/event-bus.js.map +1 -1
  95. package/dist/esm/functions.js +336 -0
  96. package/dist/esm/functions.js.map +1 -0
  97. package/dist/esm/index.js +1 -0
  98. package/dist/esm/index.js.map +1 -1
  99. package/dist/esm/key-value-pair.js +0 -0
  100. package/dist/esm/key-value-pair.js.map +1 -1
  101. package/dist/esm/lazy.js +0 -0
  102. package/dist/esm/lazy.js.map +1 -1
  103. package/dist/esm/math.js +3 -0
  104. package/dist/esm/math.js.map +1 -1
  105. package/dist/esm/order.js +0 -0
  106. package/dist/esm/order.js.map +1 -1
  107. package/dist/esm/parse.js +10 -1
  108. package/dist/esm/parse.js.map +1 -1
  109. package/dist/esm/patch.js +0 -0
  110. package/dist/esm/patch.js.map +1 -1
  111. package/dist/esm/range.js +0 -0
  112. package/dist/esm/range.js.map +0 -0
  113. package/dist/esm/stopwatch.js +0 -0
  114. package/dist/esm/stopwatch.js.map +1 -1
  115. package/dist/esm/string.js +8 -5
  116. package/dist/esm/string.js.map +1 -1
  117. package/dist/esm/timer.js +1 -1
  118. package/dist/esm/timer.js.map +1 -1
  119. package/dist/esm/timespan.js +21 -8
  120. package/dist/esm/timespan.js.map +1 -1
  121. package/dist/esm/type-code.js +0 -0
  122. package/dist/esm/type-code.js.map +1 -1
  123. package/dist/esm/type.js +20 -19
  124. package/dist/esm/type.js.map +1 -1
  125. package/dist/esm/types.js +0 -0
  126. package/dist/esm/types.js.map +1 -1
  127. package/dist/esm/utilities.js +174 -39
  128. package/dist/esm/utilities.js.map +1 -1
  129. package/dist/types/array.d.ts +20 -0
  130. package/dist/types/array.d.ts.map +1 -1
  131. package/dist/types/async-pool-executor.d.ts +2 -2
  132. package/dist/types/async-pool-executor.d.ts.map +1 -1
  133. package/dist/types/browser/form-utilities.d.ts +0 -0
  134. package/dist/types/browser/form-utilities.d.ts.map +1 -1
  135. package/dist/types/browser/geo-location.d.ts +0 -0
  136. package/dist/types/browser/geo-location.d.ts.map +0 -0
  137. package/dist/types/browser/index.d.ts +0 -0
  138. package/dist/types/browser/index.d.ts.map +0 -0
  139. package/dist/types/browser/native-bridge.d.ts +0 -0
  140. package/dist/types/browser/native-bridge.d.ts.map +1 -1
  141. package/dist/types/cancellable-promise.d.ts +0 -0
  142. package/dist/types/cancellable-promise.d.ts.map +1 -1
  143. package/dist/types/clean-url-search-params.d.ts +3 -1
  144. package/dist/types/clean-url-search-params.d.ts.map +1 -1
  145. package/dist/types/collections/cache-dictionary.d.ts +0 -0
  146. package/dist/types/collections/cache-dictionary.d.ts.map +0 -0
  147. package/dist/types/collections/default-map.d.ts +0 -0
  148. package/dist/types/collections/default-map.d.ts.map +0 -0
  149. package/dist/types/collections/default-weak-map.d.ts +0 -0
  150. package/dist/types/collections/default-weak-map.d.ts.map +0 -0
  151. package/dist/types/collections/from.d.ts +1 -1
  152. package/dist/types/collections/from.d.ts.map +0 -0
  153. package/dist/types/collections/index.d.ts +0 -0
  154. package/dist/types/collections/index.d.ts.map +0 -0
  155. package/dist/types/draft.d.ts +0 -0
  156. package/dist/types/draft.d.ts.map +1 -1
  157. package/dist/types/event-bus.d.ts +0 -0
  158. package/dist/types/event-bus.d.ts.map +0 -0
  159. package/dist/types/functions.d.ts +231 -0
  160. package/dist/types/functions.d.ts.map +1 -0
  161. package/dist/types/index.d.ts +1 -0
  162. package/dist/types/index.d.ts.map +1 -1
  163. package/dist/types/key-value-pair.d.ts +0 -0
  164. package/dist/types/key-value-pair.d.ts.map +0 -0
  165. package/dist/types/lazy.d.ts +0 -0
  166. package/dist/types/lazy.d.ts.map +0 -0
  167. package/dist/types/math.d.ts +0 -0
  168. package/dist/types/math.d.ts.map +1 -1
  169. package/dist/types/order.d.ts +0 -0
  170. package/dist/types/order.d.ts.map +0 -0
  171. package/dist/types/parse.d.ts +0 -0
  172. package/dist/types/parse.d.ts.map +1 -1
  173. package/dist/types/patch.d.ts +0 -0
  174. package/dist/types/patch.d.ts.map +0 -0
  175. package/dist/types/range.d.ts +0 -0
  176. package/dist/types/range.d.ts.map +0 -0
  177. package/dist/types/stopwatch.d.ts +0 -0
  178. package/dist/types/stopwatch.d.ts.map +0 -0
  179. package/dist/types/string.d.ts +0 -0
  180. package/dist/types/string.d.ts.map +1 -1
  181. package/dist/types/timer.d.ts +1 -1
  182. package/dist/types/timer.d.ts.map +0 -0
  183. package/dist/types/timespan.d.ts +0 -0
  184. package/dist/types/timespan.d.ts.map +1 -1
  185. package/dist/types/type-code.d.ts +0 -0
  186. package/dist/types/type-code.d.ts.map +0 -0
  187. package/dist/types/type.d.ts +2 -0
  188. package/dist/types/type.d.ts.map +1 -1
  189. package/dist/types/types.d.ts +1 -1
  190. package/dist/types/types.d.ts.map +1 -1
  191. package/dist/types/utilities.d.ts +21 -3
  192. package/dist/types/utilities.d.ts.map +1 -1
  193. package/dist/web/array.js +21 -2
  194. package/dist/web/array.js.map +1 -1
  195. package/dist/web/async-pool-executor.js +26 -11
  196. package/dist/web/async-pool-executor.js.map +1 -1
  197. package/dist/web/browser/form-utilities.js +35 -34
  198. package/dist/web/browser/form-utilities.js.map +1 -1
  199. package/dist/web/browser/geo-location.js +1 -1
  200. package/dist/web/browser/geo-location.js.map +1 -1
  201. package/dist/web/browser/index.js +0 -0
  202. package/dist/web/browser/index.js.map +0 -0
  203. package/dist/web/browser/native-bridge.js +3 -1
  204. package/dist/web/browser/native-bridge.js.map +1 -1
  205. package/dist/web/cancellable-promise.js +34 -13
  206. package/dist/web/cancellable-promise.js.map +1 -1
  207. package/dist/web/clean-url-search-params.js +26 -3
  208. package/dist/web/clean-url-search-params.js.map +1 -1
  209. package/dist/web/collections/cache-dictionary.js +3 -3
  210. package/dist/web/collections/cache-dictionary.js.map +1 -1
  211. package/dist/web/collections/default-map.js +0 -0
  212. package/dist/web/collections/default-map.js.map +1 -1
  213. package/dist/web/collections/default-weak-map.js +0 -0
  214. package/dist/web/collections/default-weak-map.js.map +1 -1
  215. package/dist/web/collections/from.js +3 -3
  216. package/dist/web/collections/from.js.map +1 -1
  217. package/dist/web/collections/index.js +0 -0
  218. package/dist/web/collections/index.js.map +1 -1
  219. package/dist/web/draft.js +46 -11
  220. package/dist/web/draft.js.map +1 -1
  221. package/dist/web/event-bus.js +1 -1
  222. package/dist/web/event-bus.js.map +1 -1
  223. package/dist/web/functions.js +336 -0
  224. package/dist/web/functions.js.map +1 -0
  225. package/dist/web/index.js +1 -0
  226. package/dist/web/index.js.map +1 -1
  227. package/dist/web/key-value-pair.js +0 -0
  228. package/dist/web/key-value-pair.js.map +1 -1
  229. package/dist/web/lazy.js +0 -0
  230. package/dist/web/lazy.js.map +1 -1
  231. package/dist/web/math.js +3 -0
  232. package/dist/web/math.js.map +1 -1
  233. package/dist/web/order.js +0 -0
  234. package/dist/web/order.js.map +1 -1
  235. package/dist/web/parse.js +10 -1
  236. package/dist/web/parse.js.map +1 -1
  237. package/dist/web/patch.js +0 -0
  238. package/dist/web/patch.js.map +1 -1
  239. package/dist/web/range.js +0 -0
  240. package/dist/web/range.js.map +0 -0
  241. package/dist/web/stopwatch.js +0 -0
  242. package/dist/web/stopwatch.js.map +1 -1
  243. package/dist/web/string.js +8 -5
  244. package/dist/web/string.js.map +1 -1
  245. package/dist/web/timer.js +1 -1
  246. package/dist/web/timer.js.map +1 -1
  247. package/dist/web/timespan.js +21 -8
  248. package/dist/web/timespan.js.map +1 -1
  249. package/dist/web/type-code.js +0 -0
  250. package/dist/web/type-code.js.map +1 -1
  251. package/dist/web/type.js +20 -19
  252. package/dist/web/type.js.map +1 -1
  253. package/dist/web/types.js +0 -0
  254. package/dist/web/types.js.map +1 -1
  255. package/dist/web/utilities.js +174 -39
  256. package/dist/web/utilities.js.map +1 -1
  257. package/package.json +84 -60
  258. package/src/array.ts +116 -84
  259. package/src/async-pool-executor.ts +107 -85
  260. package/src/browser/form-utilities.ts +32 -31
  261. package/src/browser/geo-location.ts +113 -113
  262. package/src/browser/native-bridge.ts +118 -116
  263. package/src/cancellable-promise.ts +102 -76
  264. package/src/clean-url-search-params.ts +36 -11
  265. package/src/collections/cache-dictionary.ts +115 -115
  266. package/src/collections/default-map.ts +48 -48
  267. package/src/collections/default-weak-map.ts +51 -51
  268. package/src/collections/from.ts +859 -859
  269. package/src/collections/index.ts +3 -3
  270. package/src/draft.ts +55 -16
  271. package/src/event-bus.ts +83 -83
  272. package/src/functions.ts +496 -0
  273. package/src/index.ts +1 -0
  274. package/src/key-value-pair.ts +24 -24
  275. package/src/lazy.ts +32 -32
  276. package/src/math.ts +33 -30
  277. package/src/order.ts +5 -5
  278. package/src/parse.ts +251 -240
  279. package/src/patch.ts +79 -79
  280. package/src/stopwatch.ts +43 -43
  281. package/src/string.ts +8 -5
  282. package/src/timer.ts +67 -67
  283. package/src/timespan.ts +412 -398
  284. package/src/type-code.ts +15 -15
  285. package/src/type.ts +372 -371
  286. package/src/types.ts +34 -30
  287. package/src/utilities.ts +653 -480
@@ -1,4 +1,4 @@
1
- export {default as DefaultWeakMap} from './default-weak-map.js';
2
- export {default as DefaultMap} from './default-map.js';
3
- export {default as CacheDictionary} from './cache-dictionary.js';
1
+ export {default as DefaultWeakMap} from './default-weak-map.js';
2
+ export {default as DefaultMap} from './default-map.js';
3
+ export {default as CacheDictionary} from './cache-dictionary.js';
4
4
  export {default as from} from './from.js';
package/src/draft.ts CHANGED
@@ -69,6 +69,53 @@ type ParentLink = {
69
69
  keyInParent: PropertyKey;
70
70
  };
71
71
 
72
+ const DRAFT_MATERIALIZE = Symbol("draft.materialize");
73
+
74
+ type InternalDraft = Draft<any> & {
75
+ [DRAFT_MATERIALIZE]: () => any;
76
+ };
77
+
78
+ function isDraftValue(value: any): value is InternalDraft {
79
+ return value !== null &&
80
+ typeof value === "object" &&
81
+ typeof value[DRAFT_MATERIALIZE] === "function";
82
+ }
83
+
84
+ function materializeDraftValue(value: any): any {
85
+ if (isDraftValue(value)) return value[DRAFT_MATERIALIZE]();
86
+ if (value === null || typeof value !== "object") return value;
87
+
88
+ const objectValue = value as any;
89
+ if (objectValue instanceof Date) return new Date(objectValue);
90
+ if (objectValue instanceof RegExp) return new RegExp(objectValue);
91
+
92
+ if (objectValue instanceof Map) {
93
+ const copy = new Map();
94
+ for (const [k, v] of objectValue) {
95
+ copy.set(materializeDraftValue(k), materializeDraftValue(v));
96
+ }
97
+ return copy;
98
+ }
99
+
100
+ if (objectValue instanceof Set) {
101
+ const copy = new Set();
102
+ for (const v of objectValue) {
103
+ copy.add(materializeDraftValue(v));
104
+ }
105
+ return copy;
106
+ }
107
+
108
+ const copy: any = Array.isArray(objectValue)
109
+ ? []
110
+ : Object.create(Object.getPrototypeOf(objectValue));
111
+
112
+ for (const key of Reflect.ownKeys(objectValue)) {
113
+ copy[key] = materializeDraftValue(objectValue[key]);
114
+ }
115
+
116
+ return copy;
117
+ }
118
+
72
119
  // ─────────────────────────────────────────────
73
120
  // deepDraft (internal)
74
121
  // ─────────────────────────────────────────────
@@ -143,12 +190,9 @@ export default function draft<T extends object>(
143
190
  */
144
191
  const applyCommit = (key: PropertyKey): void => {
145
192
  const val = copy[key];
146
- if (
147
- val !== null &&
148
- typeof val === "object" &&
149
- "commit" in val
150
- ) {
151
- (val as Draft<any>).commit();
193
+ if (isDraftValue(val)) {
194
+ val.commit();
195
+ (original as any)[key] = materializeDraftValue(val);
152
196
  return;
153
197
  }
154
198
  if (key in copy) {
@@ -162,17 +206,11 @@ export default function draft<T extends object>(
162
206
  * otherwise restore the value from `original`.
163
207
  */
164
208
  const applyRollback = (key: PropertyKey): void => {
165
- const val = copy[key];
166
- if (
167
- val !== null &&
168
- typeof val === "object" &&
169
- "rollback" in val
170
- ) {
171
- (val as Draft<any>).rollback();
172
- return;
173
- }
174
209
  if (key in original) {
175
- copy[key] = (original as any)[key];
210
+ copy[key] = deepDraft((original as any)[key], {
211
+ parent: methods,
212
+ keyInParent: key,
213
+ });
176
214
  } else {
177
215
  delete copy[key];
178
216
  }
@@ -239,6 +277,7 @@ export default function draft<T extends object>(
239
277
 
240
278
  return new Proxy(copy, {
241
279
  get(target, prop, receiver) {
280
+ if (prop === DRAFT_MATERIALIZE) return () => materializeDraftValue(target);
242
281
  if (isMethodKey(prop)) return (methods as any)[prop];
243
282
  return Reflect.get(target, prop, receiver);
244
283
  },
package/src/event-bus.ts CHANGED
@@ -1,84 +1,84 @@
1
- // event.ts
2
-
3
- export abstract class Event {
4
- readonly timestamp: Date;
5
-
6
- protected constructor() {
7
- this.timestamp = new Date();
8
- }
9
-
10
- toString(): string {
11
- return `${this.constructor.name}(${this.timestamp.toISOString()})`;
12
- }
13
- }
14
-
15
- type EventClass<T extends Event> = new (...args: any[]) => T;
16
- type Handler<T extends Event> = (event: T) => void;
17
-
18
- interface HandlerWrapper {
19
- original: Function;
20
- wrapped: (event: Event) => void;
21
- }
22
-
23
- export class EventBus {
24
- private static _instance: EventBus | null = null;
25
-
26
- static get shared(): EventBus {
27
- return this._instance ??= new EventBus();
28
- }
29
-
30
- private _handlers = new Map<Function, HandlerWrapper[]>();
31
-
32
- on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
33
- if (!this._handlers.has(type)) {
34
- this._handlers.set(type, []);
35
- }
36
- this._handlers.get(type)!.push({
37
- original: handler,
38
- wrapped: (event: Event) => handler(event as T),
39
- });
40
- }
41
-
42
- off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
43
- const handlers = this._handlers.get(type);
44
- if (!handlers) return;
45
-
46
- let index = handlers.findIndex((h) => h.original === handler);
47
- if (index !== -1) {
48
- handlers.splice(index, 1);
49
- }
50
- }
51
-
52
- emit<T extends Event>(event: T): void {
53
- const handlers = this._handlers.get(event.constructor);
54
- if (!handlers) return;
55
-
56
- for (const handler of [...handlers]) {
57
- try {
58
- handler.wrapped(event);
59
- } catch (e) {
60
- console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);
61
- }
62
- }
63
- }
64
-
65
- once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
66
- const wrapper: Handler<T> = (event: T) => {
67
- handler(event);
68
- this.off(type, wrapper);
69
- };
70
- this.on(type, wrapper);
71
- }
72
-
73
- clear<T extends Event>(type: EventClass<T>): void {
74
- this._handlers.delete(type);
75
- }
76
-
77
- clearAll(): void {
78
- this._handlers.clear();
79
- }
80
-
81
- hasListeners<T extends Event>(type: EventClass<T>): boolean {
82
- return (this._handlers.get(type)?.length ?? 0) > 0;
83
- }
1
+ // event.ts
2
+
3
+ export abstract class Event {
4
+ readonly timestamp: Date;
5
+
6
+ protected constructor() {
7
+ this.timestamp = new Date();
8
+ }
9
+
10
+ toString(): string {
11
+ return `${this.constructor.name}(${this.timestamp.toISOString()})`;
12
+ }
13
+ }
14
+
15
+ type EventClass<T extends Event> = new (...args: any[]) => T;
16
+ type Handler<T extends Event> = (event: T) => void;
17
+
18
+ interface HandlerWrapper {
19
+ original: Function;
20
+ wrapped: (event: Event) => void;
21
+ }
22
+
23
+ export class EventBus {
24
+ private static _instance: EventBus | null = null;
25
+
26
+ static get shared(): EventBus {
27
+ return this._instance ??= new EventBus();
28
+ }
29
+
30
+ private _handlers = new Map<Function, HandlerWrapper[]>();
31
+
32
+ on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
33
+ if (!this._handlers.has(type)) {
34
+ this._handlers.set(type, []);
35
+ }
36
+ this._handlers.get(type)!.push({
37
+ original: handler,
38
+ wrapped: (event: Event) => handler(event as T),
39
+ });
40
+ }
41
+
42
+ off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
43
+ const handlers = this._handlers.get(type);
44
+ if (!handlers) return;
45
+
46
+ let index = handlers.findIndex((h) => h.original === handler);
47
+ if (index !== -1) {
48
+ handlers.splice(index, 1);
49
+ }
50
+ }
51
+
52
+ emit<T extends Event>(event: T): void {
53
+ const handlers = this._handlers.get(event.constructor);
54
+ if (!handlers) return;
55
+
56
+ for (const handler of [...handlers]) {
57
+ try {
58
+ handler.wrapped(event);
59
+ } catch (e) {
60
+ console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);
61
+ }
62
+ }
63
+ }
64
+
65
+ once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
66
+ const wrapper: Handler<T> = (event: T) => {
67
+ this.off(type, wrapper);
68
+ handler(event);
69
+ };
70
+ this.on(type, wrapper);
71
+ }
72
+
73
+ clear<T extends Event>(type: EventClass<T>): void {
74
+ this._handlers.delete(type);
75
+ }
76
+
77
+ clearAll(): void {
78
+ this._handlers.clear();
79
+ }
80
+
81
+ hasListeners<T extends Event>(type: EventClass<T>): boolean {
82
+ return (this._handlers.get(type)?.length ?? 0) > 0;
83
+ }
84
84
  }