@simplysm/core-common 13.0.0-beta.1

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 (202) hide show
  1. package/.cache/typecheck-browser.tsbuildinfo +1 -0
  2. package/.cache/typecheck-node.tsbuildinfo +1 -0
  3. package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
  4. package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
  5. package/README.md +887 -0
  6. package/dist/common.types.d.ts +74 -0
  7. package/dist/common.types.d.ts.map +1 -0
  8. package/dist/common.types.js +5 -0
  9. package/dist/common.types.js.map +7 -0
  10. package/dist/env.d.ts +6 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +9 -0
  13. package/dist/env.js.map +7 -0
  14. package/dist/errors/argument-error.d.ts +25 -0
  15. package/dist/errors/argument-error.d.ts.map +1 -0
  16. package/dist/errors/argument-error.js +18 -0
  17. package/dist/errors/argument-error.js.map +7 -0
  18. package/dist/errors/not-implemented-error.d.ts +29 -0
  19. package/dist/errors/not-implemented-error.d.ts.map +1 -0
  20. package/dist/errors/not-implemented-error.js +14 -0
  21. package/dist/errors/not-implemented-error.js.map +7 -0
  22. package/dist/errors/sd-error.d.ts +27 -0
  23. package/dist/errors/sd-error.d.ts.map +1 -0
  24. package/dist/errors/sd-error.js +23 -0
  25. package/dist/errors/sd-error.js.map +7 -0
  26. package/dist/errors/timeout-error.d.ts +31 -0
  27. package/dist/errors/timeout-error.d.ts.map +1 -0
  28. package/dist/errors/timeout-error.js +17 -0
  29. package/dist/errors/timeout-error.js.map +7 -0
  30. package/dist/extensions/arr-ext.d.ts +15 -0
  31. package/dist/extensions/arr-ext.d.ts.map +1 -0
  32. package/dist/extensions/arr-ext.helpers.d.ts +19 -0
  33. package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
  34. package/dist/extensions/arr-ext.helpers.js +35 -0
  35. package/dist/extensions/arr-ext.helpers.js.map +7 -0
  36. package/dist/extensions/arr-ext.js +546 -0
  37. package/dist/extensions/arr-ext.js.map +7 -0
  38. package/dist/extensions/arr-ext.types.d.ts +215 -0
  39. package/dist/extensions/arr-ext.types.d.ts.map +1 -0
  40. package/dist/extensions/arr-ext.types.js +1 -0
  41. package/dist/extensions/arr-ext.types.js.map +7 -0
  42. package/dist/extensions/map-ext.d.ts +57 -0
  43. package/dist/extensions/map-ext.d.ts.map +1 -0
  44. package/dist/extensions/map-ext.js +26 -0
  45. package/dist/extensions/map-ext.js.map +7 -0
  46. package/dist/extensions/set-ext.d.ts +36 -0
  47. package/dist/extensions/set-ext.d.ts.map +1 -0
  48. package/dist/extensions/set-ext.js +29 -0
  49. package/dist/extensions/set-ext.js.map +7 -0
  50. package/dist/features/debounce-queue.d.ts +53 -0
  51. package/dist/features/debounce-queue.d.ts.map +1 -0
  52. package/dist/features/debounce-queue.js +80 -0
  53. package/dist/features/debounce-queue.js.map +7 -0
  54. package/dist/features/event-emitter.d.ts +66 -0
  55. package/dist/features/event-emitter.d.ts.map +1 -0
  56. package/dist/features/event-emitter.js +82 -0
  57. package/dist/features/event-emitter.js.map +7 -0
  58. package/dist/features/serial-queue.d.ts +47 -0
  59. package/dist/features/serial-queue.d.ts.map +1 -0
  60. package/dist/features/serial-queue.js +66 -0
  61. package/dist/features/serial-queue.js.map +7 -0
  62. package/dist/globals.d.ts +12 -0
  63. package/dist/globals.d.ts.map +1 -0
  64. package/dist/globals.js +1 -0
  65. package/dist/globals.js.map +7 -0
  66. package/dist/index.d.ts +32 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +31 -0
  69. package/dist/index.js.map +7 -0
  70. package/dist/types/date-only.d.ts +152 -0
  71. package/dist/types/date-only.d.ts.map +1 -0
  72. package/dist/types/date-only.js +251 -0
  73. package/dist/types/date-only.js.map +7 -0
  74. package/dist/types/date-time.d.ts +96 -0
  75. package/dist/types/date-time.d.ts.map +1 -0
  76. package/dist/types/date-time.js +220 -0
  77. package/dist/types/date-time.js.map +7 -0
  78. package/dist/types/lazy-gc-map.d.ts +80 -0
  79. package/dist/types/lazy-gc-map.d.ts.map +1 -0
  80. package/dist/types/lazy-gc-map.js +179 -0
  81. package/dist/types/lazy-gc-map.js.map +7 -0
  82. package/dist/types/time.d.ts +68 -0
  83. package/dist/types/time.d.ts.map +1 -0
  84. package/dist/types/time.js +151 -0
  85. package/dist/types/time.js.map +7 -0
  86. package/dist/types/uuid.d.ts +35 -0
  87. package/dist/types/uuid.d.ts.map +1 -0
  88. package/dist/types/uuid.js +71 -0
  89. package/dist/types/uuid.js.map +7 -0
  90. package/dist/utils/bytes.d.ts +51 -0
  91. package/dist/utils/bytes.d.ts.map +1 -0
  92. package/dist/utils/bytes.js +89 -0
  93. package/dist/utils/bytes.js.map +7 -0
  94. package/dist/utils/date-format.d.ts +90 -0
  95. package/dist/utils/date-format.d.ts.map +1 -0
  96. package/dist/utils/date-format.js +106 -0
  97. package/dist/utils/date-format.js.map +7 -0
  98. package/dist/utils/json.d.ts +34 -0
  99. package/dist/utils/json.d.ts.map +1 -0
  100. package/dist/utils/json.js +152 -0
  101. package/dist/utils/json.js.map +7 -0
  102. package/dist/utils/num.d.ts +60 -0
  103. package/dist/utils/num.d.ts.map +1 -0
  104. package/dist/utils/num.js +39 -0
  105. package/dist/utils/num.js.map +7 -0
  106. package/dist/utils/obj.d.ts +258 -0
  107. package/dist/utils/obj.d.ts.map +1 -0
  108. package/dist/utils/obj.js +538 -0
  109. package/dist/utils/obj.js.map +7 -0
  110. package/dist/utils/path.d.ts +23 -0
  111. package/dist/utils/path.d.ts.map +1 -0
  112. package/dist/utils/path.js +21 -0
  113. package/dist/utils/path.js.map +7 -0
  114. package/dist/utils/primitive.d.ts +18 -0
  115. package/dist/utils/primitive.d.ts.map +1 -0
  116. package/dist/utils/primitive.js +20 -0
  117. package/dist/utils/primitive.js.map +7 -0
  118. package/dist/utils/str.d.ts +103 -0
  119. package/dist/utils/str.d.ts.map +1 -0
  120. package/dist/utils/str.js +128 -0
  121. package/dist/utils/str.js.map +7 -0
  122. package/dist/utils/template-strings.d.ts +84 -0
  123. package/dist/utils/template-strings.d.ts.map +1 -0
  124. package/dist/utils/template-strings.js +49 -0
  125. package/dist/utils/template-strings.js.map +7 -0
  126. package/dist/utils/transferable.d.ts +47 -0
  127. package/dist/utils/transferable.d.ts.map +1 -0
  128. package/dist/utils/transferable.js +153 -0
  129. package/dist/utils/transferable.js.map +7 -0
  130. package/dist/utils/wait.d.ts +19 -0
  131. package/dist/utils/wait.d.ts.map +1 -0
  132. package/dist/utils/wait.js +19 -0
  133. package/dist/utils/wait.js.map +7 -0
  134. package/dist/utils/xml.d.ts +36 -0
  135. package/dist/utils/xml.d.ts.map +1 -0
  136. package/dist/utils/xml.js +51 -0
  137. package/dist/utils/xml.js.map +7 -0
  138. package/dist/zip/sd-zip.d.ts +80 -0
  139. package/dist/zip/sd-zip.d.ts.map +1 -0
  140. package/dist/zip/sd-zip.js +153 -0
  141. package/dist/zip/sd-zip.js.map +7 -0
  142. package/package.json +31 -0
  143. package/src/common.types.ts +91 -0
  144. package/src/env.ts +11 -0
  145. package/src/errors/argument-error.ts +40 -0
  146. package/src/errors/not-implemented-error.ts +32 -0
  147. package/src/errors/sd-error.ts +53 -0
  148. package/src/errors/timeout-error.ts +36 -0
  149. package/src/extensions/arr-ext.helpers.ts +53 -0
  150. package/src/extensions/arr-ext.ts +777 -0
  151. package/src/extensions/arr-ext.types.ts +258 -0
  152. package/src/extensions/map-ext.ts +86 -0
  153. package/src/extensions/set-ext.ts +68 -0
  154. package/src/features/debounce-queue.ts +116 -0
  155. package/src/features/event-emitter.ts +112 -0
  156. package/src/features/serial-queue.ts +94 -0
  157. package/src/globals.ts +12 -0
  158. package/src/index.ts +55 -0
  159. package/src/types/date-only.ts +329 -0
  160. package/src/types/date-time.ts +294 -0
  161. package/src/types/lazy-gc-map.ts +244 -0
  162. package/src/types/time.ts +210 -0
  163. package/src/types/uuid.ts +113 -0
  164. package/src/utils/bytes.ts +160 -0
  165. package/src/utils/date-format.ts +239 -0
  166. package/src/utils/json.ts +230 -0
  167. package/src/utils/num.ts +97 -0
  168. package/src/utils/obj.ts +956 -0
  169. package/src/utils/path.ts +40 -0
  170. package/src/utils/primitive.ts +33 -0
  171. package/src/utils/str.ts +252 -0
  172. package/src/utils/template-strings.ts +132 -0
  173. package/src/utils/transferable.ts +269 -0
  174. package/src/utils/wait.ts +40 -0
  175. package/src/utils/xml.ts +105 -0
  176. package/src/zip/sd-zip.ts +218 -0
  177. package/tests/errors/errors.spec.ts +196 -0
  178. package/tests/extensions/array-extension.spec.ts +790 -0
  179. package/tests/extensions/map-extension.spec.ts +147 -0
  180. package/tests/extensions/set-extension.spec.ts +74 -0
  181. package/tests/types/date-only.spec.ts +636 -0
  182. package/tests/types/date-time.spec.ts +391 -0
  183. package/tests/types/lazy-gc-map.spec.ts +692 -0
  184. package/tests/types/time.spec.ts +559 -0
  185. package/tests/types/types.spec.ts +55 -0
  186. package/tests/types/uuid.spec.ts +91 -0
  187. package/tests/utils/bytes-utils.spec.ts +230 -0
  188. package/tests/utils/date-format.spec.ts +371 -0
  189. package/tests/utils/debounce-queue.spec.ts +272 -0
  190. package/tests/utils/json.spec.ts +475 -0
  191. package/tests/utils/number.spec.ts +184 -0
  192. package/tests/utils/object.spec.ts +827 -0
  193. package/tests/utils/path.spec.ts +78 -0
  194. package/tests/utils/primitive.spec.ts +55 -0
  195. package/tests/utils/sd-event-emitter.spec.ts +216 -0
  196. package/tests/utils/serial-queue.spec.ts +365 -0
  197. package/tests/utils/string.spec.ts +294 -0
  198. package/tests/utils/template-strings.spec.ts +96 -0
  199. package/tests/utils/transferable.spec.ts +698 -0
  200. package/tests/utils/wait.spec.ts +145 -0
  201. package/tests/utils/xml.spec.ts +146 -0
  202. package/tests/zip/sd-zip.spec.ts +234 -0
@@ -0,0 +1,546 @@
1
+ import "./map-ext";
2
+ import { objClone, objEqual, objMerge } from "../utils/obj";
3
+ import { DateTime } from "../types/date-time";
4
+ import { DateOnly } from "../types/date-only";
5
+ import { Time } from "../types/time";
6
+ import { Uuid } from "../types/uuid";
7
+ import { ArgumentError } from "../errors/argument-error";
8
+ import { SdError } from "../errors/sd-error";
9
+ import { compareForOrder } from "./arr-ext.helpers";
10
+ const arrayReadonlyExtensions = {
11
+ single(predicate) {
12
+ const arr = predicate !== void 0 ? this.filter(predicate) : this;
13
+ if (arr.length > 1) {
14
+ throw new ArgumentError("\uBCF5\uC218\uC758 \uACB0\uACFC\uBB3C\uC774 \uC788\uC2B5\uB2C8\uB2E4.", { count: arr.length });
15
+ }
16
+ return arr[0];
17
+ },
18
+ first(predicate) {
19
+ return predicate !== void 0 ? this.find(predicate) : this[0];
20
+ },
21
+ async filterAsync(predicate) {
22
+ const arr = [];
23
+ for (let i = 0; i < this.length; i++) {
24
+ if (await predicate(this[i], i)) {
25
+ arr.push(this[i]);
26
+ }
27
+ }
28
+ return arr;
29
+ },
30
+ last(predicate) {
31
+ if (predicate !== void 0) {
32
+ for (let i = this.length - 1; i >= 0; i--) {
33
+ if (predicate(this[i], i)) {
34
+ return this[i];
35
+ }
36
+ }
37
+ return void 0;
38
+ } else {
39
+ return this[this.length - 1];
40
+ }
41
+ },
42
+ filterExists() {
43
+ return this.filter((item) => item != null);
44
+ },
45
+ ofType(type) {
46
+ if (typeof type === "string") {
47
+ return this.filter((item) => {
48
+ switch (type) {
49
+ case "string":
50
+ return typeof item === "string";
51
+ case "number":
52
+ return typeof item === "number";
53
+ case "boolean":
54
+ return typeof item === "boolean";
55
+ case "DateTime":
56
+ return item instanceof DateTime;
57
+ case "DateOnly":
58
+ return item instanceof DateOnly;
59
+ case "Time":
60
+ return item instanceof Time;
61
+ case "Uuid":
62
+ return item instanceof Uuid;
63
+ case "Bytes":
64
+ return item instanceof Uint8Array;
65
+ default: {
66
+ const _exhaustive = type;
67
+ throw new ArgumentError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD0C0\uC785: ${_exhaustive}`);
68
+ }
69
+ }
70
+ });
71
+ }
72
+ return this.filter((item) => item instanceof type || (item == null ? void 0 : item.constructor) === type);
73
+ },
74
+ async mapAsync(selector) {
75
+ const result = [];
76
+ for (let i = 0; i < this.length; i++) {
77
+ result.push(await selector(this[i], i));
78
+ }
79
+ return result;
80
+ },
81
+ mapMany(selector) {
82
+ const arr = selector ? this.map(selector) : this;
83
+ return arr.flat().filterExists();
84
+ },
85
+ async mapManyAsync(selector) {
86
+ const arr = selector !== void 0 ? await this.mapAsync(selector) : this;
87
+ return arr.mapMany();
88
+ },
89
+ parallelAsync(fn) {
90
+ return Promise.all(this.map(fn));
91
+ },
92
+ // 배열을 키별로 그룹화
93
+ // 성능 고려사항:
94
+ // - primitive 키 (string, number 등): O(n) - Map 기반
95
+ // - 객체 키: O(n²) - objEqual 비교
96
+ groupBy(keySelector, valueSelector) {
97
+ const result = [];
98
+ const primitiveKeyIndex = /* @__PURE__ */ new Map();
99
+ for (let i = 0; i < this.length; i++) {
100
+ const keyObj = keySelector(this[i], i);
101
+ const valueObj = valueSelector !== void 0 ? valueSelector(this[i], i) : this[i];
102
+ if (keyObj == null || typeof keyObj !== "object") {
103
+ const keyStr = typeof keyObj + ":" + String(keyObj);
104
+ const existingIndex = primitiveKeyIndex.get(keyStr);
105
+ if (existingIndex !== void 0) {
106
+ result[existingIndex].values.push(valueObj);
107
+ } else {
108
+ primitiveKeyIndex.set(keyStr, result.length);
109
+ result.push({ key: keyObj, values: [valueObj] });
110
+ }
111
+ continue;
112
+ }
113
+ const existsRecord = result.find((item) => objEqual(item.key, keyObj));
114
+ if (existsRecord !== void 0) {
115
+ existsRecord.values.push(valueObj);
116
+ } else {
117
+ result.push({ key: keyObj, values: [valueObj] });
118
+ }
119
+ }
120
+ return result;
121
+ },
122
+ toMap(keySelector, valueSelector) {
123
+ const result = /* @__PURE__ */ new Map();
124
+ for (let i = 0; i < this.length; i++) {
125
+ const item = this[i];
126
+ const keyObj = keySelector(item, i);
127
+ const valueObj = valueSelector !== void 0 ? valueSelector(item, i) : item;
128
+ if (result.has(keyObj)) {
129
+ throw new ArgumentError("\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", { duplicatedKey: keyObj });
130
+ }
131
+ result.set(keyObj, valueObj);
132
+ }
133
+ return result;
134
+ },
135
+ async toMapAsync(keySelector, valueSelector) {
136
+ const result = /* @__PURE__ */ new Map();
137
+ for (let i = 0; i < this.length; i++) {
138
+ const item = this[i];
139
+ const keyObj = await keySelector(item, i);
140
+ const valueObj = valueSelector !== void 0 ? await valueSelector(item, i) : item;
141
+ if (result.has(keyObj)) {
142
+ throw new ArgumentError("\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", { duplicatedKey: keyObj });
143
+ }
144
+ result.set(keyObj, valueObj);
145
+ }
146
+ return result;
147
+ },
148
+ toArrayMap(keySelector, valueSelector) {
149
+ const result = /* @__PURE__ */ new Map();
150
+ for (let i = 0; i < this.length; i++) {
151
+ const item = this[i];
152
+ const keyObj = keySelector(item, i);
153
+ const valueObj = valueSelector !== void 0 ? valueSelector(item, i) : item;
154
+ const arr = result.getOrCreate(keyObj, []);
155
+ arr.push(valueObj);
156
+ }
157
+ return result;
158
+ },
159
+ toSetMap(keySelector, valueSelector) {
160
+ const result = /* @__PURE__ */ new Map();
161
+ for (let i = 0; i < this.length; i++) {
162
+ const item = this[i];
163
+ const keyObj = keySelector(item, i);
164
+ const valueObj = valueSelector !== void 0 ? valueSelector(item, i) : item;
165
+ const set = result.getOrCreate(keyObj, /* @__PURE__ */ new Set());
166
+ set.add(valueObj);
167
+ }
168
+ return result;
169
+ },
170
+ toMapValues(keySelector, valueSelector) {
171
+ const itemsMap = /* @__PURE__ */ new Map();
172
+ for (let i = 0; i < this.length; i++) {
173
+ const item = this[i];
174
+ const keyObj = keySelector(item, i);
175
+ const arr = itemsMap.getOrCreate(keyObj, []);
176
+ arr.push(item);
177
+ }
178
+ const result = /* @__PURE__ */ new Map();
179
+ for (const key of itemsMap.keys()) {
180
+ result.set(key, valueSelector(itemsMap.get(key)));
181
+ }
182
+ return result;
183
+ },
184
+ toObject(keySelector, valueSelector) {
185
+ const result = {};
186
+ for (let i = 0; i < this.length; i++) {
187
+ const item = this[i];
188
+ const key = keySelector(item, i);
189
+ const valueObj = valueSelector !== void 0 ? valueSelector(item, i) : item;
190
+ if (result[key] !== void 0) {
191
+ throw new ArgumentError("\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", { duplicatedKey: key });
192
+ }
193
+ result[key] = valueObj;
194
+ }
195
+ return result;
196
+ },
197
+ toTree(key, parentKey) {
198
+ const childrenMap = this.toArrayMap((item) => item[parentKey]);
199
+ const fn = (items) => {
200
+ return items.map((item) => ({
201
+ ...objClone(item),
202
+ children: fn(childrenMap.get(item[key]) ?? [])
203
+ }));
204
+ };
205
+ const rootItems = this.filter((item1) => item1[parentKey] == null);
206
+ return fn(rootItems);
207
+ },
208
+ distinct(options) {
209
+ const opts = typeof options === "boolean" ? { matchAddress: options } : options ?? {};
210
+ if (opts.matchAddress === true) return [...new Set(this)];
211
+ if (opts.keyFn) {
212
+ const seen2 = /* @__PURE__ */ new Set();
213
+ const result2 = [];
214
+ for (const item of this) {
215
+ const key = opts.keyFn(item);
216
+ if (!seen2.has(key)) {
217
+ seen2.add(key);
218
+ result2.push(item);
219
+ }
220
+ }
221
+ return result2;
222
+ }
223
+ const seen = /* @__PURE__ */ new Map();
224
+ const seenRefs = /* @__PURE__ */ new Set();
225
+ const result = [];
226
+ for (const item of this) {
227
+ if (item === null || typeof item !== "object") {
228
+ const type = typeof item;
229
+ if (type === "symbol" || type === "function") {
230
+ if (!seenRefs.has(item)) {
231
+ seenRefs.add(item);
232
+ result.push(item);
233
+ }
234
+ continue;
235
+ }
236
+ let key = type + ":";
237
+ if (Object.is(item, -0)) {
238
+ key += "-0";
239
+ } else {
240
+ key += String(item);
241
+ }
242
+ if (!seen.has(key)) {
243
+ seen.set(key, item);
244
+ result.push(item);
245
+ }
246
+ continue;
247
+ }
248
+ if (!result.some((item1) => objEqual(item1, item))) {
249
+ result.push(item);
250
+ }
251
+ }
252
+ return result;
253
+ },
254
+ orderBy(selector) {
255
+ return [...this].sort((p, n) => {
256
+ const pp = selector == null ? p : selector(p);
257
+ const pn = selector == null ? n : selector(n);
258
+ return compareForOrder(pp, pn, false);
259
+ });
260
+ },
261
+ orderByDesc(selector) {
262
+ return [...this].sort((p, n) => {
263
+ const pp = selector == null ? p : selector(p);
264
+ const pn = selector == null ? n : selector(n);
265
+ return compareForOrder(pp, pn, true);
266
+ });
267
+ },
268
+ diffs(target, options) {
269
+ const result = [];
270
+ const uncheckedTarget = [...target];
271
+ const uncheckedTargetSet = new Set(uncheckedTarget);
272
+ const hasKeys = (options == null ? void 0 : options.keys) !== void 0 && options.keys.length > 0;
273
+ const excludeOpts = { topLevelExcludes: options == null ? void 0 : options.excludes };
274
+ const keyIndexedTarget = hasKeys ? /* @__PURE__ */ new Map() : void 0;
275
+ if (keyIndexedTarget) {
276
+ for (const targetItem of uncheckedTarget) {
277
+ const keyStr = JSON.stringify(options.keys.map((k) => targetItem[k]));
278
+ const arr = keyIndexedTarget.get(keyStr);
279
+ if (arr) {
280
+ arr.push(targetItem);
281
+ } else {
282
+ keyIndexedTarget.set(keyStr, [targetItem]);
283
+ }
284
+ }
285
+ }
286
+ for (const sourceItem of this) {
287
+ let sameTarget;
288
+ let sameKeyTarget;
289
+ for (const targetItem of uncheckedTarget) {
290
+ if (!uncheckedTargetSet.has(targetItem)) continue;
291
+ if (objEqual(targetItem, sourceItem, excludeOpts)) {
292
+ sameTarget = targetItem;
293
+ break;
294
+ }
295
+ }
296
+ if (sameTarget === void 0 && keyIndexedTarget) {
297
+ const sourceKeyStr = JSON.stringify(options.keys.map((k) => sourceItem[k]));
298
+ const candidates = keyIndexedTarget.get(sourceKeyStr);
299
+ if (candidates && candidates.length > 0) {
300
+ sameKeyTarget = candidates.find((c) => uncheckedTargetSet.has(c));
301
+ }
302
+ }
303
+ if (sameTarget !== void 0) {
304
+ uncheckedTargetSet.delete(sameTarget);
305
+ } else if (sameKeyTarget !== void 0) {
306
+ result.push({ source: sourceItem, target: sameKeyTarget });
307
+ uncheckedTargetSet.delete(sameKeyTarget);
308
+ } else {
309
+ result.push({ source: sourceItem, target: void 0 });
310
+ }
311
+ }
312
+ for (const uncheckedTargetItem of uncheckedTargetSet) {
313
+ result.push({ source: void 0, target: uncheckedTargetItem });
314
+ }
315
+ return result;
316
+ },
317
+ oneWayDiffs(orgItems, keyPropNameOrFn, options) {
318
+ const orgItemMap = orgItems instanceof Map ? orgItems : orgItems.toMap(
319
+ (orgItem) => typeof keyPropNameOrFn === "function" ? keyPropNameOrFn(orgItem) : orgItem[keyPropNameOrFn]
320
+ );
321
+ const includeSame = (options == null ? void 0 : options.includeSame) ?? false;
322
+ const diffs = [];
323
+ for (const item of this) {
324
+ const keyValue = typeof keyPropNameOrFn === "function" ? keyPropNameOrFn(item) : item[keyPropNameOrFn];
325
+ if (keyValue == null) {
326
+ diffs.push({ type: "create", item, orgItem: void 0 });
327
+ continue;
328
+ }
329
+ const orgItem = orgItemMap.get(keyValue);
330
+ if (!orgItem) {
331
+ diffs.push({ type: "create", item, orgItem: void 0 });
332
+ continue;
333
+ }
334
+ if (objEqual(orgItem, item, {
335
+ topLevelExcludes: options == null ? void 0 : options.excludes,
336
+ topLevelIncludes: options == null ? void 0 : options.includes
337
+ })) {
338
+ if (includeSame) {
339
+ diffs.push({ type: "same", item, orgItem });
340
+ }
341
+ continue;
342
+ }
343
+ diffs.push({ type: "update", item, orgItem });
344
+ }
345
+ return diffs;
346
+ },
347
+ merge(target, options) {
348
+ const diffs = this.diffs(target, options);
349
+ const result = objClone(this);
350
+ const sourceIndexMap = /* @__PURE__ */ new Map();
351
+ for (let i = 0; i < this.length; i++) {
352
+ sourceIndexMap.set(this[i], i);
353
+ }
354
+ for (const diff of diffs) {
355
+ if (diff.source !== void 0 && diff.target !== void 0) {
356
+ const sourceIndex = sourceIndexMap.get(diff.source);
357
+ if (sourceIndex === void 0) {
358
+ throw new SdError("\uC608\uC0C1\uCE58 \uBABB\uD55C \uC624\uB958: merge\uC5D0\uC11C source \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
359
+ }
360
+ result[sourceIndex] = objMerge(diff.source, diff.target);
361
+ } else if (diff.target !== void 0) {
362
+ result.push(diff.target);
363
+ }
364
+ }
365
+ return result;
366
+ },
367
+ sum(selector) {
368
+ let result = 0;
369
+ for (let i = 0; i < this.length; i++) {
370
+ const item = selector !== void 0 ? selector(this[i], i) : this[i];
371
+ if (typeof item !== "number") {
372
+ throw new ArgumentError("sum \uC740 number \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.", { type: typeof item });
373
+ }
374
+ result += item;
375
+ }
376
+ return result;
377
+ },
378
+ min(selector) {
379
+ let result;
380
+ for (let i = 0; i < this.length; i++) {
381
+ const item = selector !== void 0 ? selector(this[i], i) : this[i];
382
+ if (typeof item !== "number" && typeof item !== "string") {
383
+ throw new ArgumentError("min \uC740 number/string \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.", { type: typeof item });
384
+ }
385
+ if (result === void 0 || result > item) {
386
+ result = item;
387
+ }
388
+ }
389
+ return result;
390
+ },
391
+ max(selector) {
392
+ let result;
393
+ for (let i = 0; i < this.length; i++) {
394
+ const item = selector !== void 0 ? selector(this[i], i) : this[i];
395
+ if (typeof item !== "number" && typeof item !== "string") {
396
+ throw new ArgumentError("max \uC740 number/string \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.", { type: typeof item });
397
+ }
398
+ if (result === void 0 || result < item) {
399
+ result = item;
400
+ }
401
+ }
402
+ return result;
403
+ },
404
+ shuffle() {
405
+ if (this.length <= 1) {
406
+ return [...this];
407
+ }
408
+ const result = [...this];
409
+ for (let i = result.length - 1; i > 0; i--) {
410
+ const j = Math.floor(Math.random() * (i + 1));
411
+ [result[i], result[j]] = [result[j], result[i]];
412
+ }
413
+ return result;
414
+ }
415
+ };
416
+ const arrayMutableExtensions = {
417
+ distinctThis(options) {
418
+ const opts = typeof options === "boolean" ? { matchAddress: options } : options ?? {};
419
+ if (opts.matchAddress === true) {
420
+ const seen2 = /* @__PURE__ */ new Set();
421
+ const toRemove = [];
422
+ for (let i = 0; i < this.length; i++) {
423
+ if (seen2.has(this[i])) {
424
+ toRemove.push(i);
425
+ } else {
426
+ seen2.add(this[i]);
427
+ }
428
+ }
429
+ for (let i = toRemove.length - 1; i >= 0; i--) {
430
+ this.splice(toRemove[i], 1);
431
+ }
432
+ return this;
433
+ }
434
+ if (opts.keyFn) {
435
+ const seen2 = /* @__PURE__ */ new Set();
436
+ const toRemove = [];
437
+ for (let i = 0; i < this.length; i++) {
438
+ const key = opts.keyFn(this[i]);
439
+ if (seen2.has(key)) {
440
+ toRemove.push(i);
441
+ } else {
442
+ seen2.add(key);
443
+ }
444
+ }
445
+ for (let i = toRemove.length - 1; i >= 0; i--) {
446
+ this.splice(toRemove[i], 1);
447
+ }
448
+ return this;
449
+ }
450
+ const seen = /* @__PURE__ */ new Map();
451
+ const seenRefs = /* @__PURE__ */ new Set();
452
+ const toRemoveSet = /* @__PURE__ */ new Set();
453
+ for (let i = 0; i < this.length; i++) {
454
+ const item = this[i];
455
+ if (item === null || typeof item !== "object") {
456
+ const type = typeof item;
457
+ if (type === "symbol" || type === "function") {
458
+ if (seenRefs.has(item)) {
459
+ toRemoveSet.add(i);
460
+ } else {
461
+ seenRefs.add(item);
462
+ }
463
+ continue;
464
+ }
465
+ let key = type + ":";
466
+ if (Object.is(item, -0)) {
467
+ key += "-0";
468
+ } else {
469
+ key += String(item);
470
+ }
471
+ if (seen.has(key)) {
472
+ toRemoveSet.add(i);
473
+ } else {
474
+ seen.set(key, item);
475
+ }
476
+ continue;
477
+ }
478
+ let hasDuplicateBefore = false;
479
+ for (let j = 0; j < i; j++) {
480
+ if (toRemoveSet.has(j)) continue;
481
+ if (objEqual(this[j], item)) {
482
+ hasDuplicateBefore = true;
483
+ break;
484
+ }
485
+ }
486
+ if (hasDuplicateBefore) {
487
+ toRemoveSet.add(i);
488
+ }
489
+ }
490
+ const toRemoveArr = Array.from(toRemoveSet).sort((a, b) => b - a);
491
+ for (const idx of toRemoveArr) {
492
+ this.splice(idx, 1);
493
+ }
494
+ return this;
495
+ },
496
+ orderByThis(selector) {
497
+ return this.sort((p, n) => {
498
+ const pp = (selector == null ? void 0 : selector(p)) ?? p;
499
+ const pn = (selector == null ? void 0 : selector(n)) ?? n;
500
+ return compareForOrder(pp, pn, false);
501
+ });
502
+ },
503
+ orderByDescThis(selector) {
504
+ return this.sort((p, n) => {
505
+ const pp = (selector == null ? void 0 : selector(p)) ?? p;
506
+ const pn = (selector == null ? void 0 : selector(n)) ?? n;
507
+ return compareForOrder(pp, pn, true);
508
+ });
509
+ },
510
+ insert(index, ...items) {
511
+ this.splice(index, 0, ...items);
512
+ return this;
513
+ },
514
+ remove(itemOrSelector) {
515
+ const shouldRemove = typeof itemOrSelector === "function" ? itemOrSelector : (item) => item === itemOrSelector;
516
+ for (let i = this.length - 1; i >= 0; i--) {
517
+ if (shouldRemove(this[i], i)) {
518
+ this.splice(i, 1);
519
+ }
520
+ }
521
+ return this;
522
+ },
523
+ toggle(item) {
524
+ if (this.includes(item)) {
525
+ this.remove(item);
526
+ } else {
527
+ this.push(item);
528
+ }
529
+ return this;
530
+ },
531
+ clear() {
532
+ return this.remove(() => true);
533
+ }
534
+ };
535
+ for (const [name, fn] of Object.entries({
536
+ ...arrayReadonlyExtensions,
537
+ ...arrayMutableExtensions
538
+ })) {
539
+ Object.defineProperty(Array.prototype, name, {
540
+ value: fn,
541
+ enumerable: false,
542
+ writable: true,
543
+ configurable: true
544
+ });
545
+ }
546
+ //# sourceMappingURL=arr-ext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/extensions/arr-ext.ts"],
4
+ "sourcesContent": ["/**\n * Array \uD655\uC7A5 \uBA54\uC11C\uB4DC\n *\n * @remarks \uAC01 \uBA54\uC11C\uB4DC\uC758 TSDoc\uC740 \uD0C0\uC785 \uC815\uC758 \uD30C\uC77C(arr-ext.types.ts) \uCC38\uC870\n */\n\nimport \"./map-ext\";\nimport { objClone, objEqual, objMerge } from \"../utils/obj\";\nimport type { PrimitiveTypeStr, Type } from \"../common.types\";\nimport { DateTime } from \"../types/date-time\";\nimport { DateOnly } from \"../types/date-only\";\nimport { Time } from \"../types/time\";\nimport { Uuid } from \"../types/uuid\";\nimport { ArgumentError } from \"../errors/argument-error\";\nimport { SdError } from \"../errors/sd-error\";\nimport { compareForOrder } from \"./arr-ext.helpers\";\nimport type {\n ReadonlyArrayExt,\n MutableArrayExt,\n ArrayDiffsResult,\n ArrayDiffs2Result,\n TreeArray,\n} from \"./arr-ext.types\";\n\n//#region \uAD6C\uD604\n\nconst arrayReadonlyExtensions: ReadonlyArrayExt<any> & ThisType<any[]> = {\n single<T>(predicate?: (item: T, index: number) => boolean): T | undefined {\n const arr = predicate !== undefined ? this.filter(predicate) : this;\n if (arr.length > 1) {\n throw new ArgumentError(\"\uBCF5\uC218\uC758 \uACB0\uACFC\uBB3C\uC774 \uC788\uC2B5\uB2C8\uB2E4.\", { count: arr.length });\n }\n return arr[0];\n },\n\n first<T>(predicate?: (item: T, index: number) => boolean): T | undefined {\n return predicate !== undefined ? this.find(predicate) : this[0];\n },\n\n async filterAsync<T>(predicate: (item: T, index: number) => Promise<boolean>): Promise<T[]> {\n const arr: T[] = [];\n for (let i = 0; i < this.length; i++) {\n if (await predicate(this[i], i)) {\n arr.push(this[i]);\n }\n }\n return arr;\n },\n\n last<T>(predicate?: (item: T, index: number) => boolean): T | undefined {\n if (predicate !== undefined) {\n for (let i = this.length - 1; i >= 0; i--) {\n if (predicate(this[i], i)) {\n return this[i];\n }\n }\n\n return undefined;\n } else {\n return this[this.length - 1];\n }\n },\n\n filterExists<T>(): NonNullable<T>[] {\n return this.filter((item) => item != null);\n },\n\n ofType<T, N extends T>(type: PrimitiveTypeStr | Type<N>): N[] {\n // PrimitiveTypeStr\uC778 \uACBD\uC6B0\n if (typeof type === \"string\") {\n return this.filter((item) => {\n switch (type) {\n case \"string\":\n return typeof item === \"string\";\n case \"number\":\n return typeof item === \"number\";\n case \"boolean\":\n return typeof item === \"boolean\";\n case \"DateTime\":\n return item instanceof DateTime;\n case \"DateOnly\":\n return item instanceof DateOnly;\n case \"Time\":\n return item instanceof Time;\n case \"Uuid\":\n return item instanceof Uuid;\n case \"Bytes\":\n return item instanceof Uint8Array;\n default: {\n // exhaustive check: PrimitiveTypeStr\uC5D0 \uC0C8 \uD0C0\uC785 \uCD94\uAC00 \uC2DC \uCEF4\uD30C\uC77C \uC5D0\uB7EC \uBC1C\uC0DD\n const _exhaustive: never = type;\n throw new ArgumentError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD0C0\uC785: ${_exhaustive}`);\n }\n }\n }) as N[];\n }\n\n // Type<N> (\uC0DD\uC131\uC790)\uC778 \uACBD\uC6B0\n return this.filter((item) => item instanceof type || item?.constructor === type) as N[];\n },\n\n async mapAsync<T, R>(selector: (item: T, index: number) => Promise<R>): Promise<R[]> {\n const result: R[] = [];\n for (let i = 0; i < this.length; i++) {\n result.push(await selector(this[i], i));\n }\n return result;\n },\n\n mapMany<T, R>(selector?: (item: T, index: number) => R[]): T | R[] {\n const arr = selector ? this.map(selector) : this;\n return arr.flat().filterExists();\n },\n\n async mapManyAsync<T, R>(selector?: (item: T, index: number) => Promise<R[]>): Promise<T | R[]> {\n const arr = selector !== undefined ? await this.mapAsync(selector) : this;\n return arr.mapMany();\n },\n\n parallelAsync<T, R>(fn: (item: T, index: number) => Promise<R>): Promise<R[]> {\n return Promise.all(this.map(fn));\n },\n\n // \uBC30\uC5F4\uC744 \uD0A4\uBCC4\uB85C \uADF8\uB8F9\uD654\n // \uC131\uB2A5 \uACE0\uB824\uC0AC\uD56D:\n // - primitive \uD0A4 (string, number \uB4F1): O(n) - Map \uAE30\uBC18\n // - \uAC1D\uCCB4 \uD0A4: O(n\u00B2) - objEqual \uBE44\uAD50\n groupBy<T, K, V>(\n keySelector: (item: T, index: number) => K,\n valueSelector?: (item: T, index: number) => V,\n ): {\n key: K;\n values: (V | T)[];\n }[] {\n const result: { key: K; values: (V | T)[] }[] = [];\n\n // primitive \uD0A4 \uCD5C\uC801\uD654\uB97C \uC704\uD55C Map (\uD0A4 \uBB38\uC790\uC5F4 -> result \uC778\uB371\uC2A4)\n const primitiveKeyIndex = new Map<string, number>();\n\n for (let i = 0; i < this.length; i++) {\n const keyObj = keySelector(this[i], i);\n const valueObj = valueSelector !== undefined ? valueSelector(this[i], i) : this[i];\n\n // primitive \uD0A4\uB294 Map\uC73C\uB85C O(n) \uCC98\uB9AC\n if (keyObj == null || typeof keyObj !== \"object\") {\n const keyStr = typeof keyObj + \":\" + String(keyObj);\n const existingIndex = primitiveKeyIndex.get(keyStr);\n if (existingIndex !== undefined) {\n result[existingIndex].values.push(valueObj);\n } else {\n primitiveKeyIndex.set(keyStr, result.length);\n result.push({ key: keyObj, values: [valueObj] });\n }\n continue;\n }\n\n // \uAC1D\uCCB4 \uD0A4\uB294 \uAE30\uC874 \uBC29\uC2DD O(n\u00B2)\n const existsRecord = result.find((item) => objEqual(item.key, keyObj));\n if (existsRecord !== undefined) {\n existsRecord.values.push(valueObj);\n } else {\n result.push({ key: keyObj, values: [valueObj] });\n }\n }\n\n return result;\n },\n\n toMap<T, K, V>(\n keySelector: (item: T, index: number) => K,\n valueSelector?: (item: T, index: number) => V,\n ): Map<K, V | T> {\n const result = new Map<K, V | T>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const keyObj = keySelector(item, i);\n const valueObj = valueSelector !== undefined ? valueSelector(item, i) : item;\n\n if (result.has(keyObj)) {\n throw new ArgumentError(\"\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\", { duplicatedKey: keyObj });\n }\n result.set(keyObj, valueObj);\n }\n\n return result;\n },\n\n async toMapAsync<T, K, V>(\n keySelector: (item: T, index: number) => Promise<K> | K,\n valueSelector?: (item: T, index: number) => Promise<V> | V,\n ): Promise<Map<K, V | T>> {\n const result = new Map<K, V | T>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const keyObj = await keySelector(item, i);\n const valueObj = valueSelector !== undefined ? await valueSelector(item, i) : item;\n\n if (result.has(keyObj)) {\n throw new ArgumentError(\"\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\", { duplicatedKey: keyObj });\n }\n result.set(keyObj, valueObj);\n }\n\n return result;\n },\n\n toArrayMap<T, K, V>(\n keySelector: (item: T, index: number) => K,\n valueSelector?: (item: T, index: number) => V,\n ): Map<K, (V | T)[]> {\n const result = new Map<K, (V | T)[]>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const keyObj = keySelector(item, i);\n const valueObj = valueSelector !== undefined ? valueSelector(item, i) : item;\n\n const arr = result.getOrCreate(keyObj, []);\n arr.push(valueObj);\n }\n\n return result;\n },\n\n toSetMap<T, K, V>(\n keySelector: (item: T, index: number) => K,\n valueSelector?: (item: T, index: number) => V,\n ): Map<K, Set<V | T>> {\n const result = new Map<K, Set<V | T>>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const keyObj = keySelector(item, i);\n const valueObj = valueSelector !== undefined ? valueSelector(item, i) : item;\n\n const set = result.getOrCreate(keyObj, new Set<V | T>());\n set.add(valueObj);\n }\n\n return result;\n },\n\n toMapValues<T, K, V>(keySelector: (item: T, index: number) => K, valueSelector: (items: T[]) => V): Map<K, V | T> {\n const itemsMap = new Map<K, T[]>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const keyObj = keySelector(item, i);\n\n const arr = itemsMap.getOrCreate(keyObj, []);\n arr.push(item);\n }\n\n const result = new Map<K, V | T>();\n\n for (const key of itemsMap.keys()) {\n result.set(key, valueSelector(itemsMap.get(key)!));\n }\n\n return result;\n },\n\n toObject<T, V>(\n keySelector: (item: T, index: number) => string,\n valueSelector?: (item: T, index: number) => V,\n ): Record<string, V | T> {\n const result: Record<string, V | T> = {};\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n const key = keySelector(item, i);\n const valueObj = valueSelector !== undefined ? valueSelector(item, i) : item;\n\n // undefined \uAC12\uC740 \"\uC5C6\uC74C\"\uC73C\uB85C \uCDE8\uAE09\uD558\uC5EC \uB36E\uC5B4\uC4F0\uAE30 \uD5C8\uC6A9\n if (result[key] !== undefined) {\n throw new ArgumentError(\"\uD0A4\uAC00 \uC911\uBCF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\", { duplicatedKey: key });\n }\n result[key] = valueObj;\n }\n\n return result;\n },\n\n toTree<T, K extends keyof T, P extends keyof T>(key: K, parentKey: P): TreeArray<T>[] {\n // O(n) \uCD5C\uC801\uD654: \uB9F5 \uAE30\uBC18 \uC778\uB371\uC2F1\n const childrenMap = this.toArrayMap((item) => item[parentKey]);\n\n const fn = (items: T[]): TreeArray<T>[] => {\n return items.map((item) => ({\n ...objClone(item),\n children: fn(childrenMap.get(item[key]) ?? []),\n }));\n };\n\n const rootItems = this.filter((item1) => item1[parentKey] == null);\n return fn(rootItems);\n },\n\n distinct<T>(options?: boolean | { matchAddress?: boolean; keyFn?: (item: T) => string | number }): T[] {\n // \uC635\uC158 \uC815\uADDC\uD654\n const opts = typeof options === \"boolean\" ? { matchAddress: options } : (options ?? {});\n\n // matchAddress: Set \uAE30\uBC18 O(n)\n if (opts.matchAddress === true) return [...new Set(this)];\n\n // keyFn \uC81C\uACF5 \uC2DC: \uCEE4\uC2A4\uD140 \uD0A4 \uAE30\uBC18 O(n)\n if (opts.keyFn) {\n const seen = new Set<string | number>();\n const result: T[] = [];\n for (const item of this) {\n const key = opts.keyFn(item);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(item);\n }\n }\n return result;\n }\n\n // \uAE30\uBCF8: \uD0C0\uC785\uBCC4 \uCC98\uB9AC\n const seen = new Map<string, T>();\n const seenRefs = new Set<symbol | ((...args: unknown[]) => unknown)>(); // symbol/function\uC6A9 O(n) \uCC98\uB9AC\n const result: T[] = [];\n\n for (const item of this) {\n // primitive \uD0C0\uC785\uC740 \uBE60\uB978 \uACBD\uB85C\n if (item === null || typeof item !== \"object\") {\n const type = typeof item;\n\n // symbol, function\uC740 Set\uC73C\uB85C identity \uBE44\uAD50 (O(n))\n if (type === \"symbol\" || type === \"function\") {\n if (!seenRefs.has(item)) {\n seenRefs.add(item);\n result.push(item);\n }\n continue;\n }\n\n // \uB098\uBA38\uC9C0 primitive\uB294 \uD0C0\uC785 prefix + \uD2B9\uC218 \uCF00\uC774\uC2A4 \uCC98\uB9AC\n let key = type + \":\";\n if (Object.is(item, -0)) {\n key += \"-0\";\n } else {\n key += String(item);\n }\n\n if (!seen.has(key)) {\n seen.set(key, item);\n result.push(item);\n }\n continue;\n }\n\n if (!result.some((item1) => objEqual(item1, item))) {\n result.push(item);\n }\n }\n\n return result;\n },\n\n orderBy<T>(selector?: (item: T) => string | number | DateTime | DateOnly | Time | undefined): T[] {\n return [...this].sort((p, n) => {\n const pp = selector == null ? p : selector(p);\n const pn = selector == null ? n : selector(n);\n return compareForOrder(pp, pn, false);\n });\n },\n\n orderByDesc<T>(selector?: (item: T) => string | number | DateTime | DateOnly | Time | undefined): T[] {\n return [...this].sort((p, n) => {\n const pp = selector == null ? p : selector(p);\n const pn = selector == null ? n : selector(n);\n return compareForOrder(pp, pn, true);\n });\n },\n\n diffs<T, P>(\n target: P[],\n options?: {\n keys?: string[];\n excludes?: string[];\n },\n ): ArrayDiffsResult<T, P>[] {\n const result: ArrayDiffsResult<T, P>[] = [];\n\n const uncheckedTarget = [...target];\n const uncheckedTargetSet = new Set(uncheckedTarget);\n const hasKeys = options?.keys !== undefined && options.keys.length > 0;\n const excludeOpts = { topLevelExcludes: options?.excludes };\n\n // keys \uC635\uC158\uC774 \uC788\uB294 \uACBD\uC6B0 target\uC744 keys \uAE30\uC900\uC73C\uB85C Map\uC5D0 \uBBF8\uB9AC \uC778\uB371\uC2F1\uD558\uC5EC O(n\u00D7m) \u2192 O(n+m) \uAC1C\uC120\n // \uD0A4 \uAC12\uC774 \uAC19\uC740 target\uC774 \uC5EC\uB7EC \uAC1C \uC788\uC744 \uC218 \uC788\uC73C\uBBC0\uB85C \uBC30\uC5F4\uB85C \uC800\uC7A5\n const keyIndexedTarget = hasKeys ? new Map<string, P[]>() : undefined;\n\n if (keyIndexedTarget) {\n for (const targetItem of uncheckedTarget) {\n const keyStr = JSON.stringify(options!.keys!.map((k) => (targetItem as Record<string, unknown>)[k]));\n const arr = keyIndexedTarget.get(keyStr);\n if (arr) {\n arr.push(targetItem);\n } else {\n keyIndexedTarget.set(keyStr, [targetItem]);\n }\n }\n }\n\n for (const sourceItem of this) {\n // \uC804\uCCB4 \uC77C\uCE58(sameTarget) \uC6B0\uC120, \uC5C6\uC73C\uBA74 \uD0A4 \uC77C\uCE58(sameKeyTarget) \uAC80\uC0C9\n let sameTarget: P | undefined;\n let sameKeyTarget: P | undefined;\n\n // Set \uAE30\uBC18 \uAC74\uB108\uB6F0\uAE30\uB85C \uC774\uBBF8 \uB9E4\uCE6D\uB41C \uD56D\uBAA9 \uC2A4\uD0B5 (splice O(n) \uC81C\uAC70)\n for (const targetItem of uncheckedTarget) {\n if (!uncheckedTargetSet.has(targetItem)) continue;\n if (objEqual(targetItem, sourceItem, excludeOpts)) {\n sameTarget = targetItem;\n break;\n }\n }\n\n // \uC804\uCCB4 \uC77C\uCE58\uAC00 \uC5C6\uACE0 keys \uC635\uC158\uC774 \uC788\uC73C\uBA74 Map\uC5D0\uC11C O(1) \uC870\uD68C\n if (sameTarget === undefined && keyIndexedTarget) {\n const sourceKeyStr = JSON.stringify(options!.keys!.map((k) => (sourceItem as Record<string, unknown>)[k]));\n const candidates = keyIndexedTarget.get(sourceKeyStr);\n if (candidates && candidates.length > 0) {\n // uncheckedTargetSet\uC5D0\uC11C O(1) \uC870\uD68C\uB85C \uC544\uC9C1 \uB0A8\uC544\uC788\uB294 \uCCAB \uBC88\uC9F8 \uD56D\uBAA9 \uC120\uD0DD\n sameKeyTarget = candidates.find((c) => uncheckedTargetSet.has(c));\n }\n }\n\n if (sameTarget !== undefined) {\n uncheckedTargetSet.delete(sameTarget);\n } else if (sameKeyTarget !== undefined) {\n result.push({ source: sourceItem, target: sameKeyTarget });\n uncheckedTargetSet.delete(sameKeyTarget);\n } else {\n result.push({ source: sourceItem, target: undefined });\n }\n }\n\n for (const uncheckedTargetItem of uncheckedTargetSet) {\n result.push({ source: undefined, target: uncheckedTargetItem });\n }\n\n return result;\n },\n\n oneWayDiffs<T extends Record<string, unknown>, K extends keyof T>(\n orgItems: T[] | Map<T[K], T>,\n keyPropNameOrFn: K | ((item: T) => K),\n options?: {\n includeSame?: boolean;\n excludes?: string[];\n includes?: string[];\n },\n ): ArrayDiffs2Result<T>[] {\n const orgItemMap =\n orgItems instanceof Map\n ? orgItems\n : orgItems.toMap((orgItem) =>\n typeof keyPropNameOrFn === \"function\" ? keyPropNameOrFn(orgItem) : orgItem[keyPropNameOrFn],\n );\n const includeSame = options?.includeSame ?? false;\n\n const diffs: ArrayDiffs2Result<T>[] = [];\n for (const item of this) {\n const keyValue = typeof keyPropNameOrFn === \"function\" ? keyPropNameOrFn(item) : item[keyPropNameOrFn];\n if (keyValue == null) {\n diffs.push({ type: \"create\", item, orgItem: undefined });\n continue;\n }\n\n const orgItem = orgItemMap.get(keyValue);\n if (!orgItem) {\n diffs.push({ type: \"create\", item, orgItem: undefined });\n continue;\n }\n\n if (\n objEqual(orgItem, item, {\n topLevelExcludes: options?.excludes,\n topLevelIncludes: options?.includes,\n })\n ) {\n if (includeSame) {\n diffs.push({ type: \"same\", item, orgItem });\n }\n continue;\n }\n\n diffs.push({ type: \"update\", item, orgItem });\n }\n return diffs;\n },\n\n merge<T, P>(\n target: P[],\n options?: {\n keys?: string[];\n excludes?: string[];\n },\n ): (T | P | (T & P))[] {\n const diffs = this.diffs(target, options);\n\n const result: (T | P | (T & P))[] = objClone(this);\n\n // source \uD56D\uBAA9\uC758 \uC6D0\uBCF8 \uC778\uB371\uC2A4\uB97C \uBBF8\uB9AC \uACC4\uC0B0\uD558\uC5EC O(n) \uAC80\uC0C9\uC744 O(1)\uB85C \uAC1C\uC120\n const sourceIndexMap = new Map<T, number>();\n for (let i = 0; i < this.length; i++) {\n sourceIndexMap.set(this[i], i);\n }\n\n for (const diff of diffs) {\n // \uBCC0\uACBD\uC2DC\n if (diff.source !== undefined && diff.target !== undefined) {\n const sourceIndex = sourceIndexMap.get(diff.source);\n if (sourceIndex === undefined) {\n throw new SdError(\"\uC608\uC0C1\uCE58 \uBABB\uD55C \uC624\uB958: merge\uC5D0\uC11C source \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n result[sourceIndex] = objMerge(diff.source, diff.target);\n }\n // \uCD94\uAC00\uC2DC\n else if (diff.target !== undefined) {\n result.push(diff.target);\n }\n }\n\n return result;\n },\n\n sum<T>(selector?: (item: T, index: number) => number): number {\n let result = 0;\n for (let i = 0; i < this.length; i++) {\n const item = selector !== undefined ? selector(this[i], i) : this[i];\n if (typeof item !== \"number\") {\n throw new ArgumentError(\"sum \uC740 number \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\", { type: typeof item });\n }\n result += item;\n }\n\n return result;\n },\n\n min<T>(selector?: (item: T, index: number) => string | number): string | number | undefined {\n let result: string | number | undefined;\n for (let i = 0; i < this.length; i++) {\n const item = selector !== undefined ? selector(this[i], i) : this[i];\n if (typeof item !== \"number\" && typeof item !== \"string\") {\n throw new ArgumentError(\"min \uC740 number/string \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\", { type: typeof item });\n }\n if (result === undefined || result > item) {\n result = item;\n }\n }\n\n return result;\n },\n\n max<T>(selector?: (item: T, index: number) => string | number): string | number | undefined {\n let result: string | number | undefined;\n for (let i = 0; i < this.length; i++) {\n const item = selector !== undefined ? selector(this[i], i) : this[i];\n if (typeof item !== \"number\" && typeof item !== \"string\") {\n throw new ArgumentError(\"max \uC740 number/string \uC5D0 \uB300\uD574\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\", { type: typeof item });\n }\n if (result === undefined || result < item) {\n result = item;\n }\n }\n\n return result;\n },\n\n shuffle<T>(): T[] {\n if (this.length <= 1) {\n return [...this];\n }\n\n const result = [...this];\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n return result;\n },\n};\n\nconst arrayMutableExtensions: MutableArrayExt<any> & ThisType<any[]> = {\n distinctThis<T>(options?: boolean | { matchAddress?: boolean; keyFn?: (item: T) => string | number }): T[] {\n // \uC635\uC158 \uC815\uADDC\uD654\n const opts = typeof options === \"boolean\" ? { matchAddress: options } : (options ?? {});\n\n // matchAddress: Set \uAE30\uBC18 O(n)\n // \uCCAB \uBC88\uC9F8 \uB4F1\uC7A5\uD55C \uC694\uC18C\uB97C \uC720\uC9C0\uD558\uAE30 \uC704\uD574 \uC815\uBC29\uD5A5 \uC21C\uD68C \uD6C4 \uC81C\uAC70\uD560 \uC778\uB371\uC2A4 \uC218\uC9D1\n if (opts.matchAddress === true) {\n const seen = new Set<T>();\n const toRemove: number[] = [];\n for (let i = 0; i < this.length; i++) {\n if (seen.has(this[i])) {\n toRemove.push(i);\n } else {\n seen.add(this[i]);\n }\n }\n // \uC5ED\uC21C\uC73C\uB85C \uC81C\uAC70 (\uC778\uB371\uC2A4 \uBCC0\uD654 \uBC29\uC9C0)\n for (let i = toRemove.length - 1; i >= 0; i--) {\n this.splice(toRemove[i], 1);\n }\n return this;\n }\n\n // keyFn \uC81C\uACF5 \uC2DC: \uCEE4\uC2A4\uD140 \uD0A4 \uAE30\uBC18 O(n)\n // \uCCAB \uBC88\uC9F8 \uB4F1\uC7A5\uD55C \uC694\uC18C\uB97C \uC720\uC9C0\uD558\uAE30 \uC704\uD574 \uC815\uBC29\uD5A5 \uC21C\uD68C \uD6C4 \uC81C\uAC70\uD560 \uC778\uB371\uC2A4 \uC218\uC9D1\n if (opts.keyFn) {\n const seen = new Set<string | number>();\n const toRemove: number[] = [];\n for (let i = 0; i < this.length; i++) {\n const key = opts.keyFn(this[i]);\n if (seen.has(key)) {\n toRemove.push(i);\n } else {\n seen.add(key);\n }\n }\n // \uC5ED\uC21C\uC73C\uB85C \uC81C\uAC70 (\uC778\uB371\uC2A4 \uBCC0\uD654 \uBC29\uC9C0)\n for (let i = toRemove.length - 1; i >= 0; i--) {\n this.splice(toRemove[i], 1);\n }\n return this;\n }\n\n // \uAE30\uBCF8: \uD0C0\uC785\uBCC4 \uCC98\uB9AC (primitive \uCD5C\uC801\uD654)\n const seen = new Map<string, T>();\n const seenRefs = new Set<symbol | ((...args: unknown[]) => unknown)>();\n const toRemoveSet = new Set<number>();\n\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n\n // primitive \uD0C0\uC785\uC740 \uBE60\uB978 \uACBD\uB85C O(n)\n if (item === null || typeof item !== \"object\") {\n const type = typeof item;\n\n // symbol, function\uC740 Set\uC73C\uB85C identity \uBE44\uAD50\n if (type === \"symbol\" || type === \"function\") {\n if (seenRefs.has(item)) {\n toRemoveSet.add(i);\n } else {\n seenRefs.add(item);\n }\n continue;\n }\n\n // \uB098\uBA38\uC9C0 primitive\uB294 \uD0C0\uC785 prefix + \uD2B9\uC218 \uCF00\uC774\uC2A4 \uCC98\uB9AC\n let key = type + \":\";\n if (Object.is(item, -0)) {\n key += \"-0\";\n } else {\n key += String(item);\n }\n\n if (seen.has(key)) {\n toRemoveSet.add(i);\n } else {\n seen.set(key, item);\n }\n continue;\n }\n\n // \uAC1D\uCCB4\uB294 \uAE4A\uC740 \uBE44\uAD50 O(n\u00B2) - \uC81C\uAC70\uB418\uC9C0 \uC54A\uC740 \uC774\uC804 \uD56D\uBAA9\uB4E4\uACFC \uBE44\uAD50\n let hasDuplicateBefore = false;\n for (let j = 0; j < i; j++) {\n // toRemoveSet\uC5D0 \uC788\uB294 \uC778\uB371\uC2A4\uB294 \uAC74\uB108\uB700 (O(1) \uC870\uD68C)\n if (toRemoveSet.has(j)) continue;\n if (objEqual(this[j], item)) {\n hasDuplicateBefore = true;\n break;\n }\n }\n if (hasDuplicateBefore) {\n toRemoveSet.add(i);\n }\n }\n\n // \uC5ED\uC21C\uC73C\uB85C \uC81C\uAC70 (\uC778\uB371\uC2A4 \uBCC0\uD654 \uBC29\uC9C0)\n const toRemoveArr = Array.from(toRemoveSet).sort((a, b) => b - a);\n for (const idx of toRemoveArr) {\n this.splice(idx, 1);\n }\n\n return this;\n },\n\n orderByThis<T>(selector?: (item: T) => string | number | DateTime | DateOnly | Time | undefined): T[] {\n return this.sort((p, n) => {\n const pp = selector?.(p) ?? p;\n const pn = selector?.(n) ?? n;\n return compareForOrder(pp, pn, false);\n });\n },\n\n orderByDescThis<T>(selector?: (item: T) => string | number | DateTime | DateOnly | Time | undefined): T[] {\n return this.sort((p, n) => {\n const pp = selector?.(p) ?? p;\n const pn = selector?.(n) ?? n;\n return compareForOrder(pp, pn, true);\n });\n },\n\n insert<T>(index: number, ...items: T[]): T[] {\n this.splice(index, 0, ...items);\n return this;\n },\n\n remove<T>(itemOrSelector: T | ((item: T, index: number) => boolean)): T[] {\n const shouldRemove =\n typeof itemOrSelector === \"function\"\n ? (itemOrSelector as (item: T, index: number) => boolean)\n : (item: T) => item === itemOrSelector;\n\n // \uC5ED\uBC29\uD5A5 \uC21C\uD68C\uB85C \uC778\uB371\uC2A4 \uBCC0\uACBD \uBB38\uC81C \uBC29\uC9C0 (O(n) \uC131\uB2A5)\n for (let i = this.length - 1; i >= 0; i--) {\n if (shouldRemove(this[i], i)) {\n this.splice(i, 1);\n }\n }\n\n return this;\n },\n\n toggle<T>(this: T[], item: T): T[] {\n if (this.includes(item)) {\n this.remove(item);\n } else {\n this.push(item);\n }\n return this;\n },\n\n clear<T>(this: T[]): T[] {\n return this.remove(() => true);\n },\n};\n\nfor (const [name, fn] of Object.entries({\n ...arrayReadonlyExtensions,\n ...arrayMutableExtensions,\n})) {\n Object.defineProperty(Array.prototype, name, {\n value: fn,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n}\n\n//#endregion\n\n//#region \uD0C0\uC785 \uC120\uC5B8\n\ndeclare global {\n interface ReadonlyArray<T> extends ReadonlyArrayExt<T> {}\n interface Array<T> extends ReadonlyArrayExt<T>, MutableArrayExt<T> {}\n}\n\n//#endregion\n\nexport type { ArrayDiffsResult, ArrayDiffs2Result, TreeArray, ComparableType } from \"./arr-ext.types\";\n"],
5
+ "mappings": "AAMA,OAAO;AACP,SAAS,UAAU,UAAU,gBAAgB;AAE7C,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAWhC,MAAM,0BAAmE;AAAA,EACvE,OAAU,WAAgE;AACxE,UAAM,MAAM,cAAc,SAAY,KAAK,OAAO,SAAS,IAAI;AAC/D,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,IAAI,cAAc,yEAAkB,EAAE,OAAO,IAAI,OAAO,CAAC;AAAA,IACjE;AACA,WAAO,IAAI,CAAC;AAAA,EACd;AAAA,EAEA,MAAS,WAAgE;AACvE,WAAO,cAAc,SAAY,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,YAAe,WAAuE;AAC1F,UAAM,MAAW,CAAC;AAClB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAI,MAAM,UAAU,KAAK,CAAC,GAAG,CAAC,GAAG;AAC/B,YAAI,KAAK,KAAK,CAAC,CAAC;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,KAAQ,WAAgE;AACtE,QAAI,cAAc,QAAW;AAC3B,eAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,YAAI,UAAU,KAAK,CAAC,GAAG,CAAC,GAAG;AACzB,iBAAO,KAAK,CAAC;AAAA,QACf;AAAA,MACF;AAEA,aAAO;AAAA,IACT,OAAO;AACL,aAAO,KAAK,KAAK,SAAS,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,eAAoC;AAClC,WAAO,KAAK,OAAO,CAAC,SAAS,QAAQ,IAAI;AAAA,EAC3C;AAAA,EAEA,OAAuB,MAAuC;AAE5D,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,KAAK,OAAO,CAAC,SAAS;AAC3B,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH,mBAAO,OAAO,SAAS;AAAA,UACzB,KAAK;AACH,mBAAO,OAAO,SAAS;AAAA,UACzB,KAAK;AACH,mBAAO,OAAO,SAAS;AAAA,UACzB,KAAK;AACH,mBAAO,gBAAgB;AAAA,UACzB,KAAK;AACH,mBAAO,gBAAgB;AAAA,UACzB,KAAK;AACH,mBAAO,gBAAgB;AAAA,UACzB,KAAK;AACH,mBAAO,gBAAgB;AAAA,UACzB,KAAK;AACH,mBAAO,gBAAgB;AAAA,UACzB,SAAS;AAEP,kBAAM,cAAqB;AAC3B,kBAAM,IAAI,cAAc,uDAAe,WAAW,EAAE;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,OAAO,CAAC,SAAS,gBAAgB,SAAQ,6BAAM,iBAAgB,IAAI;AAAA,EACjF;AAAA,EAEA,MAAM,SAAe,UAAgE;AACnF,UAAM,SAAc,CAAC;AACrB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,aAAO,KAAK,MAAM,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc,UAAqD;AACjE,UAAM,MAAM,WAAW,KAAK,IAAI,QAAQ,IAAI;AAC5C,WAAO,IAAI,KAAK,EAAE,aAAa;AAAA,EACjC;AAAA,EAEA,MAAM,aAAmB,UAAuE;AAC9F,UAAM,MAAM,aAAa,SAAY,MAAM,KAAK,SAAS,QAAQ,IAAI;AACrE,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EAEA,cAAoB,IAA0D;AAC5E,WAAO,QAAQ,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QACE,aACA,eAIE;AACF,UAAM,SAA0C,CAAC;AAGjD,UAAM,oBAAoB,oBAAI,IAAoB;AAElD,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,SAAS,YAAY,KAAK,CAAC,GAAG,CAAC;AACrC,YAAM,WAAW,kBAAkB,SAAY,cAAc,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AAGjF,UAAI,UAAU,QAAQ,OAAO,WAAW,UAAU;AAChD,cAAM,SAAS,OAAO,SAAS,MAAM,OAAO,MAAM;AAClD,cAAM,gBAAgB,kBAAkB,IAAI,MAAM;AAClD,YAAI,kBAAkB,QAAW;AAC/B,iBAAO,aAAa,EAAE,OAAO,KAAK,QAAQ;AAAA,QAC5C,OAAO;AACL,4BAAkB,IAAI,QAAQ,OAAO,MAAM;AAC3C,iBAAO,KAAK,EAAE,KAAK,QAAQ,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAAA,QACjD;AACA;AAAA,MACF;AAGA,YAAM,eAAe,OAAO,KAAK,CAAC,SAAS,SAAS,KAAK,KAAK,MAAM,CAAC;AACrE,UAAI,iBAAiB,QAAW;AAC9B,qBAAa,OAAO,KAAK,QAAQ;AAAA,MACnC,OAAO;AACL,eAAO,KAAK,EAAE,KAAK,QAAQ,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MACE,aACA,eACe;AACf,UAAM,SAAS,oBAAI,IAAc;AAEjC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,SAAS,YAAY,MAAM,CAAC;AAClC,YAAM,WAAW,kBAAkB,SAAY,cAAc,MAAM,CAAC,IAAI;AAExE,UAAI,OAAO,IAAI,MAAM,GAAG;AACtB,cAAM,IAAI,cAAc,4DAAe,EAAE,eAAe,OAAO,CAAC;AAAA,MAClE;AACA,aAAO,IAAI,QAAQ,QAAQ;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,aACA,eACwB;AACxB,UAAM,SAAS,oBAAI,IAAc;AAEjC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,SAAS,MAAM,YAAY,MAAM,CAAC;AACxC,YAAM,WAAW,kBAAkB,SAAY,MAAM,cAAc,MAAM,CAAC,IAAI;AAE9E,UAAI,OAAO,IAAI,MAAM,GAAG;AACtB,cAAM,IAAI,cAAc,4DAAe,EAAE,eAAe,OAAO,CAAC;AAAA,MAClE;AACA,aAAO,IAAI,QAAQ,QAAQ;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WACE,aACA,eACmB;AACnB,UAAM,SAAS,oBAAI,IAAkB;AAErC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,SAAS,YAAY,MAAM,CAAC;AAClC,YAAM,WAAW,kBAAkB,SAAY,cAAc,MAAM,CAAC,IAAI;AAExE,YAAM,MAAM,OAAO,YAAY,QAAQ,CAAC,CAAC;AACzC,UAAI,KAAK,QAAQ;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,aACA,eACoB;AACpB,UAAM,SAAS,oBAAI,IAAmB;AAEtC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,SAAS,YAAY,MAAM,CAAC;AAClC,YAAM,WAAW,kBAAkB,SAAY,cAAc,MAAM,CAAC,IAAI;AAExE,YAAM,MAAM,OAAO,YAAY,QAAQ,oBAAI,IAAW,CAAC;AACvD,UAAI,IAAI,QAAQ;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAqB,aAA4C,eAAiD;AAChH,UAAM,WAAW,oBAAI,IAAY;AAEjC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,SAAS,YAAY,MAAM,CAAC;AAElC,YAAM,MAAM,SAAS,YAAY,QAAQ,CAAC,CAAC;AAC3C,UAAI,KAAK,IAAI;AAAA,IACf;AAEA,UAAM,SAAS,oBAAI,IAAc;AAEjC,eAAW,OAAO,SAAS,KAAK,GAAG;AACjC,aAAO,IAAI,KAAK,cAAc,SAAS,IAAI,GAAG,CAAE,CAAC;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,aACA,eACuB;AACvB,UAAM,SAAgC,CAAC;AAEvC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAEnB,YAAM,MAAM,YAAY,MAAM,CAAC;AAC/B,YAAM,WAAW,kBAAkB,SAAY,cAAc,MAAM,CAAC,IAAI;AAGxE,UAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,cAAM,IAAI,cAAc,4DAAe,EAAE,eAAe,IAAI,CAAC;AAAA,MAC/D;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAgD,KAAQ,WAA8B;AAEpF,UAAM,cAAc,KAAK,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC;AAE7D,UAAM,KAAK,CAAC,UAA+B;AACzC,aAAO,MAAM,IAAI,CAAC,UAAU;AAAA,QAC1B,GAAG,SAAS,IAAI;AAAA,QAChB,UAAU,GAAG,YAAY,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,MAC/C,EAAE;AAAA,IACJ;AAEA,UAAM,YAAY,KAAK,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,IAAI;AACjE,WAAO,GAAG,SAAS;AAAA,EACrB;AAAA,EAEA,SAAY,SAA2F;AAErG,UAAM,OAAO,OAAO,YAAY,YAAY,EAAE,cAAc,QAAQ,IAAK,WAAW,CAAC;AAGrF,QAAI,KAAK,iBAAiB,KAAM,QAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAGxD,QAAI,KAAK,OAAO;AACd,YAAMA,QAAO,oBAAI,IAAqB;AACtC,YAAMC,UAAc,CAAC;AACrB,iBAAW,QAAQ,MAAM;AACvB,cAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,YAAI,CAACD,MAAK,IAAI,GAAG,GAAG;AAClB,UAAAA,MAAK,IAAI,GAAG;AACZ,UAAAC,QAAO,KAAK,IAAI;AAAA,QAClB;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAGA,UAAM,OAAO,oBAAI,IAAe;AAChC,UAAM,WAAW,oBAAI,IAAgD;AACrE,UAAM,SAAc,CAAC;AAErB,eAAW,QAAQ,MAAM;AAEvB,UAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,cAAM,OAAO,OAAO;AAGpB,YAAI,SAAS,YAAY,SAAS,YAAY;AAC5C,cAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACvB,qBAAS,IAAI,IAAI;AACjB,mBAAO,KAAK,IAAI;AAAA,UAClB;AACA;AAAA,QACF;AAGA,YAAI,MAAM,OAAO;AACjB,YAAI,OAAO,GAAG,MAAM,EAAE,GAAG;AACvB,iBAAO;AAAA,QACT,OAAO;AACL,iBAAO,OAAO,IAAI;AAAA,QACpB;AAEA,YAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,eAAK,IAAI,KAAK,IAAI;AAClB,iBAAO,KAAK,IAAI;AAAA,QAClB;AACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,KAAK,CAAC,UAAU,SAAS,OAAO,IAAI,CAAC,GAAG;AAClD,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAW,UAAuF;AAChG,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,YAAM,KAAK,YAAY,OAAO,IAAI,SAAS,CAAC;AAC5C,YAAM,KAAK,YAAY,OAAO,IAAI,SAAS,CAAC;AAC5C,aAAO,gBAAgB,IAAI,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,YAAe,UAAuF;AACpG,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,YAAM,KAAK,YAAY,OAAO,IAAI,SAAS,CAAC;AAC5C,YAAM,KAAK,YAAY,OAAO,IAAI,SAAS,CAAC;AAC5C,aAAO,gBAAgB,IAAI,IAAI,IAAI;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MACE,QACA,SAI0B;AAC1B,UAAM,SAAmC,CAAC;AAE1C,UAAM,kBAAkB,CAAC,GAAG,MAAM;AAClC,UAAM,qBAAqB,IAAI,IAAI,eAAe;AAClD,UAAM,WAAU,mCAAS,UAAS,UAAa,QAAQ,KAAK,SAAS;AACrE,UAAM,cAAc,EAAE,kBAAkB,mCAAS,SAAS;AAI1D,UAAM,mBAAmB,UAAU,oBAAI,IAAiB,IAAI;AAE5D,QAAI,kBAAkB;AACpB,iBAAW,cAAc,iBAAiB;AACxC,cAAM,SAAS,KAAK,UAAU,QAAS,KAAM,IAAI,CAAC,MAAO,WAAuC,CAAC,CAAC,CAAC;AACnG,cAAM,MAAM,iBAAiB,IAAI,MAAM;AACvC,YAAI,KAAK;AACP,cAAI,KAAK,UAAU;AAAA,QACrB,OAAO;AACL,2BAAiB,IAAI,QAAQ,CAAC,UAAU,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,eAAW,cAAc,MAAM;AAE7B,UAAI;AACJ,UAAI;AAGJ,iBAAW,cAAc,iBAAiB;AACxC,YAAI,CAAC,mBAAmB,IAAI,UAAU,EAAG;AACzC,YAAI,SAAS,YAAY,YAAY,WAAW,GAAG;AACjD,uBAAa;AACb;AAAA,QACF;AAAA,MACF;AAGA,UAAI,eAAe,UAAa,kBAAkB;AAChD,cAAM,eAAe,KAAK,UAAU,QAAS,KAAM,IAAI,CAAC,MAAO,WAAuC,CAAC,CAAC,CAAC;AACzG,cAAM,aAAa,iBAAiB,IAAI,YAAY;AACpD,YAAI,cAAc,WAAW,SAAS,GAAG;AAEvC,0BAAgB,WAAW,KAAK,CAAC,MAAM,mBAAmB,IAAI,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AAEA,UAAI,eAAe,QAAW;AAC5B,2BAAmB,OAAO,UAAU;AAAA,MACtC,WAAW,kBAAkB,QAAW;AACtC,eAAO,KAAK,EAAE,QAAQ,YAAY,QAAQ,cAAc,CAAC;AACzD,2BAAmB,OAAO,aAAa;AAAA,MACzC,OAAO;AACL,eAAO,KAAK,EAAE,QAAQ,YAAY,QAAQ,OAAU,CAAC;AAAA,MACvD;AAAA,IACF;AAEA,eAAW,uBAAuB,oBAAoB;AACpD,aAAO,KAAK,EAAE,QAAQ,QAAW,QAAQ,oBAAoB,CAAC;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YACE,UACA,iBACA,SAKwB;AACxB,UAAM,aACJ,oBAAoB,MAChB,WACA,SAAS;AAAA,MAAM,CAAC,YACd,OAAO,oBAAoB,aAAa,gBAAgB,OAAO,IAAI,QAAQ,eAAe;AAAA,IAC5F;AACN,UAAM,eAAc,mCAAS,gBAAe;AAE5C,UAAM,QAAgC,CAAC;AACvC,eAAW,QAAQ,MAAM;AACvB,YAAM,WAAW,OAAO,oBAAoB,aAAa,gBAAgB,IAAI,IAAI,KAAK,eAAe;AACrG,UAAI,YAAY,MAAM;AACpB,cAAM,KAAK,EAAE,MAAM,UAAU,MAAM,SAAS,OAAU,CAAC;AACvD;AAAA,MACF;AAEA,YAAM,UAAU,WAAW,IAAI,QAAQ;AACvC,UAAI,CAAC,SAAS;AACZ,cAAM,KAAK,EAAE,MAAM,UAAU,MAAM,SAAS,OAAU,CAAC;AACvD;AAAA,MACF;AAEA,UACE,SAAS,SAAS,MAAM;AAAA,QACtB,kBAAkB,mCAAS;AAAA,QAC3B,kBAAkB,mCAAS;AAAA,MAC7B,CAAC,GACD;AACA,YAAI,aAAa;AACf,gBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAC5C;AACA;AAAA,MACF;AAEA,YAAM,KAAK,EAAE,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MACE,QACA,SAIqB;AACrB,UAAM,QAAQ,KAAK,MAAM,QAAQ,OAAO;AAExC,UAAM,SAA8B,SAAS,IAAI;AAGjD,UAAM,iBAAiB,oBAAI,IAAe;AAC1C,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,qBAAe,IAAI,KAAK,CAAC,GAAG,CAAC;AAAA,IAC/B;AAEA,eAAW,QAAQ,OAAO;AAExB,UAAI,KAAK,WAAW,UAAa,KAAK,WAAW,QAAW;AAC1D,cAAM,cAAc,eAAe,IAAI,KAAK,MAAM;AAClD,YAAI,gBAAgB,QAAW;AAC7B,gBAAM,IAAI,QAAQ,yIAA0C;AAAA,QAC9D;AACA,eAAO,WAAW,IAAI,SAAS,KAAK,QAAQ,KAAK,MAAM;AAAA,MACzD,WAES,KAAK,WAAW,QAAW;AAClC,eAAO,KAAK,KAAK,MAAM;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAO,UAAuD;AAC5D,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,aAAa,SAAY,SAAS,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACnE,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,IAAI,cAAc,yGAAmC,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,MAClF;AACA,gBAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAO,UAAqF;AAC1F,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,aAAa,SAAY,SAAS,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACnE,UAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,cAAM,IAAI,cAAc,gHAA0C,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,MACzF;AACA,UAAI,WAAW,UAAa,SAAS,MAAM;AACzC,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAO,UAAqF;AAC1F,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,aAAa,SAAY,SAAS,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACnE,UAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,cAAM,IAAI,cAAc,gHAA0C,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,MACzF;AACA,UAAI,WAAW,UAAa,SAAS,MAAM;AACzC,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,UAAkB;AAChB,QAAI,KAAK,UAAU,GAAG;AACpB,aAAO,CAAC,GAAG,IAAI;AAAA,IACjB;AAEA,UAAM,SAAS,CAAC,GAAG,IAAI;AACvB,aAAS,IAAI,OAAO,SAAS,GAAG,IAAI,GAAG,KAAK;AAC1C,YAAM,IAAI,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE;AAC5C,OAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AACF;AAEA,MAAM,yBAAiE;AAAA,EACrE,aAAgB,SAA2F;AAEzG,UAAM,OAAO,OAAO,YAAY,YAAY,EAAE,cAAc,QAAQ,IAAK,WAAW,CAAC;AAIrF,QAAI,KAAK,iBAAiB,MAAM;AAC9B,YAAMD,QAAO,oBAAI,IAAO;AACxB,YAAM,WAAqB,CAAC;AAC5B,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAIA,MAAK,IAAI,KAAK,CAAC,CAAC,GAAG;AACrB,mBAAS,KAAK,CAAC;AAAA,QACjB,OAAO;AACL,UAAAA,MAAK,IAAI,KAAK,CAAC,CAAC;AAAA,QAClB;AAAA,MACF;AAEA,eAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,aAAK,OAAO,SAAS,CAAC,GAAG,CAAC;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAIA,QAAI,KAAK,OAAO;AACd,YAAMA,QAAO,oBAAI,IAAqB;AACtC,YAAM,WAAqB,CAAC;AAC5B,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,MAAM,KAAK,CAAC,CAAC;AAC9B,YAAIA,MAAK,IAAI,GAAG,GAAG;AACjB,mBAAS,KAAK,CAAC;AAAA,QACjB,OAAO;AACL,UAAAA,MAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AAEA,eAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,aAAK,OAAO,SAAS,CAAC,GAAG,CAAC;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAGA,UAAM,OAAO,oBAAI,IAAe;AAChC,UAAM,WAAW,oBAAI,IAAgD;AACrE,UAAM,cAAc,oBAAI,IAAY;AAEpC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AAGnB,UAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,cAAM,OAAO,OAAO;AAGpB,YAAI,SAAS,YAAY,SAAS,YAAY;AAC5C,cAAI,SAAS,IAAI,IAAI,GAAG;AACtB,wBAAY,IAAI,CAAC;AAAA,UACnB,OAAO;AACL,qBAAS,IAAI,IAAI;AAAA,UACnB;AACA;AAAA,QACF;AAGA,YAAI,MAAM,OAAO;AACjB,YAAI,OAAO,GAAG,MAAM,EAAE,GAAG;AACvB,iBAAO;AAAA,QACT,OAAO;AACL,iBAAO,OAAO,IAAI;AAAA,QACpB;AAEA,YAAI,KAAK,IAAI,GAAG,GAAG;AACjB,sBAAY,IAAI,CAAC;AAAA,QACnB,OAAO;AACL,eAAK,IAAI,KAAK,IAAI;AAAA,QACpB;AACA;AAAA,MACF;AAGA,UAAI,qBAAqB;AACzB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAE1B,YAAI,YAAY,IAAI,CAAC,EAAG;AACxB,YAAI,SAAS,KAAK,CAAC,GAAG,IAAI,GAAG;AAC3B,+BAAqB;AACrB;AAAA,QACF;AAAA,MACF;AACA,UAAI,oBAAoB;AACtB,oBAAY,IAAI,CAAC;AAAA,MACnB;AAAA,IACF;AAGA,UAAM,cAAc,MAAM,KAAK,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAChE,eAAW,OAAO,aAAa;AAC7B,WAAK,OAAO,KAAK,CAAC;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAe,UAAuF;AACpG,WAAO,KAAK,KAAK,CAAC,GAAG,MAAM;AACzB,YAAM,MAAK,qCAAW,OAAM;AAC5B,YAAM,MAAK,qCAAW,OAAM;AAC5B,aAAO,gBAAgB,IAAI,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,gBAAmB,UAAuF;AACxG,WAAO,KAAK,KAAK,CAAC,GAAG,MAAM;AACzB,YAAM,MAAK,qCAAW,OAAM;AAC5B,YAAM,MAAK,qCAAW,OAAM;AAC5B,aAAO,gBAAgB,IAAI,IAAI,IAAI;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAU,UAAkB,OAAiB;AAC3C,SAAK,OAAO,OAAO,GAAG,GAAG,KAAK;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,OAAU,gBAAgE;AACxE,UAAM,eACJ,OAAO,mBAAmB,aACrB,iBACD,CAAC,SAAY,SAAS;AAG5B,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,UAAI,aAAa,KAAK,CAAC,GAAG,CAAC,GAAG;AAC5B,aAAK,OAAO,GAAG,CAAC;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAqB,MAAc;AACjC,QAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAK,OAAO,IAAI;AAAA,IAClB,OAAO;AACL,WAAK,KAAK,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAyB;AACvB,WAAO,KAAK,OAAO,MAAM,IAAI;AAAA,EAC/B;AACF;AAEA,WAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AACL,CAAC,GAAG;AACF,SAAO,eAAe,MAAM,WAAW,MAAM;AAAA,IAC3C,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AACH;",
6
+ "names": ["seen", "result"]
7
+ }