jc-structure 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jc-structure.js +76 -61
- package/dist/jc-structure.umd.cjs +2 -2
- package/index.d.ts +11 -6
- package/package.json +1 -1
- package/types/stack.d.ts +4 -3
package/dist/jc-structure.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class V {
|
|
2
2
|
items = {};
|
|
3
3
|
count = 0;
|
|
4
4
|
lowestCount = 0;
|
|
@@ -50,34 +50,19 @@ class U {
|
|
|
50
50
|
const t = this.items[this.count];
|
|
51
51
|
return delete this.items[this.count], t;
|
|
52
52
|
}
|
|
53
|
-
push(
|
|
54
|
-
|
|
55
|
-
return this;
|
|
56
|
-
const e = this.extractItems(t);
|
|
57
|
-
return this.addValidItems(e), this;
|
|
53
|
+
push(t) {
|
|
54
|
+
return t == null || t == null ? this : Array.isArray(t) ? this.addItems(t) : this.addItem(t);
|
|
58
55
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
*/
|
|
64
|
-
extractItems(t) {
|
|
65
|
-
return t.length === 1 && Array.isArray(t[0]) ? t[0] : t;
|
|
56
|
+
addItem(t) {
|
|
57
|
+
if (!this.isValidItem(t))
|
|
58
|
+
throw new Error("Invalid item: item cannot be null or undefined");
|
|
59
|
+
return this.items[this.count] = t, this.count++, this;
|
|
66
60
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
addValidItems(t) {
|
|
72
|
-
t.forEach((e) => {
|
|
73
|
-
this.isValidItem(e) && (this.items[this.count] = e, this.count++);
|
|
74
|
-
});
|
|
61
|
+
addItems(t) {
|
|
62
|
+
return t.filter((s) => this.isValidItem(s)).forEach((s) => {
|
|
63
|
+
this.items[this.count] = s, this.count++;
|
|
64
|
+
}), this;
|
|
75
65
|
}
|
|
76
|
-
/**
|
|
77
|
-
* 验证元素是否有效
|
|
78
|
-
* @param item 要验证的元素
|
|
79
|
-
* @returns 是否有效
|
|
80
|
-
*/
|
|
81
66
|
isValidItem(t) {
|
|
82
67
|
return t != null;
|
|
83
68
|
}
|
|
@@ -97,13 +82,42 @@ class U {
|
|
|
97
82
|
return this.isEmpty() ? "" : `Stack(count: ${this.count}):[${this.items[this.count - 1]},...rest]`;
|
|
98
83
|
}
|
|
99
84
|
}
|
|
100
|
-
|
|
85
|
+
class $ {
|
|
86
|
+
stack = [];
|
|
87
|
+
minStack = [];
|
|
88
|
+
push(t) {
|
|
89
|
+
this.stack.push(t), (this.minStack.length === 0 || t <= this.minStack[this.minStack.length - 1]) && this.minStack.push(t);
|
|
90
|
+
}
|
|
91
|
+
pop() {
|
|
92
|
+
const t = this.stack.pop();
|
|
93
|
+
return t === this.minStack[this.minStack.length - 1] && this.minStack.pop(), t;
|
|
94
|
+
}
|
|
95
|
+
peek() {
|
|
96
|
+
return this.stack[this.stack.length - 1];
|
|
97
|
+
}
|
|
98
|
+
getMin() {
|
|
99
|
+
return this.minStack[this.minStack.length - 1];
|
|
100
|
+
}
|
|
101
|
+
isEmpty() {
|
|
102
|
+
return this.size() === 0;
|
|
103
|
+
}
|
|
104
|
+
size() {
|
|
105
|
+
return this.stack.length;
|
|
106
|
+
}
|
|
107
|
+
clear() {
|
|
108
|
+
this.stack = [], this.minStack = [];
|
|
109
|
+
}
|
|
110
|
+
toString() {
|
|
111
|
+
return this.isEmpty() ? "" : `MinStack(count: ${this.size()}):[${this.getMin()},...rest]`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function C(r, t) {
|
|
101
115
|
return r === t ? 0 : r < t ? -1 : 1;
|
|
102
116
|
}
|
|
103
117
|
class w {
|
|
104
118
|
heap = [];
|
|
105
119
|
compareFn;
|
|
106
|
-
constructor(t =
|
|
120
|
+
constructor(t = C) {
|
|
107
121
|
this.compareFn = t;
|
|
108
122
|
}
|
|
109
123
|
static getLeftIndex(t) {
|
|
@@ -134,7 +148,7 @@ class w {
|
|
|
134
148
|
return this.heap.toString();
|
|
135
149
|
}
|
|
136
150
|
}
|
|
137
|
-
class
|
|
151
|
+
class P extends w {
|
|
138
152
|
insert(t) {
|
|
139
153
|
return t ? !1 : (this.heap.push(t), this.siftUp(this.heap.length - 1), !0);
|
|
140
154
|
}
|
|
@@ -154,12 +168,12 @@ class R extends w {
|
|
|
154
168
|
w.swap(this.heap, e, t), t = e, e = w.getParentIndex(t);
|
|
155
169
|
}
|
|
156
170
|
}
|
|
157
|
-
class q extends
|
|
158
|
-
constructor(t = (e, s) =>
|
|
171
|
+
class q extends P {
|
|
172
|
+
constructor(t = (e, s) => C(s, e)) {
|
|
159
173
|
super(t);
|
|
160
174
|
}
|
|
161
175
|
}
|
|
162
|
-
function
|
|
176
|
+
function R(r) {
|
|
163
177
|
return { value: r };
|
|
164
178
|
}
|
|
165
179
|
class _ {
|
|
@@ -192,14 +206,14 @@ class _ {
|
|
|
192
206
|
}
|
|
193
207
|
update(t, e) {
|
|
194
208
|
let s = this.lookup.get(t);
|
|
195
|
-
s ? (this.detach(s), this.prepend(s), s.value = e) : (s =
|
|
209
|
+
s ? (this.detach(s), this.prepend(s), s.value = e) : (s = R(e), this.length++, this.prepend(s), this.trimCache(), this.lookup.set(t, s), this.reverseLookup);
|
|
196
210
|
}
|
|
197
211
|
}
|
|
198
212
|
let A = class {
|
|
199
213
|
value;
|
|
200
214
|
next = void 0;
|
|
201
215
|
};
|
|
202
|
-
class
|
|
216
|
+
class H {
|
|
203
217
|
count = 0;
|
|
204
218
|
head = void 0;
|
|
205
219
|
constructor() {
|
|
@@ -288,7 +302,7 @@ class z {
|
|
|
288
302
|
function L(r, t = { emptyString: !1, zeroNumber: !1 }) {
|
|
289
303
|
return r == null ? !(t.emptyString && r === "" || t.zeroNumber && r === 0) : !1;
|
|
290
304
|
}
|
|
291
|
-
class
|
|
305
|
+
class j {
|
|
292
306
|
table = [];
|
|
293
307
|
constructor() {
|
|
294
308
|
}
|
|
@@ -358,12 +372,12 @@ class V {
|
|
|
358
372
|
return t = t.slice(0, -1), t;
|
|
359
373
|
}
|
|
360
374
|
}
|
|
361
|
-
class
|
|
375
|
+
class W {
|
|
362
376
|
isDirected;
|
|
363
377
|
vertices;
|
|
364
378
|
adjList;
|
|
365
379
|
constructor(t = !1) {
|
|
366
|
-
this.isDirected = t, this.vertices = [], this.adjList = new
|
|
380
|
+
this.isDirected = t, this.vertices = [], this.adjList = new j();
|
|
367
381
|
}
|
|
368
382
|
addVertex(t) {
|
|
369
383
|
this.vertices.includes(t) || (this.vertices.push(t), this.adjList.set(t, []));
|
|
@@ -550,8 +564,8 @@ class l {
|
|
|
550
564
|
if (Math.abs(f) < s) return null;
|
|
551
565
|
const y = ((i - u) * (p - m) - (n - p) * (u - d)) / f, S = -((i - o) * (n - p) - (n - h) * (i - u)) / f;
|
|
552
566
|
if (y >= 0 && y <= 1 && S >= 0 && S <= 1) {
|
|
553
|
-
const
|
|
554
|
-
return new a(
|
|
567
|
+
const N = i + y * (o - i), O = n + y * (h - n);
|
|
568
|
+
return new a(N, O);
|
|
555
569
|
}
|
|
556
570
|
return null;
|
|
557
571
|
}
|
|
@@ -601,14 +615,14 @@ class l {
|
|
|
601
615
|
return this.p2;
|
|
602
616
|
}
|
|
603
617
|
}
|
|
604
|
-
class
|
|
618
|
+
class k {
|
|
605
619
|
static EPSILON = 1e-10;
|
|
606
620
|
name;
|
|
607
621
|
constructor(t) {
|
|
608
622
|
this.name = t;
|
|
609
623
|
}
|
|
610
624
|
}
|
|
611
|
-
class c extends
|
|
625
|
+
class c extends k {
|
|
612
626
|
static isValid(t, e, s) {
|
|
613
627
|
return t <= 0 || e <= 0 || s <= 0 ? !1 : t + e > s && t + s > e && e + s > t;
|
|
614
628
|
}
|
|
@@ -641,7 +655,7 @@ class c extends C {
|
|
|
641
655
|
areCollinear() {
|
|
642
656
|
return Math.abs(
|
|
643
657
|
(this.p2.x - this.p1.x) * (this.p3.y - this.p1.y) - (this.p3.x - this.p1.x) * (this.p2.y - this.p1.y)
|
|
644
|
-
) <
|
|
658
|
+
) < k.EPSILON;
|
|
645
659
|
}
|
|
646
660
|
get side() {
|
|
647
661
|
return [
|
|
@@ -699,10 +713,10 @@ class c extends C {
|
|
|
699
713
|
return Math.abs(e + s + i - this.area()) < c.EPSILON;
|
|
700
714
|
}
|
|
701
715
|
}
|
|
702
|
-
function
|
|
716
|
+
function T(r) {
|
|
703
717
|
return new Promise((t) => setTimeout(t, r));
|
|
704
718
|
}
|
|
705
|
-
function
|
|
719
|
+
function F(r) {
|
|
706
720
|
const t = [], e = {
|
|
707
721
|
"(": ")",
|
|
708
722
|
"[": "]",
|
|
@@ -718,7 +732,7 @@ function T(r) {
|
|
|
718
732
|
function M(r) {
|
|
719
733
|
return r !== null && (typeof r == "object" || typeof r == "function");
|
|
720
734
|
}
|
|
721
|
-
class
|
|
735
|
+
class G {
|
|
722
736
|
map = /* @__PURE__ */ new Map();
|
|
723
737
|
weakMap = /* @__PURE__ */ new WeakMap();
|
|
724
738
|
set(t, e) {
|
|
@@ -731,7 +745,7 @@ class F {
|
|
|
731
745
|
return M(t) ? this.weakMap.has(t) : this.map.has(t);
|
|
732
746
|
}
|
|
733
747
|
}
|
|
734
|
-
function
|
|
748
|
+
function B(r) {
|
|
735
749
|
if (!r.length) return [];
|
|
736
750
|
const t = [[r[0]]];
|
|
737
751
|
for (let s = 1, i = r.length; s < i; s++) {
|
|
@@ -749,7 +763,7 @@ function G(r) {
|
|
|
749
763
|
}
|
|
750
764
|
return t[t.length - 1];
|
|
751
765
|
}
|
|
752
|
-
class
|
|
766
|
+
class X {
|
|
753
767
|
static ROMAN_MAP = /* @__PURE__ */ new Map([
|
|
754
768
|
["M", 1e3],
|
|
755
769
|
["CM", 900],
|
|
@@ -800,7 +814,7 @@ class B {
|
|
|
800
814
|
return e;
|
|
801
815
|
}
|
|
802
816
|
}
|
|
803
|
-
function
|
|
817
|
+
function Q(r) {
|
|
804
818
|
let t;
|
|
805
819
|
const e = new Proxy(r, {
|
|
806
820
|
construct(s, i, n) {
|
|
@@ -1038,7 +1052,7 @@ class I {
|
|
|
1038
1052
|
return t.replace(b.scriptRegex, "").replace(b.javascriptRegex, "").replace(b.eventHandlerRegex, "");
|
|
1039
1053
|
}
|
|
1040
1054
|
}
|
|
1041
|
-
class
|
|
1055
|
+
class K {
|
|
1042
1056
|
features;
|
|
1043
1057
|
constructor() {
|
|
1044
1058
|
this.features = this.detectFeatures();
|
|
@@ -1193,26 +1207,27 @@ Text.prototype.surround = function(r = "strong", t = "") {
|
|
|
1193
1207
|
return n && (u.className = n), h.surroundContents(u), u;
|
|
1194
1208
|
};
|
|
1195
1209
|
export {
|
|
1196
|
-
|
|
1210
|
+
j as Dictionary,
|
|
1197
1211
|
I as DomHelper,
|
|
1198
1212
|
v as Emitter,
|
|
1199
|
-
|
|
1200
|
-
|
|
1213
|
+
W as Graph,
|
|
1214
|
+
B as LIS,
|
|
1201
1215
|
_ as LRU,
|
|
1202
1216
|
l as Line,
|
|
1203
|
-
|
|
1217
|
+
H as LinkedList,
|
|
1204
1218
|
E as Matrix,
|
|
1205
1219
|
q as MaxHeap,
|
|
1206
|
-
|
|
1207
|
-
|
|
1220
|
+
G as MemoizeMap,
|
|
1221
|
+
P as MinHeap,
|
|
1222
|
+
$ as MinStack,
|
|
1208
1223
|
a as Point,
|
|
1209
|
-
|
|
1210
|
-
|
|
1224
|
+
V as Queue,
|
|
1225
|
+
X as Roman,
|
|
1211
1226
|
U as Stack,
|
|
1212
1227
|
c as Triangle,
|
|
1213
1228
|
g as Vector,
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1229
|
+
K as WebAppManager,
|
|
1230
|
+
F as isValidBracket,
|
|
1231
|
+
Q as singleton,
|
|
1232
|
+
T as sleep
|
|
1218
1233
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(a,
|
|
2
|
-
`;return t}}class d{_data;static zero(t){return new d(...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 d(...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,i)=>s+t._data[i]);return new d(...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,i)=>s-t._data[i]);return new d(...e)}mul(t){return new d(...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,i)=>e+s*t._data[i],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class w{_matrix;static zero(t,e){return new w(Array.from({length:t},()=>Array.from({length:e},()=>0)))}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 d(...this._matrix[t])}colVector(t){return new d(...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 w(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 w(this._matrix.map((e,s)=>e.map((i,n)=>i+t.getItem([s,n]))))}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 w(this._matrix.map(e=>e.map((s,i)=>s*t.getItem(i))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=w.zero(this.row,t.col);for(let s=0;s<this.row;s++){const i=this.rowVector(s);for(let n=0;n<this.col;n++)e.setItem([s,n],i.dot(t.colVector(n)))}return e}}class h{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 h.distance(this,t)}}class p{static EPSILON=1e-10;static sloped(t,e=p.EPSILON){const s=t.p2.x-t.p1.x,i=t.p2.y-t.p1.y;return Math.abs(s)<e?Math.abs(i)<e?0:null:i/s}static isParallel(t,e,s=p.EPSILON){const i=p.sloped(t),n=p.sloped(e);return i===null&&n===null?!0:i===null||n===null?!1:Math.abs(i-n)<s}static getIntersection(t,e,s=p.EPSILON){if(p.isParallel(t,e))return null;const i=t.p1.x,n=t.p1.y,o=t.p2.x,u=t.p2.y,l=e.p1.x,f=e.p1.y,g=e.p2.x,E=e.p2.y,m=(i-o)*(f-E)-(n-u)*(l-g);if(Math.abs(m)<s)return null;const I=((i-l)*(f-E)-(n-f)*(l-g))/m,L=-((i-o)*(n-f)-(n-u)*(i-l))/m;if(I>=0&&I<=1&&L>=0&&L<=1){const X=i+I*(o-i),Q=n+I*(u-n);return new h(X,Q)}return null}static isIntersecting(t,e){return p.getIntersection(t,e)!==null}static distanceToPoint(t,e,s=p.EPSILON){const i=e.x-t.p1.x,n=e.y-t.p1.y,o=t.p2.x-t.p1.x,u=t.p2.y-t.p1.y,l=i*o+n*u,f=o*o+u*u;let g=-1;f>s&&(g=l/f);let E,m;g<0?(E=t.p1.x,m=t.p1.y):g>1?(E=t.p2.x,m=t.p2.y):(E=t.p1.x+g*o,m=t.p1.y+g*u);const I=e.x-E,L=e.y-m;return Math.hypot(I+L)}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 h(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=p.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<p.EPSILON)return new h(0,0);const e=(this.p2.x-this.p1.x)/t,s=(this.p2.y-this.p1.y)/t;return new h(e,s)}get start(){return this.p1}get end(){return this.p2}}class k{static EPSILON=1e-10;name;constructor(t){this.name=t}}class c extends k{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(!c.isValid(t,e,s))throw new Error("Invalid triangle");const i=(t+e+s)/2;return Math.sqrt(i*(i-t)*(i-e)*(i-s))}static getType(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=[t,e,s].sort((l,f)=>l-f),[n,o,u]=i;return Math.abs(n-o)<c.EPSILON&&Math.abs(o-u)<c.EPSILON?"equilateral":Math.abs(n-o)<c.EPSILON||Math.abs(o-u)<c.EPSILON?"isosceles":"scalene"}static getAngles(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=Math.acos((e*e+s*s-t*t)/(2*e*s)),n=Math.acos((t*t+s*s-e*e)/(2*t*s)),o=Math.PI-i-n;return[i,n,o]}p1;p2;p3;constructor(t,e,s,i="triangle"){if(super(i),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))<k.EPSILON}get side(){return[h.distance(this.p1,this.p2),h.distance(this.p2,this.p3),h.distance(this.p3,this.p1)]}perimeter(){return c.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 c.area(t,e,s)}get type(){const[t,e,s]=this.side;return c.getType(t,e,s)}get angles(){const[t,e,s]=this.side;return c.getAngles(t,e,s)}get centroid(){return new h((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,i=this.perimeter()/2,n=(t*this.p1.x+e*this.p2.x+s*this.p3.x)/i,o=(t*this.p1.y+e*this.p2.y+s*this.p3.y)/i;return new h(n,o)}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)<c.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 h(e,s)}containsPoint(t){const e=c.area(h.distance(t,this.p1),h.distance(t,this.p2),h.distance(this.p1,this.p2)),s=c.area(h.distance(t,this.p2),h.distance(t,this.p3),h.distance(this.p2,this.p3)),i=c.area(h.distance(t,this.p3),h.distance(t,this.p1),h.distance(this.p3,this.p1));return Math.abs(e+s+i-this.area())<c.EPSILON}}function _(r){return new Promise(t=>setTimeout(t,r))}function $(r){const t=[],e={"(":")","[":"]","{":"}"},s=new Set(Object.values(e));for(const i of r)if(i in e)t.push(e[i]);else if(s.has(i)&&i!==t.pop())return!1;return t.length===0}function A(r){return r!==null&&(typeof r=="object"||typeof r=="function")}class T{map=new Map;weakMap=new WeakMap;set(t,e){A(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return A(t)?this.weakMap.get(t):this.map.get(t)}has(t){return A(t)?this.weakMap.has(t):this.map.has(t)}}function W(r){if(!r.length)return[];const t=[[r[0]]];for(let s=1,i=r.length;s<i;s++){const n=r[s];e(n)}function e(s){for(let i=t.length-1;i>=0;i--){const n=t[i],o=n[t[i].length-1];if(o<s){t[i+1]=[...n,s];break}else o>s&&i===0&&(t[i]=[s])}}return t[t.length-1]}class G{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 o of t)if(!e.has(o))throw new Error(`Invalid Roman numeral character: ${o}`);let s=0,i=0;for(;i<t.length;){const o=t.slice(i,i+2);if(this.ROMAN_MAP.has(o))s+=this.ROMAN_MAP.get(o),i+=2;else{const u=t[i],l=this.ROMAN_MAP.get(u);if(!l)throw new Error(`Invalid Roman numeral sequence at position ${i}`);s+=l,i+=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,i]of this.ROMAN_MAP)for(;t>=i;)e+=s,t-=i;return e}}function F(r){let t;const e=new Proxy(r,{construct(s,i,n){return t||(t=Reflect.construct(s,i,n)),t}});return r.prototype.constructor=e,e}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 b{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 b.instance||(b.instance=new b(t)),b.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(i){console.error(`事件 ${x[t]} 处理出错:`,i)}})}off(t,e){this.debugLog(`移除事件监听: ${x[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${x[t]}`);const s=i=>{e(i),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||"")}}const S={scriptRegex:/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,javascriptRegex:/javascript:/gi,eventHandlerRegex:/on\w+\s*=/gi,allowedTags:new Set(["div","span","p","a","img","button","input","form","label","select","option","textarea","ul","ol","li","table","tr","td","th","thead","tbody","tfoot","h1","h2","h3","h4","h5","h6","hr","br","section","article","nav","header","footer","main","aside","figure","figcaption"]),allowedAttributes:new Set(["class","id","href","src","alt","title"])};class v{static instance;constructor(){}static getInstance(){return v.instance||(v.instance=new v),v.instance}createElement(t,e={},s=""){if(!S.allowedTags.has(t.toLowerCase()))throw new Error(`Unsupported tag: ${t}`);const i=document.createElement(t);return this._processAttributes(i,e),this._processContent(i,s),i}createBatch(t,e){const s=document.createDocumentFragment();t.forEach(i=>{const n=this.createElement(i.tag,i.attributes||{},i.content||"");s.appendChild(n)}),e.appendChild(s)}setHtml(t,e){const s=this._sanitizeHtml(e);t.innerHTML=s}_processAttributes(t,e){Object.entries(e).forEach(([s,i])=>{if(!S.allowedAttributes.has(s)&&!s.startsWith("data-")){console.warn(`Potentially unsafe attribute: ${s}`);return}if(typeof i=="function")s.startsWith("on")&&t.addEventListener(s.slice(2).toLowerCase(),i);else switch(s){case"className":t.className=i;break;case"dataset":Object.assign(t.dataset,i);break;case"style":Object.assign(t.style,i);break;default:t.setAttribute(s,i)}})}_processContent(t,e){typeof e=="string"?t.textContent=e:e instanceof Node?t.appendChild(e):Array.isArray(e)&&e.forEach(s=>{typeof s=="string"?t.appendChild(document.createTextNode(s)):t.appendChild(s)})}_sanitizeHtml(t){return t.replace(S.scriptRegex,"").replace(S.javascriptRegex,"").replace(S.eventHandlerRegex,"")}}class B{features;constructor(){this.features=this.detectFeatures()}detectFeatures(){return{geolocation:"geolocation"in navigator,notification:"Notification"in window,serviceWorker:"serviceWorker"in navigator,webShare:"share"in navigator,deviceOrientation:"DeviceOrientationEvent"in window,battery:"getBattery"in navigator,online:"onLine"in navigator}}async getLocation(t={}){if(!this.features.geolocation)throw new Error("Geolocation is not supported");const e={enableHighAccuracy:!0,timeout:10*1e3,maximumAge:300*1e3};return new Promise((s,i)=>{navigator.geolocation.getCurrentPosition(n=>s({latitude:n.coords.latitude,longitude:n.coords.longitude,accuracy:n.coords.accuracy,timstamp:n.timestamp}),n=>{const o={1:"User denied the request for Geolocation.",2:"Position information is unavailable.",3:"The request to get user location timed out."};i(new Error(o[n.code]||"Unknown error"))},{...e,...t})})}async sendNotification(t,e){if(!this.features.notification)throw new Error("Notification is not supported");if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted")throw new Error("Notification permission is not granted");if(Notification.permission!=="granted")throw new Error("Notification permission is not granted");return new Notification(t,{icon:e.icon,badge:e.badge,...e})}async registerServiceWorker(t){if(!this.features.serviceWorker)throw new Error("Service Worker is not supported");try{const e=await navigator.serviceWorker.register(t);return console.log("Service Worker registered with scope:",e),e}catch(e){throw console.error("Service Worker registration failed:",e),e}}async shareContent(t){if(this.features.webShare)try{return await navigator.share(t),!0}catch(e){return e instanceof Error&&e.name!="AbortError"&&console.error("Error sharing content:",e),!1}else try{return await navigator.clipboard.writeText(t.url||t.text||""),this.sendNotification("Copied to clipboard",{body:"Link copied to clipboard"}),!0}catch(e){return console.error("Error copying to clipboard:",e),!1}}}String.prototype.pointLength=function(){let r=0;for(let t=0,e=this.length;t<e;){const s=this.codePointAt(t);t+=s>65535?2:1,r++}return r},String.prototype.pointAt=function(r){if(r>=this.pointLength())return;let t=0;for(let e=0,s=this.length;e<s;){const i=this.codePointAt(e);if(!i)return;if(t===r)return String.fromCodePoint(i);e+=i>65535?2:1,t++}},String.prototype.sliceByPoint=function(r,t=this.pointLength()){let e="";for(let s=r;s<t;s++)e+=this.pointAt(s);return e},RegExp.escape=function(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Element.prototype.farthest=function(r){if(typeof r!="string"||!r)return null;let t=null,e=this;for(;e;){const s=e.closest(r);if(!s)break;t=s,e=s.parentElement}return t},Object.defineProperties(Element.prototype,{firstElement:{get:function(){if(!this.children.length)return null;let r=this.firstElementChild,t=null;for(;r;)t=r,r=r.firstElementChild;return t}},lastElement:{get:function(){if(!this.children.length)return null;let r=this.lastElementChild,t=null;for(;r;)t=r,r=r.lastElementChild;return t}}}),Text.prototype.surround=function(r="strong",t=""){if(!this.nodeValue||!r||!t)return null;const s=r.split("."),i=s[0],n=s.slice(1).join(" "),o=this.textContent.indexOf(t);if(o<0)return null;const u=document.createRange();u.setStart(this,o),u.setEnd(this,o+t.length);const l=document.createElement(i);return n&&(l.className=n),u.surroundContents(l),l},a.Dictionary=R,a.DomHelper=v,a.Emitter=b,a.Graph=H,a.LIS=W,a.LRU=U,a.Line=p,a.LinkedList=D,a.Matrix=w,a.MaxHeap=z,a.MemoizeMap=T,a.MinHeap=N,a.Point=h,a.Queue=M,a.Roman=G,a.Stack=j,a.Triangle=c,a.Vector=d,a.WebAppManager=B,a.isValidBracket=$,a.singleton=F,a.sleep=_,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(a,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(a=typeof globalThis<"u"?globalThis:a||self,S(a["jc-structure"]={}))})(this,(function(a){"use strict";class S{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;const e=t.length===1&&Array.isArray(t[0])?t[0]:t;return this.batchEnqueue(e),this}batchEnqueue(t){t.forEach(e=>{this.isValidItem(e)&&(this.items[this.count]=e,this.count++)})}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 z{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){return t==null||t==null?this:Array.isArray(t)?this.addItems(t):this.addItem(t)}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 j{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 A(r,t){return r===t?0:r<t?-1:1}class y{heap=[];compareFn;constructor(t=A){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 C extends y{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=y.getLeftIndex(e),i=y.getRightIndex(e),n=this.size();s<n&&this.compareFn(this.heap[e],this.heap[s])===-1&&(e=s),i<n&&this.compareFn(this.heap[e],this.heap[i])===1&&(e=i),e!==t&&(y.swap(this.heap,t,e),this.siftUp(e))}siftDown(t){let e=y.getParentIndex(t);for(;t>0&&e&&this.compareFn(this.heap[e],this.heap[t])===1;)y.swap(this.heap,e,t),t=e,e=y.getParentIndex(t)}}class V extends C{constructor(t=(e,s)=>A(s,e)){super(t)}}function U(r){return{value:r}}class D{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)}}let N=class{value;next=void 0};class ${count=0;head=void 0;constructor(){}indexOf(t){let e=this.head,s=0,i=!1;for(;e;){if(this.equals(e.value,t)){i=!0;break}s++,e=e.next}return i?s:-1}equals(t,e){return!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 i,n;if(e===0){s.next=this.head,this.head=s;return}i=this.getElementAt(e-1),n=i.next,i.next=s,s.next=n}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),i=e?.next;return t===0&&(this.head=i),s&&(s.next=i),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 q{key;value;constructor(t,e){this.key=t,this.value=e}}function P(r,t={emptyString:!1,zeroNumber:!1}){return r==null?!(t.emptyString&&r===""||t.zeroNumber&&r===0):!1}class O{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(P(t))throw new Error("key is required");if(P(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 q(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 i=this.table[e];if(!t(i.key,i.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 H{isDirected;vertices;adjList;constructor(t=!1){this.isDirected=t,this.vertices=[],this.adjList=new O}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 d{_data;static zero(t){return new d(...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 d(...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,i)=>s+t._data[i]);return new d(...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,i)=>s-t._data[i]);return new d(...e)}mul(t){return new d(...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,i)=>e+s*t._data[i],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class w{_matrix;static zero(t,e){return new w(Array.from({length:t},()=>Array.from({length:e},()=>0)))}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 d(...this._matrix[t])}colVector(t){return new d(...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 w(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 w(this._matrix.map((e,s)=>e.map((i,n)=>i+t.getItem([s,n]))))}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 w(this._matrix.map(e=>e.map((s,i)=>s*t.getItem(i))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=w.zero(this.row,t.col);for(let s=0;s<this.row;s++){const i=this.rowVector(s);for(let n=0;n<this.col;n++)e.setItem([s,n],i.dot(t.colVector(n)))}return e}}class h{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 h.distance(this,t)}}class p{static EPSILON=1e-10;static sloped(t,e=p.EPSILON){const s=t.p2.x-t.p1.x,i=t.p2.y-t.p1.y;return Math.abs(s)<e?Math.abs(i)<e?0:null:i/s}static isParallel(t,e,s=p.EPSILON){const i=p.sloped(t),n=p.sloped(e);return i===null&&n===null?!0:i===null||n===null?!1:Math.abs(i-n)<s}static getIntersection(t,e,s=p.EPSILON){if(p.isParallel(t,e))return null;const i=t.p1.x,n=t.p1.y,o=t.p2.x,u=t.p2.y,l=e.p1.x,f=e.p1.y,g=e.p2.x,E=e.p2.y,m=(i-o)*(f-E)-(n-u)*(l-g);if(Math.abs(m)<s)return null;const I=((i-l)*(f-E)-(n-f)*(l-g))/m,L=-((i-o)*(n-f)-(n-u)*(i-l))/m;if(I>=0&&I<=1&&L>=0&&L<=1){const Q=i+I*(o-i),K=n+I*(u-n);return new h(Q,K)}return null}static isIntersecting(t,e){return p.getIntersection(t,e)!==null}static distanceToPoint(t,e,s=p.EPSILON){const i=e.x-t.p1.x,n=e.y-t.p1.y,o=t.p2.x-t.p1.x,u=t.p2.y-t.p1.y,l=i*o+n*u,f=o*o+u*u;let g=-1;f>s&&(g=l/f);let E,m;g<0?(E=t.p1.x,m=t.p1.y):g>1?(E=t.p2.x,m=t.p2.y):(E=t.p1.x+g*o,m=t.p1.y+g*u);const I=e.x-E,L=e.y-m;return Math.hypot(I+L)}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 h(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=p.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<p.EPSILON)return new h(0,0);const e=(this.p2.x-this.p1.x)/t,s=(this.p2.y-this.p1.y)/t;return new h(e,s)}get start(){return this.p1}get end(){return this.p2}}class R{static EPSILON=1e-10;name;constructor(t){this.name=t}}class c extends R{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(!c.isValid(t,e,s))throw new Error("Invalid triangle");const i=(t+e+s)/2;return Math.sqrt(i*(i-t)*(i-e)*(i-s))}static getType(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=[t,e,s].sort((l,f)=>l-f),[n,o,u]=i;return Math.abs(n-o)<c.EPSILON&&Math.abs(o-u)<c.EPSILON?"equilateral":Math.abs(n-o)<c.EPSILON||Math.abs(o-u)<c.EPSILON?"isosceles":"scalene"}static getAngles(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=Math.acos((e*e+s*s-t*t)/(2*e*s)),n=Math.acos((t*t+s*s-e*e)/(2*t*s)),o=Math.PI-i-n;return[i,n,o]}p1;p2;p3;constructor(t,e,s,i="triangle"){if(super(i),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))<R.EPSILON}get side(){return[h.distance(this.p1,this.p2),h.distance(this.p2,this.p3),h.distance(this.p3,this.p1)]}perimeter(){return c.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 c.area(t,e,s)}get type(){const[t,e,s]=this.side;return c.getType(t,e,s)}get angles(){const[t,e,s]=this.side;return c.getAngles(t,e,s)}get centroid(){return new h((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,i=this.perimeter()/2,n=(t*this.p1.x+e*this.p2.x+s*this.p3.x)/i,o=(t*this.p1.y+e*this.p2.y+s*this.p3.y)/i;return new h(n,o)}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)<c.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 h(e,s)}containsPoint(t){const e=c.area(h.distance(t,this.p1),h.distance(t,this.p2),h.distance(this.p1,this.p2)),s=c.area(h.distance(t,this.p2),h.distance(t,this.p3),h.distance(this.p2,this.p3)),i=c.area(h.distance(t,this.p3),h.distance(t,this.p1),h.distance(this.p3,this.p1));return Math.abs(e+s+i-this.area())<c.EPSILON}}function _(r){return new Promise(t=>setTimeout(t,r))}function W(r){const t=[],e={"(":")","[":"]","{":"}"},s=new Set(Object.values(e));for(const i of r)if(i in e)t.push(e[i]);else if(s.has(i)&&i!==t.pop())return!1;return t.length===0}function k(r){return r!==null&&(typeof r=="object"||typeof r=="function")}class T{map=new Map;weakMap=new WeakMap;set(t,e){k(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return k(t)?this.weakMap.get(t):this.map.get(t)}has(t){return k(t)?this.weakMap.has(t):this.map.has(t)}}function G(r){if(!r.length)return[];const t=[[r[0]]];for(let s=1,i=r.length;s<i;s++){const n=r[s];e(n)}function e(s){for(let i=t.length-1;i>=0;i--){const n=t[i],o=n[t[i].length-1];if(o<s){t[i+1]=[...n,s];break}else o>s&&i===0&&(t[i]=[s])}}return t[t.length-1]}class F{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 o of t)if(!e.has(o))throw new Error(`Invalid Roman numeral character: ${o}`);let s=0,i=0;for(;i<t.length;){const o=t.slice(i,i+2);if(this.ROMAN_MAP.has(o))s+=this.ROMAN_MAP.get(o),i+=2;else{const u=t[i],l=this.ROMAN_MAP.get(u);if(!l)throw new Error(`Invalid Roman numeral sequence at position ${i}`);s+=l,i+=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,i]of this.ROMAN_MAP)for(;t>=i;)e+=s,t-=i;return e}}function B(r){let t;const e=new Proxy(r,{construct(s,i,n){return t||(t=Reflect.construct(s,i,n)),t}});return r.prototype.constructor=e,e}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 b{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 b.instance||(b.instance=new b(t)),b.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(i){console.error(`事件 ${x[t]} 处理出错:`,i)}})}off(t,e){this.debugLog(`移除事件监听: ${x[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${x[t]}`);const s=i=>{e(i),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||"")}}const M={scriptRegex:/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,javascriptRegex:/javascript:/gi,eventHandlerRegex:/on\w+\s*=/gi,allowedTags:new Set(["div","span","p","a","img","button","input","form","label","select","option","textarea","ul","ol","li","table","tr","td","th","thead","tbody","tfoot","h1","h2","h3","h4","h5","h6","hr","br","section","article","nav","header","footer","main","aside","figure","figcaption"]),allowedAttributes:new Set(["class","id","href","src","alt","title"])};class v{static instance;constructor(){}static getInstance(){return v.instance||(v.instance=new v),v.instance}createElement(t,e={},s=""){if(!M.allowedTags.has(t.toLowerCase()))throw new Error(`Unsupported tag: ${t}`);const i=document.createElement(t);return this._processAttributes(i,e),this._processContent(i,s),i}createBatch(t,e){const s=document.createDocumentFragment();t.forEach(i=>{const n=this.createElement(i.tag,i.attributes||{},i.content||"");s.appendChild(n)}),e.appendChild(s)}setHtml(t,e){const s=this._sanitizeHtml(e);t.innerHTML=s}_processAttributes(t,e){Object.entries(e).forEach(([s,i])=>{if(!M.allowedAttributes.has(s)&&!s.startsWith("data-")){console.warn(`Potentially unsafe attribute: ${s}`);return}if(typeof i=="function")s.startsWith("on")&&t.addEventListener(s.slice(2).toLowerCase(),i);else switch(s){case"className":t.className=i;break;case"dataset":Object.assign(t.dataset,i);break;case"style":Object.assign(t.style,i);break;default:t.setAttribute(s,i)}})}_processContent(t,e){typeof e=="string"?t.textContent=e:e instanceof Node?t.appendChild(e):Array.isArray(e)&&e.forEach(s=>{typeof s=="string"?t.appendChild(document.createTextNode(s)):t.appendChild(s)})}_sanitizeHtml(t){return t.replace(M.scriptRegex,"").replace(M.javascriptRegex,"").replace(M.eventHandlerRegex,"")}}class X{features;constructor(){this.features=this.detectFeatures()}detectFeatures(){return{geolocation:"geolocation"in navigator,notification:"Notification"in window,serviceWorker:"serviceWorker"in navigator,webShare:"share"in navigator,deviceOrientation:"DeviceOrientationEvent"in window,battery:"getBattery"in navigator,online:"onLine"in navigator}}async getLocation(t={}){if(!this.features.geolocation)throw new Error("Geolocation is not supported");const e={enableHighAccuracy:!0,timeout:10*1e3,maximumAge:300*1e3};return new Promise((s,i)=>{navigator.geolocation.getCurrentPosition(n=>s({latitude:n.coords.latitude,longitude:n.coords.longitude,accuracy:n.coords.accuracy,timstamp:n.timestamp}),n=>{const o={1:"User denied the request for Geolocation.",2:"Position information is unavailable.",3:"The request to get user location timed out."};i(new Error(o[n.code]||"Unknown error"))},{...e,...t})})}async sendNotification(t,e){if(!this.features.notification)throw new Error("Notification is not supported");if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted")throw new Error("Notification permission is not granted");if(Notification.permission!=="granted")throw new Error("Notification permission is not granted");return new Notification(t,{icon:e.icon,badge:e.badge,...e})}async registerServiceWorker(t){if(!this.features.serviceWorker)throw new Error("Service Worker is not supported");try{const e=await navigator.serviceWorker.register(t);return console.log("Service Worker registered with scope:",e),e}catch(e){throw console.error("Service Worker registration failed:",e),e}}async shareContent(t){if(this.features.webShare)try{return await navigator.share(t),!0}catch(e){return e instanceof Error&&e.name!="AbortError"&&console.error("Error sharing content:",e),!1}else try{return await navigator.clipboard.writeText(t.url||t.text||""),this.sendNotification("Copied to clipboard",{body:"Link copied to clipboard"}),!0}catch(e){return console.error("Error copying to clipboard:",e),!1}}}String.prototype.pointLength=function(){let r=0;for(let t=0,e=this.length;t<e;){const s=this.codePointAt(t);t+=s>65535?2:1,r++}return r},String.prototype.pointAt=function(r){if(r>=this.pointLength())return;let t=0;for(let e=0,s=this.length;e<s;){const i=this.codePointAt(e);if(!i)return;if(t===r)return String.fromCodePoint(i);e+=i>65535?2:1,t++}},String.prototype.sliceByPoint=function(r,t=this.pointLength()){let e="";for(let s=r;s<t;s++)e+=this.pointAt(s);return e},RegExp.escape=function(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Element.prototype.farthest=function(r){if(typeof r!="string"||!r)return null;let t=null,e=this;for(;e;){const s=e.closest(r);if(!s)break;t=s,e=s.parentElement}return t},Object.defineProperties(Element.prototype,{firstElement:{get:function(){if(!this.children.length)return null;let r=this.firstElementChild,t=null;for(;r;)t=r,r=r.firstElementChild;return t}},lastElement:{get:function(){if(!this.children.length)return null;let r=this.lastElementChild,t=null;for(;r;)t=r,r=r.lastElementChild;return t}}}),Text.prototype.surround=function(r="strong",t=""){if(!this.nodeValue||!r||!t)return null;const s=r.split("."),i=s[0],n=s.slice(1).join(" "),o=this.textContent.indexOf(t);if(o<0)return null;const u=document.createRange();u.setStart(this,o),u.setEnd(this,o+t.length);const l=document.createElement(i);return n&&(l.className=n),u.surroundContents(l),l},a.Dictionary=O,a.DomHelper=v,a.Emitter=b,a.Graph=H,a.LIS=G,a.LRU=D,a.Line=p,a.LinkedList=$,a.Matrix=w,a.MaxHeap=V,a.MemoizeMap=T,a.MinHeap=C,a.MinStack=j,a.Point=h,a.Queue=S,a.Roman=F,a.Stack=z,a.Triangle=c,a.Vector=d,a.WebAppManager=X,a.isValidBracket=W,a.singleton=B,a.sleep=_,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
declare module "jc-structure" {
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* #### 数据结构接口
|
|
4
|
+
*/
|
|
5
|
+
interface DataStructure {
|
|
3
6
|
/**
|
|
4
7
|
* 判断数据结构是否为空
|
|
5
8
|
*/
|
|
@@ -20,7 +23,7 @@ declare module "jc-structure" {
|
|
|
20
23
|
/**
|
|
21
24
|
* 栈类,采用object实现
|
|
22
25
|
*/
|
|
23
|
-
interface Stack<T> extends
|
|
26
|
+
interface Stack<T> extends DataStructure {
|
|
24
27
|
/**
|
|
25
28
|
* #### 移除栈顶元素并返回该元素
|
|
26
29
|
*/
|
|
@@ -30,8 +33,10 @@ declare module "jc-structure" {
|
|
|
30
33
|
* #### 向栈顶添加元素
|
|
31
34
|
* @param args 要添加的元素,key可以是多个或一个元素。
|
|
32
35
|
*/
|
|
33
|
-
push(
|
|
34
|
-
push(
|
|
36
|
+
push(item: T): this;
|
|
37
|
+
push(items: Array<T>): this;
|
|
38
|
+
push(...items: T[]): this;
|
|
39
|
+
push(itemOrItems: T | Array<T>): this;
|
|
35
40
|
|
|
36
41
|
/**
|
|
37
42
|
* #### 返回栈顶元素,但不移除
|
|
@@ -47,7 +52,7 @@ declare module "jc-structure" {
|
|
|
47
52
|
/**
|
|
48
53
|
* 队列类,采用object实现
|
|
49
54
|
*/
|
|
50
|
-
interface Queue<T> extends
|
|
55
|
+
interface Queue<T> extends DataStructure {
|
|
51
56
|
/**
|
|
52
57
|
* #### 移除队列头部元素并返回该元素
|
|
53
58
|
*/
|
|
@@ -82,7 +87,7 @@ declare module "jc-structure" {
|
|
|
82
87
|
/**
|
|
83
88
|
* 最小堆
|
|
84
89
|
*/
|
|
85
|
-
interface MinHeap<T> extends
|
|
90
|
+
interface MinHeap<T> extends DataStructure {
|
|
86
91
|
/**
|
|
87
92
|
* #### 插入一个值,返回一个布尔值
|
|
88
93
|
* @param value 要插入的值
|
package/package.json
CHANGED
package/types/stack.d.ts
CHANGED
|
@@ -15,9 +15,10 @@ interface IStack<T> extends Structure {
|
|
|
15
15
|
* #### 向栈顶添加元素
|
|
16
16
|
* @param args 要添加的元素,key可以是多个或一个元素。
|
|
17
17
|
*/
|
|
18
|
-
push(
|
|
19
|
-
push(
|
|
20
|
-
|
|
18
|
+
push(item: T): this;
|
|
19
|
+
push(items: Array<T>): this;
|
|
20
|
+
push(...items: T[]): this;
|
|
21
|
+
push(itemOrItems: T | T[]): this;
|
|
21
22
|
/**
|
|
22
23
|
* #### 返回栈顶元素,但不移除
|
|
23
24
|
*/
|