jc-structure 0.1.22 → 0.2.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.
@@ -1,4 +1,4 @@
1
- class H {
1
+ class D {
2
2
  items = {};
3
3
  count = 0;
4
4
  lowestCount = 0;
@@ -49,7 +49,7 @@ class H {
49
49
  return this.isEmpty() ? "" : `Queue(size: ${this.size()}):[${this.items[this.lowestCount]},...rest]`;
50
50
  }
51
51
  }
52
- class D {
52
+ class U {
53
53
  items = {};
54
54
  count = 0;
55
55
  constructor() {
@@ -100,7 +100,7 @@ class D {
100
100
  return this.isEmpty() ? "" : `Stack(count: ${this.count}):[${this.items[this.count - 1]},...rest]`;
101
101
  }
102
102
  }
103
- class U {
103
+ class q {
104
104
  stack = [];
105
105
  minStack = [];
106
106
  push(t) {
@@ -129,13 +129,13 @@ class U {
129
129
  return this.isEmpty() ? "" : `MinStack(count: ${this.size()}):[${this.getMin()},...rest]`;
130
130
  }
131
131
  }
132
- function k(h, t) {
133
- return h === t ? 0 : h < t ? -1 : 1;
132
+ function N(o, t) {
133
+ return o === t ? 0 : o < t ? -1 : 1;
134
134
  }
135
135
  class E {
136
136
  heap = [];
137
137
  compareFn;
138
- constructor(t = k) {
138
+ constructor(t = N) {
139
139
  this.compareFn = t;
140
140
  }
141
141
  static getLeftIndex(t) {
@@ -166,7 +166,7 @@ class E {
166
166
  return this.heap.toString();
167
167
  }
168
168
  }
169
- class L extends E {
169
+ class z extends E {
170
170
  insert(t) {
171
171
  return t ? !1 : (this.heap.push(t), this.siftUp(this.heap.length - 1), !0);
172
172
  }
@@ -186,15 +186,15 @@ class L extends E {
186
186
  E.swap(this.heap, e, t), t = e, e = E.getParentIndex(t);
187
187
  }
188
188
  }
189
- class q extends L {
190
- constructor(t = (e, s) => k(s, e)) {
189
+ class F extends z {
190
+ constructor(t = (e, s) => N(s, e)) {
191
191
  super(t);
192
192
  }
193
193
  }
194
- function z(h) {
195
- return { value: h };
194
+ function $(o) {
195
+ return { value: o };
196
196
  }
197
- class F {
197
+ class T {
198
198
  capacity;
199
199
  length = 0;
200
200
  head = null;
@@ -224,14 +224,14 @@ class F {
224
224
  }
225
225
  update(t, e) {
226
226
  let s = this.lookup.get(t);
227
- s ? (this.detach(s), this.prepend(s), s.value = e) : (s = z(e), this.length++, this.prepend(s), this.trimCache(), this.lookup.set(t, s), this.reverseLookup);
227
+ s ? (this.detach(s), this.prepend(s), s.value = e) : (s = $(e), this.length++, this.prepend(s), this.trimCache(), this.lookup.set(t, s), this.reverseLookup);
228
228
  }
229
229
  }
230
- class O {
230
+ class R {
231
231
  value;
232
232
  next = void 0;
233
233
  }
234
- class T {
234
+ class B {
235
235
  count = 0;
236
236
  head = void 0;
237
237
  constructor() {
@@ -264,7 +264,7 @@ class T {
264
264
  return this.getElementAt(t)?.value;
265
265
  }
266
266
  insert(t, e) {
267
- let s = new O();
267
+ let s = new R();
268
268
  if (s.value = t, e > this.count || e < 0)
269
269
  throw new Error("index error");
270
270
  this.count++;
@@ -276,7 +276,7 @@ class T {
276
276
  r = this.getElementAt(e - 1), i = r.next, r.next = s, s.next = i;
277
277
  }
278
278
  push(t) {
279
- let e = new O();
279
+ let e = new R();
280
280
  if (e.value = t, this.count++, this.isEmpty()) {
281
281
  this.head = e;
282
282
  return;
@@ -310,17 +310,17 @@ class T {
310
310
  return t = t.slice(0, -1), t;
311
311
  }
312
312
  }
313
- class $ {
313
+ class V {
314
314
  key;
315
315
  value;
316
316
  constructor(t, e) {
317
317
  this.key = t, this.value = e;
318
318
  }
319
319
  }
320
- function b(h, t = { emptyString: !1, zeroNumber: !1 }) {
321
- return h == null ? !(t.emptyString && h === "" || t.zeroNumber && h === 0) : !1;
320
+ function b(o, t = { emptyString: !1, zeroNumber: !1 }) {
321
+ return o == null ? !(t.emptyString && o === "" || t.zeroNumber && o === 0) : !1;
322
322
  }
323
- class V {
323
+ class H {
324
324
  table = [];
325
325
  constructor() {
326
326
  }
@@ -339,7 +339,7 @@ class V {
339
339
  let s = this.getItemIndex(t);
340
340
  this.table[s].value = e;
341
341
  } else {
342
- const s = new $(t, e);
342
+ const s = new V(t, e);
343
343
  this.table.push(s);
344
344
  }
345
345
  }
@@ -390,12 +390,12 @@ class V {
390
390
  return t = t.slice(0, -1), t;
391
391
  }
392
392
  }
393
- class B {
393
+ class G {
394
394
  isDirected;
395
395
  vertices;
396
396
  adjList;
397
397
  constructor(t = !1) {
398
- this.isDirected = t, this.vertices = [], this.adjList = new V();
398
+ this.isDirected = t, this.vertices = [], this.adjList = new H();
399
399
  }
400
400
  addVertex(t) {
401
401
  this.vertices.includes(t) || (this.vertices.push(t), this.adjList.set(t, []));
@@ -586,12 +586,12 @@ class g {
586
586
  }
587
587
  static getIntersection(t, e, s = g.EPSILON) {
588
588
  if (g.isParallel(t, e)) return null;
589
- const r = t.p1.x, i = t.p1.y, n = t.p2.x, a = t.p2.y, o = e.p1.x, d = e.p1.y, f = e.p2.x, c = e.p2.y, l = (r - n) * (d - c) - (i - a) * (o - f);
589
+ const r = t.p1.x, i = t.p1.y, n = t.p2.x, a = t.p2.y, h = e.p1.x, d = e.p1.y, f = e.p2.x, c = e.p2.y, l = (r - n) * (d - c) - (i - a) * (h - f);
590
590
  if (Math.abs(l) < s) return null;
591
- const m = ((r - o) * (d - c) - (i - d) * (o - f)) / l, A = -((r - n) * (i - d) - (i - a) * (r - o)) / l;
592
- if (m >= 0 && m <= 1 && A >= 0 && A <= 1) {
593
- const N = r + m * (n - r), C = i + m * (a - i);
594
- return new u(N, C);
591
+ const m = ((r - h) * (d - c) - (i - d) * (h - f)) / l, v = -((r - n) * (i - d) - (i - a) * (r - h)) / l;
592
+ if (m >= 0 && m <= 1 && v >= 0 && v <= 1) {
593
+ const C = r + m * (n - r), L = i + m * (a - i);
594
+ return new u(C, L);
595
595
  }
596
596
  return null;
597
597
  }
@@ -599,13 +599,13 @@ class g {
599
599
  return g.getIntersection(t, e) !== null;
600
600
  }
601
601
  static distanceToPoint(t, e, s = g.EPSILON) {
602
- const r = e.x - t.p1.x, i = e.y - t.p1.y, n = t.p2.x - t.p1.x, a = t.p2.y - t.p1.y, o = r * n + i * a, d = n * n + a * a;
602
+ const r = e.x - t.p1.x, i = e.y - t.p1.y, n = t.p2.x - t.p1.x, a = t.p2.y - t.p1.y, h = r * n + i * a, d = n * n + a * a;
603
603
  let f = -1;
604
- d > s && (f = o / d);
604
+ d > s && (f = h / d);
605
605
  let c, l;
606
606
  f < 0 ? (c = t.p1.x, l = t.p1.y) : f > 1 ? (c = t.p2.x, l = t.p2.y) : (c = t.p1.x + f * n, l = t.p1.y + f * a);
607
- const m = e.x - c, A = e.y - l;
608
- return Math.hypot(m + A);
607
+ const m = e.x - c, v = e.y - l;
608
+ return Math.hypot(m + v);
609
609
  }
610
610
  p1;
611
611
  p2;
@@ -640,14 +640,14 @@ class g {
640
640
  return this.p2;
641
641
  }
642
642
  }
643
- class R {
643
+ class P {
644
644
  static EPSILON = 1e-10;
645
645
  name;
646
646
  constructor(t) {
647
647
  this.name = t;
648
648
  }
649
649
  }
650
- class p extends R {
650
+ class p extends P {
651
651
  static isValid(t, e, s) {
652
652
  return t <= 0 || e <= 0 || s <= 0 ? !1 : t + e > s && t + s > e && e + s > t;
653
653
  }
@@ -660,7 +660,7 @@ class p extends R {
660
660
  static getType(t, e, s) {
661
661
  if (!p.isValid(t, e, s))
662
662
  throw new Error("Invalid triangle sides");
663
- const r = [t, e, s].sort((o, d) => o - d), [i, n, a] = r;
663
+ const r = [t, e, s].sort((h, d) => h - d), [i, n, a] = r;
664
664
  return Math.abs(i - n) < p.EPSILON && Math.abs(n - a) < p.EPSILON ? "equilateral" : Math.abs(i - n) < p.EPSILON || Math.abs(n - a) < p.EPSILON ? "isosceles" : "scalene";
665
665
  }
666
666
  static getAngles(t, e, s) {
@@ -680,7 +680,7 @@ class p extends R {
680
680
  areCollinear() {
681
681
  return Math.abs(
682
682
  (this.p2.x - this.p1.x) * (this.p3.y - this.p1.y) - (this.p3.x - this.p1.x) * (this.p2.y - this.p1.y)
683
- ) < R.EPSILON;
683
+ ) < P.EPSILON;
684
684
  }
685
685
  get side() {
686
686
  return [
@@ -738,7 +738,7 @@ class p extends R {
738
738
  return Math.abs(e + s + r - this.area()) < p.EPSILON;
739
739
  }
740
740
  }
741
- class G {
741
+ class W {
742
742
  static sleep(t) {
743
743
  return new Promise((e) => setTimeout(e, t));
744
744
  }
@@ -762,7 +762,7 @@ class G {
762
762
  return t.prototype.constructor = s, s;
763
763
  }
764
764
  }
765
- class _ {
765
+ class X {
766
766
  static groupBy(t, e) {
767
767
  if (!e)
768
768
  throw new Error("generateKey is required");
@@ -774,8 +774,8 @@ class _ {
774
774
  console.warn("Invalid key generated for item:", n);
775
775
  continue;
776
776
  }
777
- const o = r.get(a) ?? [];
778
- o.push(n), r.set(a, o);
777
+ const h = r.get(a) ?? [];
778
+ h.push(n), r.set(a, h);
779
779
  } catch (a) {
780
780
  console.error("Error generating key for item:", n, a);
781
781
  }
@@ -808,23 +808,23 @@ class _ {
808
808
  return e;
809
809
  }
810
810
  }
811
- function v(h) {
812
- return h !== null && (typeof h == "object" || typeof h == "function");
811
+ function O(o) {
812
+ return o !== null && (typeof o == "object" || typeof o == "function");
813
813
  }
814
- class W {
814
+ class Q {
815
815
  map = /* @__PURE__ */ new Map();
816
816
  weakMap = /* @__PURE__ */ new WeakMap();
817
817
  set(t, e) {
818
- v(t) ? this.weakMap.set(t, e) : this.map.set(t, e);
818
+ O(t) ? this.weakMap.set(t, e) : this.map.set(t, e);
819
819
  }
820
820
  get(t) {
821
- return v(t) ? this.weakMap.get(t) : this.map.get(t);
821
+ return O(t) ? this.weakMap.get(t) : this.map.get(t);
822
822
  }
823
823
  has(t) {
824
- return v(t) ? this.weakMap.has(t) : this.map.has(t);
824
+ return O(t) ? this.weakMap.has(t) : this.map.has(t);
825
825
  }
826
826
  }
827
- class X {
827
+ class j {
828
828
  static jsonClone(t) {
829
829
  try {
830
830
  return JSON.parse(JSON.stringify(t));
@@ -843,8 +843,8 @@ class X {
843
843
  if (t instanceof Map) {
844
844
  const n = /* @__PURE__ */ new Map();
845
845
  e.set(t, n);
846
- for (const [a, o] of t)
847
- n.set(this.deepClone(a, e), this.deepClone(o, e));
846
+ for (const [a, h] of t)
847
+ n.set(this.deepClone(a, e), this.deepClone(h, e));
848
848
  return n;
849
849
  }
850
850
  if (t instanceof Set) {
@@ -857,7 +857,7 @@ class X {
857
857
  if (Array.isArray(t)) {
858
858
  const n = new Array(t.length);
859
859
  e.set(t, n);
860
- for (let a = 0, o = t.length; a < o; a++)
860
+ for (let a = 0, h = t.length; a < h; a++)
861
861
  n[a] = this.deepClone(t[a], e);
862
862
  return n;
863
863
  }
@@ -878,8 +878,8 @@ class X {
878
878
  return new n(t);
879
879
  if (typeof t == "function")
880
880
  return new Proxy(t, {
881
- apply(n, a, o) {
882
- return n.apply(a, o);
881
+ apply(n, a, h) {
882
+ return n.apply(a, h);
883
883
  },
884
884
  get(n, a) {
885
885
  if (a in n)
@@ -894,40 +894,40 @@ class X {
894
894
  return r;
895
895
  }
896
896
  }
897
- const P = {
897
+ const k = {
898
898
  date: "yyyy-MM-dd",
899
899
  datetime: "yyyy-MM-dd HH:mm:ss",
900
900
  time: "HH:mm:ss",
901
901
  iso: "yyyy-MM-ddTHH:mm:ss.SSS"
902
902
  };
903
- class S {
903
+ class M {
904
904
  static defaultOptions = {
905
905
  paddingZero: !1,
906
906
  locale: "en-US"
907
907
  };
908
908
  static setDefaultOptions(t) {
909
- S.defaultOptions = { ...S.defaultOptions, ...t };
909
+ M.defaultOptions = { ...M.defaultOptions, ...t };
910
910
  }
911
911
  static format(t, e, s = {}) {
912
- const r = { ...S.defaultOptions, ...s }, i = S.getDateInfo(t, r);
913
- return S.normalizeFormatter(e)(i);
912
+ const r = { ...M.defaultOptions, ...s }, i = M.getDateInfo(t, r);
913
+ return M.normalizeFormatter(e)(i);
914
914
  }
915
915
  // 获取日期信息
916
916
  static getDateInfo(t, e) {
917
- const s = (c, l = 2) => e.paddingZero ? c.toString().padStart(l, "0") : c.toString(), r = t.getFullYear(), i = t.getMonth() + 1, n = t.getDate(), a = t.getHours(), o = t.getMinutes(), d = t.getSeconds(), f = t.getMilliseconds();
917
+ const s = (c, l = 2) => e.paddingZero ? c.toString().padStart(l, "0") : c.toString(), r = t.getFullYear(), i = t.getMonth() + 1, n = t.getDate(), a = t.getHours(), h = t.getMinutes(), d = t.getSeconds(), f = t.getMilliseconds();
918
918
  return {
919
919
  year: r,
920
920
  month: i,
921
921
  day: n,
922
922
  hour: a,
923
- minute: o,
923
+ minute: h,
924
924
  second: d,
925
925
  millisecond: f,
926
926
  yyyy: s(r, 4),
927
927
  MM: s(i),
928
928
  dd: s(n),
929
929
  HH: s(a),
930
- mm: s(o),
930
+ mm: s(h),
931
931
  ss: s(d)
932
932
  };
933
933
  }
@@ -936,7 +936,7 @@ class S {
936
936
  return t;
937
937
  if (typeof t != "string")
938
938
  throw new Error("Formatter must be a string or function");
939
- t in P && (t = P[t]);
939
+ t in k && (t = k[t]);
940
940
  const e = {
941
941
  yyyy: "yyyy",
942
942
  MM: "MM",
@@ -957,16 +957,16 @@ class S {
957
957
  };
958
958
  }
959
959
  static formatRelative(t, e = /* @__PURE__ */ new Date()) {
960
- const s = t.getTime() - e.getTime(), r = Math.abs(s), i = Math.floor(r / 1e3), n = Math.floor(i / 60), a = Math.floor(n / 60), o = Math.floor(a / 24);
961
- return o > 0 ? s > 0 ? `${o}天后` : `${o}天前` : a > 0 ? s > 0 ? `${a}小时后` : `${a}小时前` : n > 0 ? s > 0 ? `${n}分钟后` : `${n}分钟前` : s > 0 ? "刚刚" : "";
960
+ const s = t.getTime() - e.getTime(), r = Math.abs(s), i = Math.floor(r / 1e3), n = Math.floor(i / 60), a = Math.floor(n / 60), h = Math.floor(a / 24);
961
+ return h > 0 ? s > 0 ? `${h}天后` : `${h}天前` : a > 0 ? s > 0 ? `${a}小时后` : `${a}小时前` : n > 0 ? s > 0 ? `${n}分钟后` : `${n}分钟前` : s > 0 ? "刚刚" : "";
962
962
  }
963
963
  }
964
- class Q {
964
+ class J {
965
965
  static escape(t) {
966
966
  return t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
967
967
  }
968
968
  }
969
- class j {
969
+ class _ {
970
970
  static ROMAN_MAP = /* @__PURE__ */ new Map([
971
971
  ["M", 1e3],
972
972
  ["CM", 900],
@@ -995,10 +995,10 @@ class j {
995
995
  if (this.ROMAN_MAP.has(n))
996
996
  s += this.ROMAN_MAP.get(n), r += 2;
997
997
  else {
998
- const a = t[r], o = this.ROMAN_MAP.get(a);
999
- if (!o)
998
+ const a = t[r], h = this.ROMAN_MAP.get(a);
999
+ if (!h)
1000
1000
  throw new Error(`Invalid Roman numeral sequence at position ${r}`);
1001
- s += o, r += 1;
1001
+ s += h, r += 1;
1002
1002
  }
1003
1003
  }
1004
1004
  if (this.toRoman(s) !== t)
@@ -1017,7 +1017,7 @@ class j {
1017
1017
  return e;
1018
1018
  }
1019
1019
  }
1020
- class y extends Number {
1020
+ class y {
1021
1021
  static handleNumRange(t, e = !1, s = Number.MIN_SAFE_INTEGER, r = Number.MAX_SAFE_INTEGER) {
1022
1022
  if (e && !Number.isInteger(t))
1023
1023
  throw new Error("n must be an integer");
@@ -1083,14 +1083,14 @@ class y extends Number {
1083
1083
  const s = t.reduce((c, l) => c + l, 0);
1084
1084
  if (s === 0)
1085
1085
  return t.map(() => "0%");
1086
- const i = 100 * Math.pow(10, e), n = t.map((c) => c / s * i), a = n.map((c) => Math.floor(c)), o = n.map((c, l) => c - a[l]);
1086
+ const i = 100 * Math.pow(10, e), n = t.map((c) => c / s * i), a = n.map((c) => Math.floor(c)), h = n.map((c, l) => c - a[l]);
1087
1087
  let d = a.reduce((c, l) => c + l, 0), f = i - d;
1088
1088
  for (; f > 0; ) {
1089
1089
  let c = -1, l = -1;
1090
- for (let m = 0; m < o.length; m++)
1091
- o[m] > l && (l = o[m], c = m);
1090
+ for (let m = 0; m < h.length; m++)
1091
+ h[m] > l && (l = h[m], c = m);
1092
1092
  if (c === -1) break;
1093
- a[c]++, o[c] = 0, f--;
1093
+ a[c]++, h[c] = 0, f--;
1094
1094
  }
1095
1095
  return a.map((c) => `${(c / i * 100).toFixed(e)}%`);
1096
1096
  }
@@ -1185,7 +1185,7 @@ class y extends Number {
1185
1185
  return (t - e[0]) * ((s[1] - s[0]) / r) + s[0];
1186
1186
  }
1187
1187
  }
1188
- class J {
1188
+ class Z {
1189
1189
  static READ = 1;
1190
1190
  static WRITE = 2;
1191
1191
  static SHARE = 4;
@@ -1204,7 +1204,7 @@ class J {
1204
1204
  return t ^ e;
1205
1205
  }
1206
1206
  }
1207
- class Z extends String {
1207
+ class S {
1208
1208
  static frequencyStatistics(t) {
1209
1209
  return [...t].reduce(
1210
1210
  (e, s) => (e[s] = (e[s] || 0) + 1, e),
@@ -1264,55 +1264,52 @@ class Z extends String {
1264
1264
  return !1;
1265
1265
  }
1266
1266
  }
1267
- constructor(t) {
1268
- super(t);
1269
- }
1270
- pointLength() {
1271
- let t = 0;
1272
- for (let e = 0, s = this.length; e < s; ) {
1273
- const r = this.codePointAt(e);
1274
- e += r > 65535 ? 2 : 1, t++;
1275
- }
1276
- return t;
1277
- }
1278
- pointAt(t) {
1279
- if (t >= this.pointLength()) return;
1267
+ static pointLength(t) {
1280
1268
  let e = 0;
1281
- for (let s = 0, r = this.length; s < r; ) {
1282
- const i = this.codePointAt(s);
1283
- if (!i) return;
1284
- if (e === t)
1285
- return String.fromCodePoint(i);
1269
+ for (let s = 0, r = t.length; s < r; ) {
1270
+ const i = t.codePointAt(s);
1286
1271
  s += i > 65535 ? 2 : 1, e++;
1287
1272
  }
1273
+ return e;
1288
1274
  }
1289
- sliceByPoint(t, e = this.pointLength()) {
1290
- let s = "";
1291
- for (let r = t; r < e; r++)
1292
- s += this.pointAt(r);
1293
- return s;
1275
+ static pointAt(t, e) {
1276
+ if (e >= S.pointLength(t)) return;
1277
+ let s = 0;
1278
+ for (let r = 0, i = t.length; r < i; ) {
1279
+ const n = t.codePointAt(r);
1280
+ if (!n) return;
1281
+ if (s === e)
1282
+ return String.fromCodePoint(n);
1283
+ r += n > 65535 ? 2 : 1, s++;
1284
+ }
1294
1285
  }
1295
- capitalize() {
1296
- return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();
1286
+ static sliceByPoint(t, e, s = S.pointLength(t)) {
1287
+ let r = "";
1288
+ for (let i = e; i < s; i++)
1289
+ r += S.pointAt(t, i);
1290
+ return r;
1297
1291
  }
1298
- reverse() {
1299
- return this.split("").reverse().join("");
1292
+ static capitalize(t) {
1293
+ return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
1300
1294
  }
1301
- truncate(t, e = "...") {
1302
- return this.length <= t ? this : this.slice(0, t - e.length) + e;
1295
+ static reverse(t) {
1296
+ return t.split("").reverse().join("");
1303
1297
  }
1304
- isPalindrome() {
1305
- return this.toLowerCase().replace(/[^a-z0-9]/g, "") === this.reverse();
1298
+ static truncate(t, e, s = "...") {
1299
+ return t.length <= e ? this : t.slice(0, e - s.length) + s;
1306
1300
  }
1307
- count(t) {
1308
- const e = t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1309
- return (this.match(new RegExp(e, "g")) || []).length;
1301
+ static isPalindrome(t) {
1302
+ return t.toLowerCase().replace(/[^a-z0-9]/g, "") === S.reverse(t);
1310
1303
  }
1311
- toCamelCase() {
1312
- return this.replace(/_([a-z])/g, (t, e) => e.toUpperCase());
1304
+ static count(t, e) {
1305
+ const s = e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1306
+ return (t.match(new RegExp(s, "g")) || []).length;
1313
1307
  }
1314
- toSnakeCase() {
1315
- return this.replace(/[A-Z]/g, (t) => `_${t.toLowerCase()}`);
1308
+ static toCamelCase(t) {
1309
+ return t.replace(/_([a-z])/g, (e, s) => s.toUpperCase());
1310
+ }
1311
+ static toSnakeCase(t) {
1312
+ return t.replace(/[A-Z]/g, (e) => `_${e.toLowerCase()}`);
1316
1313
  }
1317
1314
  }
1318
1315
  class Y {
@@ -1335,7 +1332,7 @@ const x = {
1335
1332
  UI_HIDE_LOADING: "隐藏加载事件",
1336
1333
  UI_SHOW_MESSAGE: "显示消息事件"
1337
1334
  };
1338
- class M {
1335
+ class A {
1339
1336
  static instance = null;
1340
1337
  listeners = {};
1341
1338
  debugMode;
@@ -1347,7 +1344,7 @@ class M {
1347
1344
  );
1348
1345
  }
1349
1346
  static getInstance(t) {
1350
- return M.instance || (M.instance = new M(t)), M.instance;
1347
+ return A.instance || (A.instance = new A(t)), A.instance;
1351
1348
  }
1352
1349
  on(t, e) {
1353
1350
  this.debugLog(`添加事件监听: ${x[t]}`), this.listeners[t].add(e);
@@ -1382,30 +1379,30 @@ class M {
1382
1379
  }
1383
1380
  }
1384
1381
  export {
1385
- _ as Arr,
1386
- J as BitPerm,
1382
+ X as Arr,
1383
+ Z as BitPerm,
1387
1384
  Y as Color,
1388
- S as DateEx,
1389
- V as Dictionary,
1390
- M as Emitter,
1391
- G as Func,
1392
- B as Graph,
1393
- F as LRU,
1385
+ M as DateEx,
1386
+ H as Dictionary,
1387
+ A as Emitter,
1388
+ W as Func,
1389
+ G as Graph,
1390
+ T as LRU,
1394
1391
  g as Line,
1395
- T as LinkedList,
1392
+ B as LinkedList,
1396
1393
  I as Matrix,
1397
- q as MaxHeap,
1398
- W as MemoizeMap,
1399
- L as MinHeap,
1400
- U as MinStack,
1394
+ F as MaxHeap,
1395
+ Q as MemoizeMap,
1396
+ z as MinHeap,
1397
+ q as MinStack,
1401
1398
  y as Num,
1402
- X as Obj,
1399
+ j as Obj,
1403
1400
  u as Point,
1404
- H as Queue,
1405
- Q as Reg,
1406
- j as Roman,
1407
- D as Stack,
1408
- Z as Str,
1401
+ D as Queue,
1402
+ J as Reg,
1403
+ _ as Roman,
1404
+ U as Stack,
1405
+ S as Str,
1409
1406
  p as Triangle,
1410
1407
  w as Vector
1411
1408
  };
@@ -1,2 +1,2 @@
1
- (function(c,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(c=typeof globalThis<"u"?globalThis:c||self,v(c["jc-structure"]={}))})(this,(function(c){"use strict";class v{items={};count=0;lowestCount=0;constructor(){}dequeue(){if(this.isEmpty())return;const t=this.items[this.lowestCount];return delete this.items[this.lowestCount],this.lowestCount++,t}enqueue(...t){if(t.length===0)return this;if(t.length===1){const e=t[0];return Array.isArray(e)?this.batchEnqueue(e):this.enqueueItem(e)}for(const e of t)Array.isArray(e)?this.batchEnqueue(e):this.enqueueItem(e);return this}batchEnqueue(t){return t.filter(s=>this.isValidItem(s)).forEach(s=>{this.isValidItem(s)&&(this.items[this.count]=s,this.count++)}),this}enqueueItem(t){if(!this.isValidItem(t))throw new Error("Invalid item");return this.items[this.count]=t,this.count++,this}isValidItem(t){return t!=null}front(){return this.isEmpty()?void 0:this.items[this.lowestCount]}isEmpty(){return this.size()===0}size(){return this.count-this.lowestCount}clear(){this.items={},this.count=0,this.lowestCount=0}toString(){return this.isEmpty()?"":`Queue(size: ${this.size()}):[${this.items[this.lowestCount]},...rest]`}}class ${items={};count=0;constructor(){}pop(){if(this.isEmpty())return;this.count--;const t=this.items[this.count];return delete this.items[this.count],t}push(...t){if(t.length===0)return this;if(t.length===1){const e=t[0];return Array.isArray(e)?this.addItems(e):this.addItem(e)}for(const e of t)Array.isArray(e)?this.addItems(e):this.addItem(e);return this}addItem(t){if(!this.isValidItem(t))throw new Error("Invalid item: item cannot be null or undefined");return this.items[this.count]=t,this.count++,this}addItems(t){return t.filter(s=>this.isValidItem(s)).forEach(s=>{this.items[this.count]=s,this.count++}),this}isValidItem(t){return t!=null}peek(){return this.isEmpty()?void 0:this.items[this.count-1]}isEmpty(){return this.count===0}size(){return this.count}clear(){this.items={},this.count=0}toString(){return this.isEmpty()?"":`Stack(count: ${this.count}):[${this.items[this.count-1]},...rest]`}}class H{stack=[];minStack=[];push(t){this.stack.push(t),(this.minStack.length===0||t<=this.minStack[this.minStack.length-1])&&this.minStack.push(t)}pop(){const t=this.stack.pop();return t===this.minStack[this.minStack.length-1]&&this.minStack.pop(),t}peek(){return this.stack[this.stack.length-1]}getMin(){return this.minStack[this.minStack.length-1]}isEmpty(){return this.size()===0}size(){return this.stack.length}clear(){this.stack=[],this.minStack=[]}toString(){return this.isEmpty()?"":`MinStack(count: ${this.size()}):[${this.getMin()},...rest]`}}function R(h,t){return h===t?0:h<t?-1:1}class I{heap=[];compareFn;constructor(t=R){this.compareFn=t}static getLeftIndex(t){return 2*t+1}static getRightIndex(t){return 2*t+2}static getParentIndex(t){return t===0?void 0:Math.floor((t-1)/2)}static swap(t,e,s){[t[e],t[s]]=[t[s],t[e]]}find(){return this.isEmpty()?void 0:this.heap[0]}size(){return this.heap.length}isEmpty(){return this.size()===0}clear(){this.heap=[]}toString(){return this.heap.toString()}}class P extends I{insert(t){return t?!1:(this.heap.push(t),this.siftUp(this.heap.length-1),!0)}extract(){if(this.isEmpty())return;if(this.heap.length===1)return this.heap.shift();const t=this.heap[0];return this.heap[0]=this.heap.pop(),this.siftDown(0),t}siftUp(t){let e=t,s=I.getLeftIndex(e),r=I.getRightIndex(e),i=this.size();s<i&&this.compareFn(this.heap[e],this.heap[s])===-1&&(e=s),r<i&&this.compareFn(this.heap[e],this.heap[r])===1&&(e=r),e!==t&&(I.swap(this.heap,t,e),this.siftUp(e))}siftDown(t){let e=I.getParentIndex(t);for(;t>0&&e&&this.compareFn(this.heap[e],this.heap[t])===1;)I.swap(this.heap,e,t),t=e,e=I.getParentIndex(t)}}class V extends P{constructor(t=(e,s)=>R(s,e)){super(t)}}function D(h){return{value:h}}class U{capacity;length=0;head=null;tail=null;lookup=new Map;reverseLookup=new Map;constructor(t=10){this.capacity=t}prepend(t){this.head?(t.next=this.head,this.head.prev=t,this.head=t):this.head=this.tail=t}detach(t){t.prev&&(t.prev.next=t.next),t.next&&(t.next.prev=t.prev),this.head===t&&(this.head=this.head.next||null),this.tail===t&&(this.tail=this.tail.prev||null),t.next=void 0,t.prev=void 0}trimCache(){if(this.length<=this.capacity)return;const t=this.tail;this.detach(t);const e=this.reverseLookup.get(t);this.lookup.delete(e),this.reverseLookup.delete(t),this.length--}get(t){const e=this.lookup.get(t);if(e)return this.detach(e),this.prepend(e),e.value}update(t,e){let s=this.lookup.get(t);s?(this.detach(s),this.prepend(s),s.value=e):(s=D(e),this.length++,this.prepend(s),this.trimCache(),this.lookup.set(t,s),this.reverseLookup)}}class k{value;next=void 0}class q{count=0;head=void 0;constructor(){}indexOf(t){let e=this.head,s=0,r=!1;for(;e;){if(this.equals(e.value,t)){r=!0;break}s++,e=e.next}return r?s:-1}equals(t,e){return t===e?!0:t==null||e==null?!1:typeof t=="object"&&typeof e=="object"?JSON.stringify(t)===JSON.stringify(e):!1}getElementAt(t){if(t<0||t>=this.count)return;if(t===0)return this.head;let e=this.head;for(let s=0;s<t;s++)e=e?.next;return e}getValueAt(t){return this.getElementAt(t)?.value}insert(t,e){let s=new k;if(s.value=t,e>this.count||e<0)throw new Error("index error");this.count++;let r,i;if(e===0){s.next=this.head,this.head=s;return}r=this.getElementAt(e-1),i=r.next,r.next=s,s.next=i}push(t){let e=new k;if(e.value=t,this.count++,this.isEmpty()){this.head=e;return}let s=this.getElementAt(this.count-1);s.next=e}remove(t){const e=this.indexOf(t);return e===-1?void 0:this.removeAt(e)}removeAt(t){if(this.isEmpty()||t<0||t>=this.count)return;let e=this.getElementAt(t),s=this.getElementAt(t-1),r=e?.next;return t===0&&(this.head=r),s&&(s.next=r),this.count--,e?.value}isEmpty(){return this.count===0}size(){return this.count}clear(){this.count=0,this.head=void 0}toString(){let t="",e=this.head;for(;e;)t+=e.value,t+=",",e=e.next;return t=t.slice(0,-1),t}}class T{key;value;constructor(t,e){this.key=t,this.value=e}}function N(h,t={emptyString:!1,zeroNumber:!1}){return h==null?!(t.emptyString&&h===""||t.zeroNumber&&h===0):!1}class L{table=[];constructor(){}getItemIndex(t){for(let e=0,s=this.table.length;e<s;e++)if(this.table[e].key===t)return e;return-1}set(t,e){if(N(t))throw new Error("key is required");if(N(e))throw new Error("value is required");if(this.has(t)){let s=this.getItemIndex(t);this.table[s].value=e}else{const s=new T(t,e);this.table.push(s)}}remove(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table.splice(e,1)[0]}}has(t){return this.getItemIndex(t)!==-1}get(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table[e]}}keys(){return this.table.map(t=>t.key)}values(){return this.table.map(t=>t.value)}keyValues(){return this.table.map(t=>[t.key,t.value])}forEach(t){for(let e=0,s=this.size();e<s;e++){let r=this.table[e];if(!t(r.key,r.value))break}}isEmpty(){return!this.size()}size(){return this.table.length}clear(){this.table=[]}toString(){let t="";for(let e=0,s=this.table.length;e<s;e++)t+=this.table[e].toString(),t+=",";return t=t.slice(0,-1),t}}class F{isDirected;vertices;adjList;constructor(t=!1){this.isDirected=t,this.vertices=[],this.adjList=new L}addVertex(t){this.vertices.includes(t)||(this.vertices.push(t),this.adjList.set(t,[]))}addEdge(t,e){this.adjList.get(t)||this.addVertex(t),this.adjList.get(e)||this.addVertex(e),this.adjList.get(t)?.value.indexOf(e)===-1&&this.adjList.get(t)?.value.push(e),this.isDirected||this.adjList.get(e)?.value.indexOf(t)===-1&&this.adjList.get(e)?.value.push(t)}getVertices(){return this.vertices}getAdjacencyList(){return this.adjList}toString(){let t="";for(let e=0;e<this.vertices.length;e++)t+=this.vertices[e]+"-->",t+=this.adjList.get(this.vertices[e])?.toString()||"",t+=`
2
- `;return t}}class E{_data;static zero(t){return new E(...Array(t).fill(0))}constructor(...t){this._data=t}get dimension(){return this._data.length}get norm(){return Math.hypot(...this._data)}getItem(t){return this._data[t]}normalize(){const t=this.norm;if(t===0)throw new Error("Cannot normalize a zero vector");const e=this._data.map(s=>s/t);return new E(...e)}add(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to add");const e=this._data.map((s,r)=>s+t._data[r]);return new E(...e)}sub(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to subtract");const e=this._data.map((s,r)=>s-t._data[r]);return new E(...e)}mul(t){return new E(...this._data.map(e=>e*t))}dot(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to dot product");return this._data.reduce((e,s,r)=>e+s*t._data[r],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class M{_matrix;static zero(t,e){return new M(Array.from({length:t},()=>Array.from({length:e},()=>0)))}static rotate(t){const e=t.length;for(let s=0;s<(e+1)/2;s++)for(let r=s;r<e/2;r++){const i=t[e-1-r][s];t[e-1-r][s]=t[e-1-s][e-1-r],t[e-1-s][e-1-r]=t[r][e-1-s],t[r][e-1-s]=t[s][r],t[s][r]=i}return t}constructor(t){this._matrix=t}get shape(){return[this._matrix.length,this._matrix[0].length]}get row(){return this.shape[0]}get col(){return this.shape[1]}get size(){return this.row*this.col}rowVector(t){return new E(...this._matrix[t])}colVector(t){return new E(...this._matrix.map(e=>e[t]))}getItem(t){return this._matrix[t[0]][t[1]]}setItem(t,e){return this._matrix[t[0]][t[1]]=e,this}mul(t){return new M(this._matrix.map(e=>e.map(s=>s*t)))}div(t){return this.mul(1/t)}add(t){if(this.row!==t.row||this.col!==t.col)throw new Error("Matrix dimensions do not match");return new M(this._matrix.map((e,s)=>e.map((r,i)=>r+t.getItem([s,i]))))}sub(t){return this.add(t.neg())}pos(){return this.mul(1)}neg(){return this.mul(-1)}mulVector(t){if(this.col!==t.dimension)throw new Error("Matrix dimensions do not match");return new M(this._matrix.map(e=>e.map((s,r)=>s*t.getItem(r))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=M.zero(this.row,t.col);for(let s=0;s<this.row;s++){const r=this.rowVector(s);for(let i=0;i<this.col;i++)e.setItem([s,i],r.dot(t.colVector(i)))}return e}}class l{static distance(t,e){return Math.hypot(e.x-t.x,e.y-t.y)}x;y;constructor(t,e){this.x=t,this.y=e}distanceTo(t){return l.distance(this,t)}}class g{static EPSILON=1e-10;static sloped(t,e=g.EPSILON){const s=t.p2.x-t.p1.x,r=t.p2.y-t.p1.y;return Math.abs(s)<e?Math.abs(r)<e?0:null:r/s}static isParallel(t,e,s=g.EPSILON){const r=g.sloped(t),i=g.sloped(e);return r===null&&i===null?!0:r===null||i===null?!1:Math.abs(r-i)<s}static getIntersection(t,e,s=g.EPSILON){if(g.isParallel(t,e))return null;const r=t.p1.x,i=t.p1.y,n=t.p2.x,a=t.p2.y,o=e.p1.x,f=e.p1.y,m=e.p2.x,u=e.p2.y,p=(r-n)*(f-u)-(i-a)*(o-m);if(Math.abs(p)<s)return null;const y=((r-o)*(f-u)-(i-f)*(o-m))/p,O=-((r-n)*(i-f)-(i-a)*(r-o))/p;if(y>=0&&y<=1&&O>=0&&O<=1){const Y=r+y*(n-r),K=i+y*(a-i);return new l(Y,K)}return null}static isIntersecting(t,e){return g.getIntersection(t,e)!==null}static distanceToPoint(t,e,s=g.EPSILON){const r=e.x-t.p1.x,i=e.y-t.p1.y,n=t.p2.x-t.p1.x,a=t.p2.y-t.p1.y,o=r*n+i*a,f=n*n+a*a;let m=-1;f>s&&(m=o/f);let u,p;m<0?(u=t.p1.x,p=t.p1.y):m>1?(u=t.p2.x,p=t.p2.y):(u=t.p1.x+m*n,p=t.p1.y+m*a);const y=e.x-u,O=e.y-p;return Math.hypot(y+O)}p1;p2;constructor(t,e){this.p1=t,this.p2=e}get length(){const t=this.p2.x-this.p1.x,e=this.p2.y-this.p1.y;return Math.sqrt(t*t+e*e)}get midpoint(){const t=(this.p1.x+this.p2.x)/2,e=(this.p1.y+this.p2.y)/2;return new l(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=g.EPSILON){const s=(t.x-this.p1.x)*(this.p2.y-this.p1.y)-(t.y-this.p1.y)*(this.p2.x-this.p1.x);return Math.abs(s)>e?!1:(t.x-this.p1.x)*(t.x-this.p2.x)+(t.y-this.p1.y)*(t.y-this.p2.y)<=e}get direction(){const t=this.length;if(t<g.EPSILON)return new l(0,0);const e=(this.p2.x-this.p1.x)/t,s=(this.p2.y-this.p1.y)/t;return new l(e,s)}get start(){return this.p1}get end(){return this.p2}}class C{static EPSILON=1e-10;name;constructor(t){this.name=t}}class d extends C{static isValid(t,e,s){return t<=0||e<=0||s<=0?!1:t+e>s&&t+s>e&&e+s>t}static area(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle");const r=(t+e+s)/2;return Math.sqrt(r*(r-t)*(r-e)*(r-s))}static getType(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle sides");const r=[t,e,s].sort((o,f)=>o-f),[i,n,a]=r;return Math.abs(i-n)<d.EPSILON&&Math.abs(n-a)<d.EPSILON?"equilateral":Math.abs(i-n)<d.EPSILON||Math.abs(n-a)<d.EPSILON?"isosceles":"scalene"}static getAngles(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle sides");const r=Math.acos((e*e+s*s-t*t)/(2*e*s)),i=Math.acos((t*t+s*s-e*e)/(2*t*s)),n=Math.PI-r-i;return[r,i,n]}p1;p2;p3;constructor(t,e,s,r="triangle"){if(super(r),this.p1=t,this.p2=e,this.p3=s,this.areCollinear())throw new Error("Points are collinear, cannot form a triangle")}areCollinear(){return Math.abs((this.p2.x-this.p1.x)*(this.p3.y-this.p1.y)-(this.p3.x-this.p1.x)*(this.p2.y-this.p1.y))<C.EPSILON}get side(){return[l.distance(this.p1,this.p2),l.distance(this.p2,this.p3),l.distance(this.p3,this.p1)]}perimeter(){return d.isValid(this.side[0],this.side[1],this.side[2]),this.side.reduce((t,e)=>t+e,0)}area(){const[t,e,s]=this.side;return d.area(t,e,s)}get type(){const[t,e,s]=this.side;return d.getType(t,e,s)}get angles(){const[t,e,s]=this.side;return d.getAngles(t,e,s)}get centroid(){return new l((this.p1.x+this.p2.x+this.p3.x)/3,(this.p1.y+this.p2.y+this.p3.y)/3)}get incenter(){const[t,e,s]=this.side,r=this.perimeter()/2,i=(t*this.p1.x+e*this.p2.x+s*this.p3.x)/r,n=(t*this.p1.y+e*this.p2.y+s*this.p3.y)/r;return new l(i,n)}get circumcenter(){const t=2*(this.p1.x*(this.p2.y-this.p3.y)+this.p2.x*(this.p3.y-this.p1.y)+this.p3.x*(this.p1.y-this.p2.y));if(Math.abs(t)<d.EPSILON)throw new Error("Cannot calculate circumcenter for collinear points");const e=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p2.y-this.p3.y)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p3.y-this.p1.y)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p1.y-this.p2.y))/t,s=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p3.x-this.p2.x)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p1.x-this.p3.x)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p2.x-this.p1.x))/t;return new l(e,s)}containsPoint(t){const e=d.area(l.distance(t,this.p1),l.distance(t,this.p2),l.distance(this.p1,this.p2)),s=d.area(l.distance(t,this.p2),l.distance(t,this.p3),l.distance(this.p2,this.p3)),r=d.area(l.distance(t,this.p3),l.distance(t,this.p1),l.distance(this.p3,this.p1));return Math.abs(e+s+r-this.area())<d.EPSILON}}class B{static sleep(t){return new Promise(e=>setTimeout(e,t))}static binarySearchTemplate(t,e,s){let r=-1,i=t.length,n;for(;i-r>1;)n=i-(i-r)>>1,s(t[n],e)?i=n:r=n;return i}static singleton(t){let e;const s=new Proxy(t,{construct(r,i,n){return e||(e=Reflect.construct(r,i,n)),e}});return t.prototype.constructor=s,s}}class G{static groupBy(t,e){if(!e)throw new Error("generateKey is required");const s=typeof e=="string"?i=>i[e]:e,r=new Map;for(const[i,n]of t.entries())try{const a=s(n,i,t);if(a==null){console.warn("Invalid key generated for item:",n);continue}const o=r.get(a)??[];o.push(n),r.set(a,o)}catch(a){console.error("Error generating key for item:",n,a)}return Object.fromEntries(r)}static LIS(t){if(!t.length)return[];const e=[[t[0]]];for(let r=1,i=t.length;r<i;r++){const n=t[r];s(n)}function s(r){for(let i=e.length-1;i>=0;i--){const n=e[i],a=n[e[i].length-1];if(a<r){e[i+1]=[...n,r];break}else a>r&&i===0&&(e[i]=[r])}}return e[e.length-1]}static LCP(t){if(!t.length)return"";let e=t[0];for(let s=1;s<t.length;s++)for(;!t[s].startsWith(e);)if(e=e.slice(0,-1),e==="")return"";return e}}function b(h){return h!==null&&(typeof h=="object"||typeof h=="function")}class j{map=new Map;weakMap=new WeakMap;set(t,e){b(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return b(t)?this.weakMap.get(t):this.map.get(t)}has(t){return b(t)?this.weakMap.has(t):this.map.has(t)}}class _{static jsonClone(t){try{return JSON.parse(JSON.stringify(t))}catch{throw new Error("Object is not JSON cloneable")}}static structureClone(t){return structuredClone(t)}static deepClone(t,e=new WeakMap){if(t==null||typeof t!="object")return t;if(e.has(t))return e.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof Map){const n=new Map;e.set(t,n);for(const[a,o]of t)n.set(this.deepClone(a,e),this.deepClone(o,e));return n}if(t instanceof Set){const n=new Set;e.set(t,n);for(const a of t)n.add(this.deepClone(a,e));return n}if(Array.isArray(t)){const n=new Array(t.length);e.set(t,n);for(let a=0,o=t.length;a<o;a++)n[a]=this.deepClone(t[a],e);return n}if(t instanceof ArrayBuffer)return t.slice(0);const s=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];for(const n of s)if(t instanceof n)return new n(t);if(typeof t=="function")return new Proxy(t,{apply(n,a,o){return n.apply(a,o)},get(n,a){if(a in n)return n[a]}});const r=Object.create(Object.getPrototypeOf(t));e.set(t,r);const i=Object.getOwnPropertyDescriptors(t);for(const[n,a]of Object.entries(i))a.value!==void 0&&(a.value=this.deepClone(a.value,e)),Object.defineProperty(r,n,a);return r}}const z={date:"yyyy-MM-dd",datetime:"yyyy-MM-dd HH:mm:ss",time:"HH:mm:ss",iso:"yyyy-MM-ddTHH:mm:ss.SSS"};class S{static defaultOptions={paddingZero:!1,locale:"en-US"};static setDefaultOptions(t){S.defaultOptions={...S.defaultOptions,...t}}static format(t,e,s={}){const r={...S.defaultOptions,...s},i=S.getDateInfo(t,r);return S.normalizeFormatter(e)(i)}static getDateInfo(t,e){const s=(u,p=2)=>e.paddingZero?u.toString().padStart(p,"0"):u.toString(),r=t.getFullYear(),i=t.getMonth()+1,n=t.getDate(),a=t.getHours(),o=t.getMinutes(),f=t.getSeconds(),m=t.getMilliseconds();return{year:r,month:i,day:n,hour:a,minute:o,second:f,millisecond:m,yyyy:s(r,4),MM:s(i),dd:s(n),HH:s(a),mm:s(o),ss:s(f)}}static normalizeFormatter(t){if(typeof t=="function")return t;if(typeof t!="string")throw new Error("Formatter must be a string or function");t in z&&(t=z[t]);const e={yyyy:"yyyy",MM:"MM",dd:"dd",HH:"HH",mm:"mm",ss:"ss",SSS:"SSS"};return s=>{let r=t;for(const[i,n]of Object.entries(e))r=r.replace(new RegExp(i,"g"),String(s[n]||""));return r}}static formatRelative(t,e=new Date){const s=t.getTime()-e.getTime(),r=Math.abs(s),i=Math.floor(r/1e3),n=Math.floor(i/60),a=Math.floor(n/60),o=Math.floor(a/24);return o>0?s>0?`${o}天后`:`${o}天前`:a>0?s>0?`${a}小时后`:`${a}小时前`:n>0?s>0?`${n}分钟后`:`${n}分钟前`:s>0?"刚刚":""}}class W{static escape(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}class X{static ROMAN_MAP=new Map([["M",1e3],["CM",900],["D",500],["CD",400],["C",100],["XC",90],["L",50],["XL",40],["X",10],["IX",9],["V",5],["IV",4],["I",1]]);static toInteger(t){if(t.length===0)throw new Error("Input cannot be empty");const e=new Set(["I","V","X","L","C","D","M"]);for(const n of t)if(!e.has(n))throw new Error(`Invalid Roman numeral character: ${n}`);let s=0,r=0;for(;r<t.length;){const n=t.slice(r,r+2);if(this.ROMAN_MAP.has(n))s+=this.ROMAN_MAP.get(n),r+=2;else{const a=t[r],o=this.ROMAN_MAP.get(a);if(!o)throw new Error(`Invalid Roman numeral sequence at position ${r}`);s+=o,r+=1}}if(this.toRoman(s)!==t)throw new Error("Invalid Roman numeral sequence");return s}static toRoman(t){if(t<=0||t>=4e3)throw new Error("Number must be between 1 and 3999");if(!Number.isInteger(t))throw new Error("Number must be an integer");let e="";for(const[s,r]of this.ROMAN_MAP)for(;t>=r;)e+=s,t-=r;return e}}class w extends Number{static handleNumRange(t,e=!1,s=Number.MIN_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER){if(e&&!Number.isInteger(t))throw new Error("n must be an integer");if(t<s||t>=r)throw new RangeError(`n must be in the range of ${s} to ${r}`)}static consecutiveSum(t){return w.handleNumRange(t,!0,0,1e8),t*(t+1)/2}static consecutiveSquaresSum(t){return w.handleNumRange(t,!0,0,1e6),t*(t+1)*(2*t+1)/6}static consecutivecubesSum(t){return w.handleNumRange(t,!0,0,1e4),t*(t+1)*(2*t+1)*(3*t*t+3*t-1)/30}static clamp(t,e,s){return s==null?Math.min(t,e):Math.min(Math.max(t,e),s)}static factorial(t){if(w.handleNumRange(t,!0,0,1e3),t<2)return 1;let e=1;for(let s=2;s<=t;s++)e*=s;return e}static fibonacci(t,e=1,s=1){return w.handleNumRange(t,!0,0,1e3),t<2?s:this.fibonacci(t-1,s,s+e)}static fibonacciIterative(t){if(w.handleNumRange(t,!0,0,1e3),t<2)return t;let e=0,s=1;for(let r=2;r<=t;r++)[e,s]=[s,(e+s)%1000000007];return s}static floatEqual(t,e,s=1e-6){return Math.abs(t-e)<s}static fastPower(t,e){if(w.handleNumRange(e,!0,0,10),w.handleNumRange(t,!1,0,1e3),t===0)return 0;if(e===0)return 1;const s=this.fastPower(t,e>>1);return e%2===0?s*s:s*s*t}static fastSqrt(t){if(w.handleNumRange(t,!1,0,1e8),typeof BigInt>"u")return Math.sqrt(t);const e=.5*t,s=new ArrayBuffer(8);new Float64Array(s)[0]=t;let r=new BigInt64Array(s)[0];r=0x1ff7a3bea91d9b1bn+(r>>1n);const i=new ArrayBuffer(8);new BigInt64Array(i)[0]=r;let n=new Float64Array(i)[0];return n=n*.5+e/n,n=n*.5+e/n,n=n*.5+e/n,n}static getPercentWithPrecision(t,e=2){if(!Array.isArray(t)||t.length===0)return[];if(e<0||!Number.isInteger(e))throw new Error("Precision must be a non-negative integer");const s=t.reduce((u,p)=>u+p,0);if(s===0)return t.map(()=>"0%");const i=100*Math.pow(10,e),n=t.map(u=>u/s*i),a=n.map(u=>Math.floor(u)),o=n.map((u,p)=>u-a[p]);let f=a.reduce((u,p)=>u+p,0),m=i-f;for(;m>0;){let u=-1,p=-1;for(let y=0;y<o.length;y++)o[y]>p&&(p=o[y],u=y);if(u===-1)break;a[u]++,o[u]=0,m--}return a.map(u=>`${(u/i*100).toFixed(e)}%`)}static gcd(t,e){return e===0?t:this.gcd(e,t%e)}static isValidPositiveInteger(t){return Number.isInteger(t)&&t>0&&t<=Number.MAX_SAFE_INTEGER}static isPowerOfTwo(t){return t>0&&(t&t-1)===0}static isOdd(t){return t%2===1||t%2===-1}static isPrime(t){if(t<=1)return!1;for(let e=2;e<=Math.sqrt(t);e++)if(t%e===0)return!1;return!0}static isPalindrome(t){if(t<0||t%10===0&&t!==0)return!1;let e=0,s=t;for(;t>0;){const r=t%10;e=e*10+r,t=Math.floor(t/10)}return s===e}static isArmstrong(t){const e=t.toString(),s=e.length;let r=0;for(let i=0;i<s;i++)r+=Math.pow(parseInt(e[i]),s);return r===t}static isHappy(t){const e=new Set;for(;t!==1;){if(e.has(t))return!1;e.add(t),t=(t+"").split("").reduce((s,r)=>s+Number(r)*Number(r),0)}return!0}static isPerfect(t){let e=0;for(let s=1;s<t;s++)t%s===0&&(e+=s);return e===t}static isSameSign(t,e){return t>=0&&e>=0||t<=0&&e<=0}static isRange(t,e,s){if(s==null&&(s=e,e=0),e>=s)throw new Error("The maximum value must be greater than the minimum value");return e<=t&&t<s}static lcm(t,e){return t*e/this.gcd(t,e)}static middle(t,e){return e-(e-t>>1)}static random(t,e){if(e==null&&(e=t,t=0),t>=e)throw new Error("The maximum value must be greater than the minimum value");return Math.random()*(e-t)+t}static randomInt(t,e){return Math.floor(this.random(t,e))}static round(t,e=0){if(!Number.isInteger(e))throw new Error("precision must be an integer");const s=Math.pow(10,e);return Math.round(t*s)/s}static scale(t,e,s){if(e[0]>=e[1]||s[0]>=s[1])throw new Error("Invalid range");t=this.clamp(t,e[0],e[1]);const r=e[1]-e[0];return(t-e[0])*((s[1]-s[0])/r)+s[0]}}class Q{static READ=1;static WRITE=2;static SHARE=4;static DELETE=8;static CREATE=16;static include(t,e){return(t&e)===e}static add(t,e){return t|e}static remove(t,e){return t&~e}static toggle(t,e){return t^e}}class J extends String{static frequencyStatistics(t){return[...t].reduce((e,s)=>(e[s]=(e[s]||0)+1,e),{})}static isValidBracket(t){const e=[],s={"(":")","[":"]","{":"}"},r=new Set(Object.values(s));for(const i of t)if(i in s)e.push(s[i]);else if(r.has(i)&&i!==e.pop())return!1;return e.length===0}static random(t=8){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let s="";for(let r=0;r<t;r++)s+=e.charAt(Math.floor(Math.random()*e.length));return s}static template(t,e){return t.replace(/\${(\w+)}/g,(s,r)=>e[r]||"")}static escapeHtml(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"," ":"&nbsp;","±":"&plusmn;","×":"&times;","÷":"&divide;","≠":"&ne;","≤":"&le;","≥":"&ge;"},s=new RegExp(`[${Object.keys(e).join("")}]`,"g");return t.replace(s,r=>e[r])}static isEmail(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}static isUrl(t){try{return new URL(t),!0}catch{return!1}}constructor(t){super(t)}pointLength(){let t=0;for(let e=0,s=this.length;e<s;){const r=this.codePointAt(e);e+=r>65535?2:1,t++}return t}pointAt(t){if(t>=this.pointLength())return;let e=0;for(let s=0,r=this.length;s<r;){const i=this.codePointAt(s);if(!i)return;if(e===t)return String.fromCodePoint(i);s+=i>65535?2:1,e++}}sliceByPoint(t,e=this.pointLength()){let s="";for(let r=t;r<e;r++)s+=this.pointAt(r);return s}capitalize(){return this.charAt(0).toUpperCase()+this.slice(1).toLowerCase()}reverse(){return this.split("").reverse().join("")}truncate(t,e="..."){return this.length<=t?this:this.slice(0,t-e.length)+e}isPalindrome(){return this.toLowerCase().replace(/[^a-z0-9]/g,"")===this.reverse()}count(t){const e=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(this.match(new RegExp(e,"g"))||[]).length}toCamelCase(){return this.replace(/_([a-z])/g,(t,e)=>e.toUpperCase())}toSnakeCase(){return this.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}}class Z{static isValidHex(t){return/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(t)}static isValidRGB(t){return/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(t)}}const x={AUTH_UNAUTHORIZED:"未授权事件",AUTH_LOGIN_SUCCESS:"登录成功事件",AUTH_LOGOUT:"注销事件",AUTH_TOKEN_EXPIRED:"令牌过期事件",REQUEST_ERROR:"请求错误事件",REQUEST_TIMEOUT:"请求超时事件",REQUEST_NETWORK_ERROR:"网络错误事件",UI_SHOW_LOADING:"显示加载事件",UI_HIDE_LOADING:"隐藏加载事件",UI_SHOW_MESSAGE:"显示消息事件"};class A{static instance=null;listeners={};debugMode;constructor(t=!1){this.debugMode=t,Object.keys(x).forEach(e=>{this.listeners[e]=new Set})}static getInstance(t){return A.instance||(A.instance=new A(t)),A.instance}on(t,e){this.debugLog(`添加事件监听: ${x[t]}`),this.listeners[t].add(e)}emit(t,e){this.debugLog(`触发事件: ${x[t]}`,e),this.listeners[t].forEach(s=>{try{s(e)}catch(r){console.error(`事件 ${x[t]} 处理出错:`,r)}})}off(t,e){this.debugLog(`移除事件监听: ${x[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${x[t]}`);const s=r=>{e(r),this.off(t,s)};this.on(t,s)}clear(){this.debugLog("清除所有事件监听器"),Object.values(this.listeners).forEach(t=>t.clear())}getListenerCount(t){return this.listeners[t].size}debugLog(t,e){this.debugMode&&console.log(`[EventEmitter] ${t}`,e||"")}}c.Arr=G,c.BitPerm=Q,c.Color=Z,c.DateEx=S,c.Dictionary=L,c.Emitter=A,c.Func=B,c.Graph=F,c.LRU=U,c.Line=g,c.LinkedList=q,c.Matrix=M,c.MaxHeap=V,c.MemoizeMap=j,c.MinHeap=P,c.MinStack=H,c.Num=w,c.Obj=_,c.Point=l,c.Queue=v,c.Reg=W,c.Roman=X,c.Stack=$,c.Str=J,c.Triangle=d,c.Vector=E,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(c,O){typeof exports=="object"&&typeof module<"u"?O(exports):typeof define=="function"&&define.amd?define(["exports"],O):(c=typeof globalThis<"u"?globalThis:c||self,O(c["jc-structure"]={}))})(this,(function(c){"use strict";class O{items={};count=0;lowestCount=0;constructor(){}dequeue(){if(this.isEmpty())return;const t=this.items[this.lowestCount];return delete this.items[this.lowestCount],this.lowestCount++,t}enqueue(...t){if(t.length===0)return this;if(t.length===1){const e=t[0];return Array.isArray(e)?this.batchEnqueue(e):this.enqueueItem(e)}for(const e of t)Array.isArray(e)?this.batchEnqueue(e):this.enqueueItem(e);return this}batchEnqueue(t){return t.filter(s=>this.isValidItem(s)).forEach(s=>{this.isValidItem(s)&&(this.items[this.count]=s,this.count++)}),this}enqueueItem(t){if(!this.isValidItem(t))throw new Error("Invalid item");return this.items[this.count]=t,this.count++,this}isValidItem(t){return t!=null}front(){return this.isEmpty()?void 0:this.items[this.lowestCount]}isEmpty(){return this.size()===0}size(){return this.count-this.lowestCount}clear(){this.items={},this.count=0,this.lowestCount=0}toString(){return this.isEmpty()?"":`Queue(size: ${this.size()}):[${this.items[this.lowestCount]},...rest]`}}class H{items={};count=0;constructor(){}pop(){if(this.isEmpty())return;this.count--;const t=this.items[this.count];return delete this.items[this.count],t}push(...t){if(t.length===0)return this;if(t.length===1){const e=t[0];return Array.isArray(e)?this.addItems(e):this.addItem(e)}for(const e of t)Array.isArray(e)?this.addItems(e):this.addItem(e);return this}addItem(t){if(!this.isValidItem(t))throw new Error("Invalid item: item cannot be null or undefined");return this.items[this.count]=t,this.count++,this}addItems(t){return t.filter(s=>this.isValidItem(s)).forEach(s=>{this.items[this.count]=s,this.count++}),this}isValidItem(t){return t!=null}peek(){return this.isEmpty()?void 0:this.items[this.count-1]}isEmpty(){return this.count===0}size(){return this.count}clear(){this.items={},this.count=0}toString(){return this.isEmpty()?"":`Stack(count: ${this.count}):[${this.items[this.count-1]},...rest]`}}class V{stack=[];minStack=[];push(t){this.stack.push(t),(this.minStack.length===0||t<=this.minStack[this.minStack.length-1])&&this.minStack.push(t)}pop(){const t=this.stack.pop();return t===this.minStack[this.minStack.length-1]&&this.minStack.pop(),t}peek(){return this.stack[this.stack.length-1]}getMin(){return this.minStack[this.minStack.length-1]}isEmpty(){return this.size()===0}size(){return this.stack.length}clear(){this.stack=[],this.minStack=[]}toString(){return this.isEmpty()?"":`MinStack(count: ${this.size()}):[${this.getMin()},...rest]`}}function P(h,t){return h===t?0:h<t?-1:1}class I{heap=[];compareFn;constructor(t=P){this.compareFn=t}static getLeftIndex(t){return 2*t+1}static getRightIndex(t){return 2*t+2}static getParentIndex(t){return t===0?void 0:Math.floor((t-1)/2)}static swap(t,e,s){[t[e],t[s]]=[t[s],t[e]]}find(){return this.isEmpty()?void 0:this.heap[0]}size(){return this.heap.length}isEmpty(){return this.size()===0}clear(){this.heap=[]}toString(){return this.heap.toString()}}class k extends I{insert(t){return t?!1:(this.heap.push(t),this.siftUp(this.heap.length-1),!0)}extract(){if(this.isEmpty())return;if(this.heap.length===1)return this.heap.shift();const t=this.heap[0];return this.heap[0]=this.heap.pop(),this.siftDown(0),t}siftUp(t){let e=t,s=I.getLeftIndex(e),r=I.getRightIndex(e),i=this.size();s<i&&this.compareFn(this.heap[e],this.heap[s])===-1&&(e=s),r<i&&this.compareFn(this.heap[e],this.heap[r])===1&&(e=r),e!==t&&(I.swap(this.heap,t,e),this.siftUp(e))}siftDown(t){let e=I.getParentIndex(t);for(;t>0&&e&&this.compareFn(this.heap[e],this.heap[t])===1;)I.swap(this.heap,e,t),t=e,e=I.getParentIndex(t)}}class D extends k{constructor(t=(e,s)=>P(s,e)){super(t)}}function U(h){return{value:h}}class q{capacity;length=0;head=null;tail=null;lookup=new Map;reverseLookup=new Map;constructor(t=10){this.capacity=t}prepend(t){this.head?(t.next=this.head,this.head.prev=t,this.head=t):this.head=this.tail=t}detach(t){t.prev&&(t.prev.next=t.next),t.next&&(t.next.prev=t.prev),this.head===t&&(this.head=this.head.next||null),this.tail===t&&(this.tail=this.tail.prev||null),t.next=void 0,t.prev=void 0}trimCache(){if(this.length<=this.capacity)return;const t=this.tail;this.detach(t);const e=this.reverseLookup.get(t);this.lookup.delete(e),this.reverseLookup.delete(t),this.length--}get(t){const e=this.lookup.get(t);if(e)return this.detach(e),this.prepend(e),e.value}update(t,e){let s=this.lookup.get(t);s?(this.detach(s),this.prepend(s),s.value=e):(s=U(e),this.length++,this.prepend(s),this.trimCache(),this.lookup.set(t,s),this.reverseLookup)}}class N{value;next=void 0}class T{count=0;head=void 0;constructor(){}indexOf(t){let e=this.head,s=0,r=!1;for(;e;){if(this.equals(e.value,t)){r=!0;break}s++,e=e.next}return r?s:-1}equals(t,e){return t===e?!0:t==null||e==null?!1:typeof t=="object"&&typeof e=="object"?JSON.stringify(t)===JSON.stringify(e):!1}getElementAt(t){if(t<0||t>=this.count)return;if(t===0)return this.head;let e=this.head;for(let s=0;s<t;s++)e=e?.next;return e}getValueAt(t){return this.getElementAt(t)?.value}insert(t,e){let s=new N;if(s.value=t,e>this.count||e<0)throw new Error("index error");this.count++;let r,i;if(e===0){s.next=this.head,this.head=s;return}r=this.getElementAt(e-1),i=r.next,r.next=s,s.next=i}push(t){let e=new N;if(e.value=t,this.count++,this.isEmpty()){this.head=e;return}let s=this.getElementAt(this.count-1);s.next=e}remove(t){const e=this.indexOf(t);return e===-1?void 0:this.removeAt(e)}removeAt(t){if(this.isEmpty()||t<0||t>=this.count)return;let e=this.getElementAt(t),s=this.getElementAt(t-1),r=e?.next;return t===0&&(this.head=r),s&&(s.next=r),this.count--,e?.value}isEmpty(){return this.count===0}size(){return this.count}clear(){this.count=0,this.head=void 0}toString(){let t="",e=this.head;for(;e;)t+=e.value,t+=",",e=e.next;return t=t.slice(0,-1),t}}class F{key;value;constructor(t,e){this.key=t,this.value=e}}function L(h,t={emptyString:!1,zeroNumber:!1}){return h==null?!(t.emptyString&&h===""||t.zeroNumber&&h===0):!1}class C{table=[];constructor(){}getItemIndex(t){for(let e=0,s=this.table.length;e<s;e++)if(this.table[e].key===t)return e;return-1}set(t,e){if(L(t))throw new Error("key is required");if(L(e))throw new Error("value is required");if(this.has(t)){let s=this.getItemIndex(t);this.table[s].value=e}else{const s=new F(t,e);this.table.push(s)}}remove(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table.splice(e,1)[0]}}has(t){return this.getItemIndex(t)!==-1}get(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table[e]}}keys(){return this.table.map(t=>t.key)}values(){return this.table.map(t=>t.value)}keyValues(){return this.table.map(t=>[t.key,t.value])}forEach(t){for(let e=0,s=this.size();e<s;e++){let r=this.table[e];if(!t(r.key,r.value))break}}isEmpty(){return!this.size()}size(){return this.table.length}clear(){this.table=[]}toString(){let t="";for(let e=0,s=this.table.length;e<s;e++)t+=this.table[e].toString(),t+=",";return t=t.slice(0,-1),t}}class B{isDirected;vertices;adjList;constructor(t=!1){this.isDirected=t,this.vertices=[],this.adjList=new C}addVertex(t){this.vertices.includes(t)||(this.vertices.push(t),this.adjList.set(t,[]))}addEdge(t,e){this.adjList.get(t)||this.addVertex(t),this.adjList.get(e)||this.addVertex(e),this.adjList.get(t)?.value.indexOf(e)===-1&&this.adjList.get(t)?.value.push(e),this.isDirected||this.adjList.get(e)?.value.indexOf(t)===-1&&this.adjList.get(e)?.value.push(t)}getVertices(){return this.vertices}getAdjacencyList(){return this.adjList}toString(){let t="";for(let e=0;e<this.vertices.length;e++)t+=this.vertices[e]+"-->",t+=this.adjList.get(this.vertices[e])?.toString()||"",t+=`
2
+ `;return t}}class E{_data;static zero(t){return new E(...Array(t).fill(0))}constructor(...t){this._data=t}get dimension(){return this._data.length}get norm(){return Math.hypot(...this._data)}getItem(t){return this._data[t]}normalize(){const t=this.norm;if(t===0)throw new Error("Cannot normalize a zero vector");const e=this._data.map(s=>s/t);return new E(...e)}add(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to add");const e=this._data.map((s,r)=>s+t._data[r]);return new E(...e)}sub(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to subtract");const e=this._data.map((s,r)=>s-t._data[r]);return new E(...e)}mul(t){return new E(...this._data.map(e=>e*t))}dot(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to dot product");return this._data.reduce((e,s,r)=>e+s*t._data[r],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class M{_matrix;static zero(t,e){return new M(Array.from({length:t},()=>Array.from({length:e},()=>0)))}static rotate(t){const e=t.length;for(let s=0;s<(e+1)/2;s++)for(let r=s;r<e/2;r++){const i=t[e-1-r][s];t[e-1-r][s]=t[e-1-s][e-1-r],t[e-1-s][e-1-r]=t[r][e-1-s],t[r][e-1-s]=t[s][r],t[s][r]=i}return t}constructor(t){this._matrix=t}get shape(){return[this._matrix.length,this._matrix[0].length]}get row(){return this.shape[0]}get col(){return this.shape[1]}get size(){return this.row*this.col}rowVector(t){return new E(...this._matrix[t])}colVector(t){return new E(...this._matrix.map(e=>e[t]))}getItem(t){return this._matrix[t[0]][t[1]]}setItem(t,e){return this._matrix[t[0]][t[1]]=e,this}mul(t){return new M(this._matrix.map(e=>e.map(s=>s*t)))}div(t){return this.mul(1/t)}add(t){if(this.row!==t.row||this.col!==t.col)throw new Error("Matrix dimensions do not match");return new M(this._matrix.map((e,s)=>e.map((r,i)=>r+t.getItem([s,i]))))}sub(t){return this.add(t.neg())}pos(){return this.mul(1)}neg(){return this.mul(-1)}mulVector(t){if(this.col!==t.dimension)throw new Error("Matrix dimensions do not match");return new M(this._matrix.map(e=>e.map((s,r)=>s*t.getItem(r))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=M.zero(this.row,t.col);for(let s=0;s<this.row;s++){const r=this.rowVector(s);for(let i=0;i<this.col;i++)e.setItem([s,i],r.dot(t.colVector(i)))}return e}}class l{static distance(t,e){return Math.hypot(e.x-t.x,e.y-t.y)}x;y;constructor(t,e){this.x=t,this.y=e}distanceTo(t){return l.distance(this,t)}}class g{static EPSILON=1e-10;static sloped(t,e=g.EPSILON){const s=t.p2.x-t.p1.x,r=t.p2.y-t.p1.y;return Math.abs(s)<e?Math.abs(r)<e?0:null:r/s}static isParallel(t,e,s=g.EPSILON){const r=g.sloped(t),i=g.sloped(e);return r===null&&i===null?!0:r===null||i===null?!1:Math.abs(r-i)<s}static getIntersection(t,e,s=g.EPSILON){if(g.isParallel(t,e))return null;const r=t.p1.x,i=t.p1.y,n=t.p2.x,a=t.p2.y,o=e.p1.x,f=e.p1.y,m=e.p2.x,u=e.p2.y,p=(r-n)*(f-u)-(i-a)*(o-m);if(Math.abs(p)<s)return null;const y=((r-o)*(f-u)-(i-f)*(o-m))/p,b=-((r-n)*(i-f)-(i-a)*(r-o))/p;if(y>=0&&y<=1&&b>=0&&b<=1){const Y=r+y*(n-r),K=i+y*(a-i);return new l(Y,K)}return null}static isIntersecting(t,e){return g.getIntersection(t,e)!==null}static distanceToPoint(t,e,s=g.EPSILON){const r=e.x-t.p1.x,i=e.y-t.p1.y,n=t.p2.x-t.p1.x,a=t.p2.y-t.p1.y,o=r*n+i*a,f=n*n+a*a;let m=-1;f>s&&(m=o/f);let u,p;m<0?(u=t.p1.x,p=t.p1.y):m>1?(u=t.p2.x,p=t.p2.y):(u=t.p1.x+m*n,p=t.p1.y+m*a);const y=e.x-u,b=e.y-p;return Math.hypot(y+b)}p1;p2;constructor(t,e){this.p1=t,this.p2=e}get length(){const t=this.p2.x-this.p1.x,e=this.p2.y-this.p1.y;return Math.sqrt(t*t+e*e)}get midpoint(){const t=(this.p1.x+this.p2.x)/2,e=(this.p1.y+this.p2.y)/2;return new l(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=g.EPSILON){const s=(t.x-this.p1.x)*(this.p2.y-this.p1.y)-(t.y-this.p1.y)*(this.p2.x-this.p1.x);return Math.abs(s)>e?!1:(t.x-this.p1.x)*(t.x-this.p2.x)+(t.y-this.p1.y)*(t.y-this.p2.y)<=e}get direction(){const t=this.length;if(t<g.EPSILON)return new l(0,0);const e=(this.p2.x-this.p1.x)/t,s=(this.p2.y-this.p1.y)/t;return new l(e,s)}get start(){return this.p1}get end(){return this.p2}}class z{static EPSILON=1e-10;name;constructor(t){this.name=t}}class d extends z{static isValid(t,e,s){return t<=0||e<=0||s<=0?!1:t+e>s&&t+s>e&&e+s>t}static area(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle");const r=(t+e+s)/2;return Math.sqrt(r*(r-t)*(r-e)*(r-s))}static getType(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle sides");const r=[t,e,s].sort((o,f)=>o-f),[i,n,a]=r;return Math.abs(i-n)<d.EPSILON&&Math.abs(n-a)<d.EPSILON?"equilateral":Math.abs(i-n)<d.EPSILON||Math.abs(n-a)<d.EPSILON?"isosceles":"scalene"}static getAngles(t,e,s){if(!d.isValid(t,e,s))throw new Error("Invalid triangle sides");const r=Math.acos((e*e+s*s-t*t)/(2*e*s)),i=Math.acos((t*t+s*s-e*e)/(2*t*s)),n=Math.PI-r-i;return[r,i,n]}p1;p2;p3;constructor(t,e,s,r="triangle"){if(super(r),this.p1=t,this.p2=e,this.p3=s,this.areCollinear())throw new Error("Points are collinear, cannot form a triangle")}areCollinear(){return Math.abs((this.p2.x-this.p1.x)*(this.p3.y-this.p1.y)-(this.p3.x-this.p1.x)*(this.p2.y-this.p1.y))<z.EPSILON}get side(){return[l.distance(this.p1,this.p2),l.distance(this.p2,this.p3),l.distance(this.p3,this.p1)]}perimeter(){return d.isValid(this.side[0],this.side[1],this.side[2]),this.side.reduce((t,e)=>t+e,0)}area(){const[t,e,s]=this.side;return d.area(t,e,s)}get type(){const[t,e,s]=this.side;return d.getType(t,e,s)}get angles(){const[t,e,s]=this.side;return d.getAngles(t,e,s)}get centroid(){return new l((this.p1.x+this.p2.x+this.p3.x)/3,(this.p1.y+this.p2.y+this.p3.y)/3)}get incenter(){const[t,e,s]=this.side,r=this.perimeter()/2,i=(t*this.p1.x+e*this.p2.x+s*this.p3.x)/r,n=(t*this.p1.y+e*this.p2.y+s*this.p3.y)/r;return new l(i,n)}get circumcenter(){const t=2*(this.p1.x*(this.p2.y-this.p3.y)+this.p2.x*(this.p3.y-this.p1.y)+this.p3.x*(this.p1.y-this.p2.y));if(Math.abs(t)<d.EPSILON)throw new Error("Cannot calculate circumcenter for collinear points");const e=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p2.y-this.p3.y)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p3.y-this.p1.y)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p1.y-this.p2.y))/t,s=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p3.x-this.p2.x)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p1.x-this.p3.x)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p2.x-this.p1.x))/t;return new l(e,s)}containsPoint(t){const e=d.area(l.distance(t,this.p1),l.distance(t,this.p2),l.distance(this.p1,this.p2)),s=d.area(l.distance(t,this.p2),l.distance(t,this.p3),l.distance(this.p2,this.p3)),r=d.area(l.distance(t,this.p3),l.distance(t,this.p1),l.distance(this.p3,this.p1));return Math.abs(e+s+r-this.area())<d.EPSILON}}class G{static sleep(t){return new Promise(e=>setTimeout(e,t))}static binarySearchTemplate(t,e,s){let r=-1,i=t.length,n;for(;i-r>1;)n=i-(i-r)>>1,s(t[n],e)?i=n:r=n;return i}static singleton(t){let e;const s=new Proxy(t,{construct(r,i,n){return e||(e=Reflect.construct(r,i,n)),e}});return t.prototype.constructor=s,s}}class j{static groupBy(t,e){if(!e)throw new Error("generateKey is required");const s=typeof e=="string"?i=>i[e]:e,r=new Map;for(const[i,n]of t.entries())try{const a=s(n,i,t);if(a==null){console.warn("Invalid key generated for item:",n);continue}const o=r.get(a)??[];o.push(n),r.set(a,o)}catch(a){console.error("Error generating key for item:",n,a)}return Object.fromEntries(r)}static LIS(t){if(!t.length)return[];const e=[[t[0]]];for(let r=1,i=t.length;r<i;r++){const n=t[r];s(n)}function s(r){for(let i=e.length-1;i>=0;i--){const n=e[i],a=n[e[i].length-1];if(a<r){e[i+1]=[...n,r];break}else a>r&&i===0&&(e[i]=[r])}}return e[e.length-1]}static LCP(t){if(!t.length)return"";let e=t[0];for(let s=1;s<t.length;s++)for(;!t[s].startsWith(e);)if(e=e.slice(0,-1),e==="")return"";return e}}function R(h){return h!==null&&(typeof h=="object"||typeof h=="function")}class W{map=new Map;weakMap=new WeakMap;set(t,e){R(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return R(t)?this.weakMap.get(t):this.map.get(t)}has(t){return R(t)?this.weakMap.has(t):this.map.has(t)}}class X{static jsonClone(t){try{return JSON.parse(JSON.stringify(t))}catch{throw new Error("Object is not JSON cloneable")}}static structureClone(t){return structuredClone(t)}static deepClone(t,e=new WeakMap){if(t==null||typeof t!="object")return t;if(e.has(t))return e.get(t);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if(t instanceof Map){const n=new Map;e.set(t,n);for(const[a,o]of t)n.set(this.deepClone(a,e),this.deepClone(o,e));return n}if(t instanceof Set){const n=new Set;e.set(t,n);for(const a of t)n.add(this.deepClone(a,e));return n}if(Array.isArray(t)){const n=new Array(t.length);e.set(t,n);for(let a=0,o=t.length;a<o;a++)n[a]=this.deepClone(t[a],e);return n}if(t instanceof ArrayBuffer)return t.slice(0);const s=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];for(const n of s)if(t instanceof n)return new n(t);if(typeof t=="function")return new Proxy(t,{apply(n,a,o){return n.apply(a,o)},get(n,a){if(a in n)return n[a]}});const r=Object.create(Object.getPrototypeOf(t));e.set(t,r);const i=Object.getOwnPropertyDescriptors(t);for(const[n,a]of Object.entries(i))a.value!==void 0&&(a.value=this.deepClone(a.value,e)),Object.defineProperty(r,n,a);return r}}const $={date:"yyyy-MM-dd",datetime:"yyyy-MM-dd HH:mm:ss",time:"HH:mm:ss",iso:"yyyy-MM-ddTHH:mm:ss.SSS"};class S{static defaultOptions={paddingZero:!1,locale:"en-US"};static setDefaultOptions(t){S.defaultOptions={...S.defaultOptions,...t}}static format(t,e,s={}){const r={...S.defaultOptions,...s},i=S.getDateInfo(t,r);return S.normalizeFormatter(e)(i)}static getDateInfo(t,e){const s=(u,p=2)=>e.paddingZero?u.toString().padStart(p,"0"):u.toString(),r=t.getFullYear(),i=t.getMonth()+1,n=t.getDate(),a=t.getHours(),o=t.getMinutes(),f=t.getSeconds(),m=t.getMilliseconds();return{year:r,month:i,day:n,hour:a,minute:o,second:f,millisecond:m,yyyy:s(r,4),MM:s(i),dd:s(n),HH:s(a),mm:s(o),ss:s(f)}}static normalizeFormatter(t){if(typeof t=="function")return t;if(typeof t!="string")throw new Error("Formatter must be a string or function");t in $&&(t=$[t]);const e={yyyy:"yyyy",MM:"MM",dd:"dd",HH:"HH",mm:"mm",ss:"ss",SSS:"SSS"};return s=>{let r=t;for(const[i,n]of Object.entries(e))r=r.replace(new RegExp(i,"g"),String(s[n]||""));return r}}static formatRelative(t,e=new Date){const s=t.getTime()-e.getTime(),r=Math.abs(s),i=Math.floor(r/1e3),n=Math.floor(i/60),a=Math.floor(n/60),o=Math.floor(a/24);return o>0?s>0?`${o}天后`:`${o}天前`:a>0?s>0?`${a}小时后`:`${a}小时前`:n>0?s>0?`${n}分钟后`:`${n}分钟前`:s>0?"刚刚":""}}class Q{static escape(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}class J{static ROMAN_MAP=new Map([["M",1e3],["CM",900],["D",500],["CD",400],["C",100],["XC",90],["L",50],["XL",40],["X",10],["IX",9],["V",5],["IV",4],["I",1]]);static toInteger(t){if(t.length===0)throw new Error("Input cannot be empty");const e=new Set(["I","V","X","L","C","D","M"]);for(const n of t)if(!e.has(n))throw new Error(`Invalid Roman numeral character: ${n}`);let s=0,r=0;for(;r<t.length;){const n=t.slice(r,r+2);if(this.ROMAN_MAP.has(n))s+=this.ROMAN_MAP.get(n),r+=2;else{const a=t[r],o=this.ROMAN_MAP.get(a);if(!o)throw new Error(`Invalid Roman numeral sequence at position ${r}`);s+=o,r+=1}}if(this.toRoman(s)!==t)throw new Error("Invalid Roman numeral sequence");return s}static toRoman(t){if(t<=0||t>=4e3)throw new Error("Number must be between 1 and 3999");if(!Number.isInteger(t))throw new Error("Number must be an integer");let e="";for(const[s,r]of this.ROMAN_MAP)for(;t>=r;)e+=s,t-=r;return e}}class w{static handleNumRange(t,e=!1,s=Number.MIN_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER){if(e&&!Number.isInteger(t))throw new Error("n must be an integer");if(t<s||t>=r)throw new RangeError(`n must be in the range of ${s} to ${r}`)}static consecutiveSum(t){return w.handleNumRange(t,!0,0,1e8),t*(t+1)/2}static consecutiveSquaresSum(t){return w.handleNumRange(t,!0,0,1e6),t*(t+1)*(2*t+1)/6}static consecutivecubesSum(t){return w.handleNumRange(t,!0,0,1e4),t*(t+1)*(2*t+1)*(3*t*t+3*t-1)/30}static clamp(t,e,s){return s==null?Math.min(t,e):Math.min(Math.max(t,e),s)}static factorial(t){if(w.handleNumRange(t,!0,0,1e3),t<2)return 1;let e=1;for(let s=2;s<=t;s++)e*=s;return e}static fibonacci(t,e=1,s=1){return w.handleNumRange(t,!0,0,1e3),t<2?s:this.fibonacci(t-1,s,s+e)}static fibonacciIterative(t){if(w.handleNumRange(t,!0,0,1e3),t<2)return t;let e=0,s=1;for(let r=2;r<=t;r++)[e,s]=[s,(e+s)%1000000007];return s}static floatEqual(t,e,s=1e-6){return Math.abs(t-e)<s}static fastPower(t,e){if(w.handleNumRange(e,!0,0,10),w.handleNumRange(t,!1,0,1e3),t===0)return 0;if(e===0)return 1;const s=this.fastPower(t,e>>1);return e%2===0?s*s:s*s*t}static fastSqrt(t){if(w.handleNumRange(t,!1,0,1e8),typeof BigInt>"u")return Math.sqrt(t);const e=.5*t,s=new ArrayBuffer(8);new Float64Array(s)[0]=t;let r=new BigInt64Array(s)[0];r=0x1ff7a3bea91d9b1bn+(r>>1n);const i=new ArrayBuffer(8);new BigInt64Array(i)[0]=r;let n=new Float64Array(i)[0];return n=n*.5+e/n,n=n*.5+e/n,n=n*.5+e/n,n}static getPercentWithPrecision(t,e=2){if(!Array.isArray(t)||t.length===0)return[];if(e<0||!Number.isInteger(e))throw new Error("Precision must be a non-negative integer");const s=t.reduce((u,p)=>u+p,0);if(s===0)return t.map(()=>"0%");const i=100*Math.pow(10,e),n=t.map(u=>u/s*i),a=n.map(u=>Math.floor(u)),o=n.map((u,p)=>u-a[p]);let f=a.reduce((u,p)=>u+p,0),m=i-f;for(;m>0;){let u=-1,p=-1;for(let y=0;y<o.length;y++)o[y]>p&&(p=o[y],u=y);if(u===-1)break;a[u]++,o[u]=0,m--}return a.map(u=>`${(u/i*100).toFixed(e)}%`)}static gcd(t,e){return e===0?t:this.gcd(e,t%e)}static isValidPositiveInteger(t){return Number.isInteger(t)&&t>0&&t<=Number.MAX_SAFE_INTEGER}static isPowerOfTwo(t){return t>0&&(t&t-1)===0}static isOdd(t){return t%2===1||t%2===-1}static isPrime(t){if(t<=1)return!1;for(let e=2;e<=Math.sqrt(t);e++)if(t%e===0)return!1;return!0}static isPalindrome(t){if(t<0||t%10===0&&t!==0)return!1;let e=0,s=t;for(;t>0;){const r=t%10;e=e*10+r,t=Math.floor(t/10)}return s===e}static isArmstrong(t){const e=t.toString(),s=e.length;let r=0;for(let i=0;i<s;i++)r+=Math.pow(parseInt(e[i]),s);return r===t}static isHappy(t){const e=new Set;for(;t!==1;){if(e.has(t))return!1;e.add(t),t=(t+"").split("").reduce((s,r)=>s+Number(r)*Number(r),0)}return!0}static isPerfect(t){let e=0;for(let s=1;s<t;s++)t%s===0&&(e+=s);return e===t}static isSameSign(t,e){return t>=0&&e>=0||t<=0&&e<=0}static isRange(t,e,s){if(s==null&&(s=e,e=0),e>=s)throw new Error("The maximum value must be greater than the minimum value");return e<=t&&t<s}static lcm(t,e){return t*e/this.gcd(t,e)}static middle(t,e){return e-(e-t>>1)}static random(t,e){if(e==null&&(e=t,t=0),t>=e)throw new Error("The maximum value must be greater than the minimum value");return Math.random()*(e-t)+t}static randomInt(t,e){return Math.floor(this.random(t,e))}static round(t,e=0){if(!Number.isInteger(e))throw new Error("precision must be an integer");const s=Math.pow(10,e);return Math.round(t*s)/s}static scale(t,e,s){if(e[0]>=e[1]||s[0]>=s[1])throw new Error("Invalid range");t=this.clamp(t,e[0],e[1]);const r=e[1]-e[0];return(t-e[0])*((s[1]-s[0])/r)+s[0]}}class _{static READ=1;static WRITE=2;static SHARE=4;static DELETE=8;static CREATE=16;static include(t,e){return(t&e)===e}static add(t,e){return t|e}static remove(t,e){return t&~e}static toggle(t,e){return t^e}}class x{static frequencyStatistics(t){return[...t].reduce((e,s)=>(e[s]=(e[s]||0)+1,e),{})}static isValidBracket(t){const e=[],s={"(":")","[":"]","{":"}"},r=new Set(Object.values(s));for(const i of t)if(i in s)e.push(s[i]);else if(r.has(i)&&i!==e.pop())return!1;return e.length===0}static random(t=8){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let s="";for(let r=0;r<t;r++)s+=e.charAt(Math.floor(Math.random()*e.length));return s}static template(t,e){return t.replace(/\${(\w+)}/g,(s,r)=>e[r]||"")}static escapeHtml(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"," ":"&nbsp;","±":"&plusmn;","×":"&times;","÷":"&divide;","≠":"&ne;","≤":"&le;","≥":"&ge;"},s=new RegExp(`[${Object.keys(e).join("")}]`,"g");return t.replace(s,r=>e[r])}static isEmail(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}static isUrl(t){try{return new URL(t),!0}catch{return!1}}static pointLength(t){let e=0;for(let s=0,r=t.length;s<r;){const i=t.codePointAt(s);s+=i>65535?2:1,e++}return e}static pointAt(t,e){if(e>=x.pointLength(t))return;let s=0;for(let r=0,i=t.length;r<i;){const n=t.codePointAt(r);if(!n)return;if(s===e)return String.fromCodePoint(n);r+=n>65535?2:1,s++}}static sliceByPoint(t,e,s=x.pointLength(t)){let r="";for(let i=e;i<s;i++)r+=x.pointAt(t,i);return r}static capitalize(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}static reverse(t){return t.split("").reverse().join("")}static truncate(t,e,s="..."){return t.length<=e?this:t.slice(0,e-s.length)+s}static isPalindrome(t){return t.toLowerCase().replace(/[^a-z0-9]/g,"")===x.reverse(t)}static count(t,e){const s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(t.match(new RegExp(s,"g"))||[]).length}static toCamelCase(t){return t.replace(/_([a-z])/g,(e,s)=>s.toUpperCase())}static toSnakeCase(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}}class Z{static isValidHex(t){return/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(t)}static isValidRGB(t){return/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(t)}}const A={AUTH_UNAUTHORIZED:"未授权事件",AUTH_LOGIN_SUCCESS:"登录成功事件",AUTH_LOGOUT:"注销事件",AUTH_TOKEN_EXPIRED:"令牌过期事件",REQUEST_ERROR:"请求错误事件",REQUEST_TIMEOUT:"请求超时事件",REQUEST_NETWORK_ERROR:"网络错误事件",UI_SHOW_LOADING:"显示加载事件",UI_HIDE_LOADING:"隐藏加载事件",UI_SHOW_MESSAGE:"显示消息事件"};class v{static instance=null;listeners={};debugMode;constructor(t=!1){this.debugMode=t,Object.keys(A).forEach(e=>{this.listeners[e]=new Set})}static getInstance(t){return v.instance||(v.instance=new v(t)),v.instance}on(t,e){this.debugLog(`添加事件监听: ${A[t]}`),this.listeners[t].add(e)}emit(t,e){this.debugLog(`触发事件: ${A[t]}`,e),this.listeners[t].forEach(s=>{try{s(e)}catch(r){console.error(`事件 ${A[t]} 处理出错:`,r)}})}off(t,e){this.debugLog(`移除事件监听: ${A[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${A[t]}`);const s=r=>{e(r),this.off(t,s)};this.on(t,s)}clear(){this.debugLog("清除所有事件监听器"),Object.values(this.listeners).forEach(t=>t.clear())}getListenerCount(t){return this.listeners[t].size}debugLog(t,e){this.debugMode&&console.log(`[EventEmitter] ${t}`,e||"")}}c.Arr=j,c.BitPerm=_,c.Color=Z,c.DateEx=S,c.Dictionary=C,c.Emitter=v,c.Func=G,c.Graph=B,c.LRU=q,c.Line=g,c.LinkedList=T,c.Matrix=M,c.MaxHeap=D,c.MemoizeMap=W,c.MinHeap=k,c.MinStack=V,c.Num=w,c.Obj=X,c.Point=l,c.Queue=O,c.Reg=Q,c.Roman=J,c.Stack=H,c.Str=x,c.Triangle=d,c.Vector=E,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
package/index.d.ts CHANGED
@@ -553,7 +553,7 @@ declare module "jc-structure" {
553
553
  /**
554
554
  * ### 缓存类
555
555
  */
556
- export class MemoizeMap {
556
+ interface MemoizeMap {
557
557
  /**
558
558
  * 根据键的类型,判断缓存在 Map 还是 WeakMap中
559
559
  * @param key 键值
@@ -571,11 +571,19 @@ declare module "jc-structure" {
571
571
  */
572
572
  has(key: unknown): boolean;
573
573
  }
574
+ interface MemoizeMapConstructor {
575
+ new (): MemoizeMap;
576
+ readonly prototype: MemoizeMap;
577
+ }
578
+ declare var MemoizeMap: MemoizeMapConstructor;
574
579
 
580
+ interface Num extends Number {}
575
581
  /**
576
- * ### 数字类,继承自Number
582
+ * ### 数字类
577
583
  */
578
- interface NumConstructor extends NumberConstructor {
584
+ interface NumConstructor {
585
+ new (value?: any): Num;
586
+ readonly prototype: Num;
579
587
  /**
580
588
  * #### 判断是否是有效的正整数
581
589
  * @param n A numeric value
@@ -816,7 +824,46 @@ declare module "jc-structure" {
816
824
  }
817
825
  declare var BitPer: BitPerConstructor;
818
826
 
819
- interface Str extends String {
827
+ interface Str extends String {}
828
+ interface StrConstructor {
829
+ new (value?: string): Str;
830
+ readonly prototype: Str;
831
+ /**
832
+ * #### 根据字符串频率统计
833
+ * @param s
834
+ */
835
+ frequencyStatistics(s: string): { [key: string]: number };
836
+ /**
837
+ * #### 是否是成对的括号
838
+ * @param str
839
+ */
840
+ isValidBracket(str: string): boolean;
841
+ /**
842
+ * #### 根据长度获取随机字符串
843
+ * @param length 长度 默认为:8
844
+ */
845
+ random(length?: number): string;
846
+ /**
847
+ * #### 生成模板字符串
848
+ * @param template 模板字符串
849
+ * @param values
850
+ */
851
+ template(template: string, values: Record<string, any>): string;
852
+ /**
853
+ * #### 转义HTML标签
854
+ * @param str 字符串
855
+ */
856
+ escapeHtml(str: string): string;
857
+ /**
858
+ * #### 判断是否是邮箱号码
859
+ * @param str
860
+ */
861
+ isEmail(str: string): boolean;
862
+ /**
863
+ * #### 判断是否是URL
864
+ * @param str
865
+ */
866
+ isUrl(str: string): boolean;
820
867
  /**
821
868
  * #### 获取字符串码点长度
822
869
  */
@@ -864,46 +911,6 @@ declare module "jc-structure" {
864
911
  */
865
912
  toSnakeCase(): string;
866
913
  }
867
- interface StrConstructor extends StringConstructor {
868
- new (value?: any): Str;
869
- readonly prototype: Str;
870
- /**
871
- * #### 根据字符串频率统计
872
- * @param s
873
- */
874
- frequencyStatistics(s: string): { [key: string]: number };
875
- /**
876
- * #### 是否是成对的括号
877
- * @param str
878
- */
879
- isValidBracket(str: string): boolean;
880
- /**
881
- * #### 根据长度获取随机字符串
882
- * @param length 长度 默认为:8
883
- */
884
- random(length?: number): string;
885
- /**
886
- * #### 生成模板字符串
887
- * @param template 模板字符串
888
- * @param values
889
- */
890
- template(template: string, values: Record<string, any>): string;
891
- /**
892
- * #### 转义HTML标签
893
- * @param str 字符串
894
- */
895
- escapeHtml(str: string): string;
896
- /**
897
- * #### 判断是否是邮箱号码
898
- * @param str
899
- */
900
- isEmail(str: string): boolean;
901
- /**
902
- * #### 判断是否是URL
903
- * @param str
904
- */
905
- isUrl(str: string): boolean;
906
- }
907
914
  declare var Str: StrConstructor;
908
915
 
909
916
  interface RegConstructor {
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "jc-structure",
3
3
  "private": false,
4
- "version": "0.1.22",
4
+ "version": "0.2.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
8
8
  "index.d.ts",
9
- "types",
10
9
  "README.md",
11
10
  "LICENSE"
12
11
  ],
@@ -1,50 +0,0 @@
1
- /**
2
- * #### 字典接口
3
- */
4
- interface IDictionary<K, V> extends Structure {
5
- /**
6
- * #### 设置键值对
7
- * @param key 键
8
- * @param value 值
9
- */
10
- set(key: K, value: V): void;
11
-
12
- /**
13
- * #### 删除键值对
14
- * @param key 键
15
- */
16
- remove(key: K): ValuePair<K, V> | undefined;
17
-
18
- /**
19
- * #### 判断键是否存在
20
- * @param key 键
21
- */
22
- has(key: K): boolean;
23
-
24
- /**
25
- * #### 获取键值对
26
- * @param key 键
27
- */
28
- get(key: K): ValuePair<K, V> | undefined;
29
-
30
- /**
31
- * #### 获取键数组
32
- */
33
- keys(): Array<K>;
34
-
35
- /**
36
- * #### 获取值数组
37
- */
38
- values(): Array<V>;
39
-
40
- /**
41
- * #### 获取键值对数组
42
- */
43
- keyValues(): Array<[K, V]>;
44
-
45
- /**
46
- * 遍历键值对
47
- * @param callbackFunc 回调函数
48
- */
49
- forEach(callbackFunc: (key: K, value: V) => boolean | void): void;
50
- }
package/types/global.d.ts DELETED
@@ -1,75 +0,0 @@
1
- interface Structure {
2
- /**
3
- * 判断数据结构是否为空
4
- */
5
- isEmpty(): boolean;
6
- /**
7
- * 数据结构元素长度
8
- */
9
- size(): number;
10
- /**
11
- * 清除数据结构元素
12
- */
13
- clear(): void;
14
- /**
15
- * 重写 toString 方法
16
- */
17
- toString(): string;
18
- }
19
-
20
- type CompareResult = -1 | 0 | 1;
21
-
22
- /**
23
- * #### 比较函数接口
24
- */
25
- interface CompareFn<T> {
26
- (a: T, b: T): CompareResult;
27
- }
28
-
29
- /**
30
- * #### 对象接口,用于存储数据结构元素,值类型默认为 any
31
- */
32
- interface Obj<V = any> {
33
- [key: string]: V;
34
- }
35
-
36
- interface RegExpConstructor {
37
- /**
38
- * #### 转义正则表达式中的特殊字符
39
- * @param str 字符串
40
- */
41
- escape(str: string): string;
42
- }
43
-
44
- interface Element {
45
- /**
46
- * #### 获取最深元素集合中的第一个元素
47
- */
48
- readonly firstElement: Element | null;
49
- /**
50
- * #### 获取最深元素集合中的最后一个元素
51
- */
52
- readonly lastElement: Element | null;
53
- /**
54
- * #### 最祖先的匹配元素
55
- * @param this element
56
- * @param selector 选择器
57
- */
58
- farthest<E extends Element = Element>(this: E, selector: string): E | null;
59
- }
60
-
61
- interface Text {
62
- /**
63
- * #### 将文本节点包裹在指定标签中
64
- * @param this Text 该文本节点
65
- * @param selector 要包裹的元素标签,默认为:'strong'
66
- * @param text 要包裹的文本,默认为:''
67
- */
68
- surround(this: Text, selector?: string, text?: string): HTMLElement | null;
69
- }
70
-
71
- interface Array<T> {
72
- groupBy<K extends string | number | symbol>(
73
- generateKey: string | ((item: T, index: number, arr: T[]) => K)
74
- ): Record<K, T[]>;
75
- }
package/types/graph.d.ts DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * #### 图接口
3
- */
4
- interface IGraph<T> {
5
- /**
6
- * #### 添加顶点的方法
7
- * @param v 顶点
8
- */
9
- addVertex(v: T): void;
10
- /**
11
- * #### 添加边的方法
12
- * @param v 顶点
13
- * @param w
14
- */
15
- addEdge(v: T, w: T): void;
16
- /**
17
- * #### 获取顶点集合的方法
18
- */
19
- getVertices(): Array<T>;
20
- /**
21
- * #### 获取邻接表的方法
22
- */
23
- getAdjacencyList(): IDictionary<T, Array<T>>;
24
- }
package/types/heap.d.ts DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * #### 堆
3
- */
4
- interface IHeap<T> extends Structure {
5
- /**
6
- * #### 插入一个值,返回一个布尔值
7
- * @param value 要插入的值
8
- */
9
- insert(value: T): boolean;
10
-
11
- /**
12
- * #### 移除最小值或最大值,返回该值
13
- */
14
- extract(): T | undefined;
15
-
16
- /**
17
- * 查找一个值
18
- * @param value 要查找的值
19
- */
20
- find(): T | undefined;
21
- }
@@ -1,47 +0,0 @@
1
- /**
2
- * #### 链表接口
3
- */
4
- interface ILinkedList<T> extends Structure {
5
- /**
6
- * #### 向链表中添加元素
7
- * @param element 要添加的元素
8
- */
9
- push(element: T): void;
10
-
11
- /**
12
- * #### 在指定位置插入元素
13
- * @param element 要插入的元素
14
- * @param index 插入的位置索引
15
- */
16
- insert(element: T, index: number): void;
17
-
18
- /**
19
- * #### 获取指定位置的节点
20
- * @param index 指定位置索引
21
- */
22
- getElementAt(index: number): Node<T> | undefined;
23
-
24
- /**
25
- * #### 获取指定位置的值
26
- * @param index 指定位置索引
27
- */
28
- getValueAt(index: number): T | undefined;
29
-
30
- /**
31
- * #### 移除指定位置的元素
32
- * @param index 指定位置索引
33
- */
34
- removeAt(index: number): T | undefined;
35
-
36
- /**
37
- * #### 移除指定元素
38
- * @param element 指定元素
39
- */
40
- remove(element: T): T | undefined;
41
-
42
- /**
43
- * #### 获取指定元素的索引
44
- * @param element 指定元素
45
- */
46
- indexOf(element: T): number | undefined;
47
- }
package/types/queue.d.ts DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * #### 队列接口
3
- */
4
- interface IQueue<T> extends Structure {
5
- /**
6
- * #### 移除队列头部元素并返回该元素
7
- */
8
- dequeue(): T | undefined;
9
-
10
- /**
11
- * #### 向队列末尾添加元素
12
- * @param args 要添加的元素
13
- */
14
- enqueue(...args: (T | T[])[]): this;
15
-
16
- /**
17
- * #### 返回队列头部元素,但不移除
18
- */
19
- front(): T | undefined;
20
- }
package/types/shape.d.ts DELETED
@@ -1,11 +0,0 @@
1
- interface Point {
2
- x: number;
3
- y: number;
4
- }
5
- type Coord = Point;
6
- type Coord3D = Point & { z: number };
7
-
8
- interface Rect extends Point {
9
- w: number;
10
- h: number;
11
- }
package/types/stack.d.ts DELETED
@@ -1,24 +0,0 @@
1
- interface StructureObj<T> {
2
- [key: number]: T;
3
- }
4
-
5
- /**
6
- * #### 栈接口
7
- */
8
- interface IStack<T> extends Structure {
9
- /**
10
- * #### 移除栈顶元素并返回该元素
11
- */
12
- pop(): T | undefined;
13
-
14
- /**
15
- * #### 添加一个或多个元素
16
- * @param items
17
- */
18
- push(...items: (T | T[])[]): this;
19
-
20
- /**
21
- * #### 返回栈顶元素,但不移除
22
- */
23
- peek(): T | undefined;
24
- }
package/types/vector.d.ts DELETED
@@ -1,20 +0,0 @@
1
- interface Vector {
2
- get dimension(): number;
3
- get norm(): number;
4
- getItem(index: number): number;
5
- normalize(): Vector;
6
- add(vector: Vector): Vector;
7
- sub(vector: Vector): Vector;
8
- mul(scalar: number): Vector;
9
- dot(vector: Vector): number;
10
- pos(): Vector;
11
- neg(): Vector;
12
- }
13
-
14
- interface VectorConstructor {
15
- new (...args: number[]): Vector;
16
- readonly prototype: Vector;
17
- zero(dimension: number): Vector;
18
- }
19
-
20
- declare var Vector: VectorConstructor;