lyb-js 1.6.11 → 1.6.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/Base/LibJsResizeWatcher.d.ts +1 -1
- package/Base/LibJsResizeWatcher.js +2 -3
- package/Data/libJsPickUnique.d.ts +7 -0
- package/Data/libJsPickUnique.js +14 -0
- package/Misc/LibJsObserver.d.ts +25 -0
- package/Misc/LibJsObserver.js +100 -0
- package/README.md +4 -0
- package/libJs.d.ts +2 -0
- package/libJs.js +3 -0
- package/lyb.js +33 -36
- package/package.json +1 -1
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/** @description 监听窗口变化,内部只注册一次resize事件,调用监听自身可取消监听 */
|
|
2
2
|
export class LibJsResizeWatcher {
|
|
3
|
-
constructor(mode) {
|
|
3
|
+
constructor(mode = "hv") {
|
|
4
4
|
/** 存储所有监听器及其是否需要立即执行的标志 */
|
|
5
5
|
this._listeners = [];
|
|
6
|
-
/** 当前适配模式 */
|
|
7
|
-
this._mode = "hv";
|
|
8
6
|
/** @description 内部 resize 回调函数,调用所有注册的监听器 */
|
|
9
7
|
this._handleResize = () => {
|
|
10
8
|
const w = window.innerWidth;
|
|
@@ -24,6 +22,7 @@ export class LibJsResizeWatcher {
|
|
|
24
22
|
return;
|
|
25
23
|
//初始化时绑定窗口 resize 事件
|
|
26
24
|
window.addEventListener("resize", this._handleResize);
|
|
25
|
+
window.addEventListener("orientationchange", this._handleResize);
|
|
27
26
|
}
|
|
28
27
|
/**
|
|
29
28
|
* @description 注册一个窗口尺寸变化的监听器
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { libJsRandom } from "../Random/LibJsRandom";
|
|
2
|
+
/**
|
|
3
|
+
* @description 从候选数组中随机取一个未使用的元素
|
|
4
|
+
* @param pool 全部候选数组
|
|
5
|
+
* @param used 已使用数组
|
|
6
|
+
* @returns 未使用的随机元素,若无可用则返回 undefined
|
|
7
|
+
*/
|
|
8
|
+
export const libJsPickUnique = (pool, used = []) => {
|
|
9
|
+
const usedSet = new Set(used);
|
|
10
|
+
const available = pool.filter((item) => !usedSet.has(item));
|
|
11
|
+
if (available.length === 0)
|
|
12
|
+
return undefined;
|
|
13
|
+
return available[libJsRandom(0, available.length - 1)];
|
|
14
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type Callback<T> = (newValue: T[keyof T], oldValue: T[keyof T]) => void;
|
|
2
|
+
export declare class LibJsObserver<Store> {
|
|
3
|
+
/** 递增索引 */
|
|
4
|
+
private _index;
|
|
5
|
+
private _store;
|
|
6
|
+
private _lastData;
|
|
7
|
+
private _listeners;
|
|
8
|
+
constructor(store: Store);
|
|
9
|
+
/** @description 监听
|
|
10
|
+
* @param key 要监听的键
|
|
11
|
+
* @param callback key值变化时执行的回调函数
|
|
12
|
+
* @param immediately 监听时是否立即执行回调函数
|
|
13
|
+
* @returns 返回一个函数用于注销监听器
|
|
14
|
+
*/
|
|
15
|
+
on(key: keyof Store, callback: Callback<Store>, immediately?: boolean): () => void;
|
|
16
|
+
/** @description 获取数据 */
|
|
17
|
+
getData(key: keyof Store): Store[keyof Store];
|
|
18
|
+
/** @description 手动更新数据 */
|
|
19
|
+
setData(newData: Partial<Store>): void;
|
|
20
|
+
/** @description 通知监听器更新 */
|
|
21
|
+
private _notifyListeners;
|
|
22
|
+
/** @description 判断数据变化并通知监听器 */
|
|
23
|
+
private _update;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export class LibJsObserver {
|
|
2
|
+
constructor(store) {
|
|
3
|
+
/** 递增索引 */
|
|
4
|
+
this._index = 0;
|
|
5
|
+
// 监听器映射,用于存储不同键的回调函数
|
|
6
|
+
this._listeners = new Map();
|
|
7
|
+
this._store = store;
|
|
8
|
+
this._lastData = Object.assign({}, store);
|
|
9
|
+
}
|
|
10
|
+
/** @description 监听
|
|
11
|
+
* @param key 要监听的键
|
|
12
|
+
* @param callback key值变化时执行的回调函数
|
|
13
|
+
* @param immediately 监听时是否立即执行回调函数
|
|
14
|
+
* @returns 返回一个函数用于注销监听器
|
|
15
|
+
*/
|
|
16
|
+
on(key, callback, immediately = true) {
|
|
17
|
+
this._index += 1;
|
|
18
|
+
const index = this._index;
|
|
19
|
+
// 如果该键没有对应的监听器集合,则初始化一个新的集合
|
|
20
|
+
if (!this._listeners.has(key)) {
|
|
21
|
+
this._listeners.set(key, new Map());
|
|
22
|
+
}
|
|
23
|
+
// 将回调函数添加到对应键的监听器集合中
|
|
24
|
+
this._listeners.get(key).set(index, callback);
|
|
25
|
+
immediately && callback(this._store[key], this._lastData[key]);
|
|
26
|
+
return () => {
|
|
27
|
+
// 从特定键的监听器集合中移除指定标识符的回调函数
|
|
28
|
+
const listenerMap = this._listeners.get(key);
|
|
29
|
+
if (listenerMap) {
|
|
30
|
+
listenerMap.delete(index);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.warn(`监听 Key "${key.toString()}" 重复注销事件`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** @description 获取数据 */
|
|
38
|
+
getData(key) {
|
|
39
|
+
return this._store[key];
|
|
40
|
+
}
|
|
41
|
+
/** @description 手动更新数据 */
|
|
42
|
+
setData(newData) {
|
|
43
|
+
this._store = Object.assign(Object.assign({}, this._store), newData);
|
|
44
|
+
this._update();
|
|
45
|
+
}
|
|
46
|
+
/** @description 通知监听器更新 */
|
|
47
|
+
_notifyListeners(key, newValue, oldValue) {
|
|
48
|
+
// 获取特定键的所有监听器
|
|
49
|
+
const keyListeners = this._listeners.get(key);
|
|
50
|
+
if (keyListeners) {
|
|
51
|
+
// 遍历并执行每个监听器的回调函数
|
|
52
|
+
keyListeners.forEach((callback) => callback(newValue, oldValue));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** @description 判断数据变化并通知监听器 */
|
|
56
|
+
_update() {
|
|
57
|
+
// 遍历当前数据对象的每个键,检查是否有变化
|
|
58
|
+
for (const key in this._store) {
|
|
59
|
+
const typedKey = key;
|
|
60
|
+
const newValue = this._store[typedKey];
|
|
61
|
+
const oldValue = this._lastData[typedKey];
|
|
62
|
+
//如果旧值与新值不相等,则通知监听器
|
|
63
|
+
if (newValue !== oldValue) {
|
|
64
|
+
this._notifyListeners(typedKey, newValue, oldValue);
|
|
65
|
+
this._lastData[typedKey] = this._store[typedKey];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
class LibJsStore extends LibJsObserver {
|
|
71
|
+
constructor() {
|
|
72
|
+
super({
|
|
73
|
+
name: "张三",
|
|
74
|
+
age: 20,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const store = new LibJsStore();
|
|
79
|
+
const offA = store.on("age", (newValue) => {
|
|
80
|
+
console.log(`A收到年龄更新:`, newValue);
|
|
81
|
+
});
|
|
82
|
+
store.on("age", (newValue) => {
|
|
83
|
+
console.log(`B收到年龄更新:`, newValue);
|
|
84
|
+
});
|
|
85
|
+
// 模拟更新数据
|
|
86
|
+
setTimeout(() => {
|
|
87
|
+
console.log("尝试更新年龄值为:25");
|
|
88
|
+
store.setData({ age: 25 });
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
console.warn("注销A监听器");
|
|
91
|
+
offA();
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
console.warn("尝试更新年龄值为:26");
|
|
94
|
+
store.setData({ age: 26 });
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
console.log("尝试获取年龄值:", store.getData("age"));
|
|
97
|
+
}, 1000);
|
|
98
|
+
}, 1000);
|
|
99
|
+
}, 1000);
|
|
100
|
+
}, 1000);
|
package/README.md
CHANGED
package/libJs.d.ts
CHANGED
|
@@ -113,6 +113,8 @@ export declare const Data: {
|
|
|
113
113
|
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibReverseArrayFromIndex-数组定位翻转
|
|
114
114
|
*/
|
|
115
115
|
libReverseArrayFromIndex: <T>(arr: T[], index: number) => T[];
|
|
116
|
+
/** @description 随机选择未使用元素 */
|
|
117
|
+
libJsPickUnique: <T>(pool: T[], used?: T[]) => T | undefined;
|
|
116
118
|
};
|
|
117
119
|
/** @description 文件相关方法 */
|
|
118
120
|
export declare const File: {
|
package/libJs.js
CHANGED
|
@@ -44,6 +44,7 @@ import { LibJsClassObservable } from "./Misc/LibJsClassObservable";
|
|
|
44
44
|
import { libJsCopy } from "./Browser/LibJsCopy";
|
|
45
45
|
import { LibJsResizeWatcher } from "./Base/LibJsResizeWatcher";
|
|
46
46
|
import { LibJsPullUpLoad } from "./Misc/LibJsPullUpLoad";
|
|
47
|
+
import { libJsPickUnique } from "./Data/libJsPickUnique";
|
|
47
48
|
/** @description 基础方法 */
|
|
48
49
|
export const Base = {
|
|
49
50
|
/**
|
|
@@ -152,6 +153,8 @@ export const Data = {
|
|
|
152
153
|
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibReverseArrayFromIndex-数组定位翻转
|
|
153
154
|
*/
|
|
154
155
|
libReverseArrayFromIndex,
|
|
156
|
+
/** @description 随机选择未使用元素 */
|
|
157
|
+
libJsPickUnique,
|
|
155
158
|
};
|
|
156
159
|
/** @description 文件相关方法 */
|
|
157
160
|
export const File = {
|
package/lyb.js
CHANGED
|
@@ -308,10 +308,10 @@ ${log3.label}:`, log3.value];
|
|
|
308
308
|
return distance;
|
|
309
309
|
};
|
|
310
310
|
/*!
|
|
311
|
-
* decimal.js v10.
|
|
311
|
+
* decimal.js v10.4.3
|
|
312
312
|
* An arbitrary-precision Decimal type for JavaScript.
|
|
313
313
|
* https://github.com/MikeMcl/decimal.js
|
|
314
|
-
* Copyright (c)
|
|
314
|
+
* Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>
|
|
315
315
|
* MIT Licence
|
|
316
316
|
*/
|
|
317
317
|
var EXP_LIMIT = 9e15, MAX_DIGITS = 1e9, NUMERALS = "0123456789abcdef", LN10 = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058", PI = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789", DEFAULTS = {
|
|
@@ -580,7 +580,7 @@ ${log3.label}:`, log3.value];
|
|
|
580
580
|
return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);
|
|
581
581
|
};
|
|
582
582
|
P.inverseCosine = P.acos = function() {
|
|
583
|
-
var x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;
|
|
583
|
+
var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;
|
|
584
584
|
if (k !== -1) {
|
|
585
585
|
return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN);
|
|
586
586
|
}
|
|
@@ -588,10 +588,11 @@ ${log3.label}:`, log3.value];
|
|
|
588
588
|
return getPi(Ctor, pr + 4, rm).times(0.5);
|
|
589
589
|
Ctor.precision = pr + 6;
|
|
590
590
|
Ctor.rounding = 1;
|
|
591
|
-
x =
|
|
591
|
+
x = x.asin();
|
|
592
|
+
halfPi = getPi(Ctor, pr + 4, rm).times(0.5);
|
|
592
593
|
Ctor.precision = pr;
|
|
593
594
|
Ctor.rounding = rm;
|
|
594
|
-
return
|
|
595
|
+
return halfPi.minus(x);
|
|
595
596
|
};
|
|
596
597
|
P.inverseHyperbolicCosine = P.acosh = function() {
|
|
597
598
|
var pr, rm, x = this, Ctor = x.constructor;
|
|
@@ -1803,16 +1804,14 @@ ${log3.label}:`, log3.value];
|
|
|
1803
1804
|
function isOdd(n) {
|
|
1804
1805
|
return n.d[n.d.length - 1] & 1;
|
|
1805
1806
|
}
|
|
1806
|
-
function maxOrMin(Ctor, args,
|
|
1807
|
-
var
|
|
1807
|
+
function maxOrMin(Ctor, args, ltgt) {
|
|
1808
|
+
var y, x = new Ctor(args[0]), i = 0;
|
|
1808
1809
|
for (; ++i < args.length; ) {
|
|
1809
1810
|
y = new Ctor(args[i]);
|
|
1810
1811
|
if (!y.s) {
|
|
1811
1812
|
x = y;
|
|
1812
1813
|
break;
|
|
1813
|
-
}
|
|
1814
|
-
k = x.cmp(y);
|
|
1815
|
-
if (k === n || k === 0 && x.s === n) {
|
|
1814
|
+
} else if (x[ltgt](y)) {
|
|
1816
1815
|
x = y;
|
|
1817
1816
|
}
|
|
1818
1817
|
}
|
|
@@ -2393,8 +2392,7 @@ ${log3.label}:`, log3.value];
|
|
|
2393
2392
|
x.d = [v];
|
|
2394
2393
|
}
|
|
2395
2394
|
return;
|
|
2396
|
-
}
|
|
2397
|
-
if (v * 0 !== 0) {
|
|
2395
|
+
} else if (v * 0 !== 0) {
|
|
2398
2396
|
if (!v)
|
|
2399
2397
|
x.s = NaN;
|
|
2400
2398
|
x.e = NaN;
|
|
@@ -2402,28 +2400,18 @@ ${log3.label}:`, log3.value];
|
|
|
2402
2400
|
return;
|
|
2403
2401
|
}
|
|
2404
2402
|
return parseDecimal(x, v.toString());
|
|
2403
|
+
} else if (t !== "string") {
|
|
2404
|
+
throw Error(invalidArgument + v);
|
|
2405
2405
|
}
|
|
2406
|
-
if (
|
|
2407
|
-
|
|
2406
|
+
if ((i2 = v.charCodeAt(0)) === 45) {
|
|
2407
|
+
v = v.slice(1);
|
|
2408
|
+
x.s = -1;
|
|
2409
|
+
} else {
|
|
2410
|
+
if (i2 === 43)
|
|
2408
2411
|
v = v.slice(1);
|
|
2409
|
-
|
|
2410
|
-
} else {
|
|
2411
|
-
if (i2 === 43)
|
|
2412
|
-
v = v.slice(1);
|
|
2413
|
-
x.s = 1;
|
|
2414
|
-
}
|
|
2415
|
-
return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);
|
|
2412
|
+
x.s = 1;
|
|
2416
2413
|
}
|
|
2417
|
-
|
|
2418
|
-
if (v < 0) {
|
|
2419
|
-
v = -v;
|
|
2420
|
-
x.s = -1;
|
|
2421
|
-
} else {
|
|
2422
|
-
x.s = 1;
|
|
2423
|
-
}
|
|
2424
|
-
return parseDecimal(x, v.toString());
|
|
2425
|
-
}
|
|
2426
|
-
throw Error(invalidArgument + v);
|
|
2414
|
+
return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);
|
|
2427
2415
|
}
|
|
2428
2416
|
Decimal2.prototype = P;
|
|
2429
2417
|
Decimal2.ROUND_UP = 0;
|
|
@@ -2533,10 +2521,10 @@ ${log3.label}:`, log3.value];
|
|
|
2533
2521
|
return new this(x).log(10);
|
|
2534
2522
|
}
|
|
2535
2523
|
function max() {
|
|
2536
|
-
return maxOrMin(this, arguments,
|
|
2524
|
+
return maxOrMin(this, arguments, "lt");
|
|
2537
2525
|
}
|
|
2538
2526
|
function min() {
|
|
2539
|
-
return maxOrMin(this, arguments,
|
|
2527
|
+
return maxOrMin(this, arguments, "gt");
|
|
2540
2528
|
}
|
|
2541
2529
|
function mod(x, y) {
|
|
2542
2530
|
return new this(x).mod(y);
|
|
@@ -3513,9 +3501,8 @@ ${log3.label}:`, log3.value];
|
|
|
3513
3501
|
}
|
|
3514
3502
|
};
|
|
3515
3503
|
class LibJsResizeWatcher {
|
|
3516
|
-
constructor(mode) {
|
|
3504
|
+
constructor(mode = "hv") {
|
|
3517
3505
|
this._listeners = [];
|
|
3518
|
-
this._mode = "hv";
|
|
3519
3506
|
this._handleResize = () => {
|
|
3520
3507
|
const w = window.innerWidth;
|
|
3521
3508
|
const h = window.innerHeight;
|
|
@@ -3532,6 +3519,7 @@ ${log3.label}:`, log3.value];
|
|
|
3532
3519
|
if (mode === "h" || mode === "v")
|
|
3533
3520
|
return;
|
|
3534
3521
|
window.addEventListener("resize", this._handleResize);
|
|
3522
|
+
window.addEventListener("orientationchange", this._handleResize);
|
|
3535
3523
|
}
|
|
3536
3524
|
/**
|
|
3537
3525
|
* @description 注册一个窗口尺寸变化的监听器
|
|
@@ -3605,6 +3593,13 @@ ${log3.label}:`, log3.value];
|
|
|
3605
3593
|
}
|
|
3606
3594
|
}
|
|
3607
3595
|
}
|
|
3596
|
+
const libJsPickUnique = (pool, used = []) => {
|
|
3597
|
+
const usedSet = new Set(used);
|
|
3598
|
+
const available = pool.filter((item) => !usedSet.has(item));
|
|
3599
|
+
if (available.length === 0)
|
|
3600
|
+
return void 0;
|
|
3601
|
+
return available[libJsRandom(0, available.length - 1)];
|
|
3602
|
+
};
|
|
3608
3603
|
const Base = {
|
|
3609
3604
|
/**
|
|
3610
3605
|
* @description 返回数据类型
|
|
@@ -3709,7 +3704,9 @@ ${log3.label}:`, log3.value];
|
|
|
3709
3704
|
* @param index 开始索引
|
|
3710
3705
|
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibReverseArrayFromIndex-数组定位翻转
|
|
3711
3706
|
*/
|
|
3712
|
-
libReverseArrayFromIndex
|
|
3707
|
+
libReverseArrayFromIndex,
|
|
3708
|
+
/** @description 随机选择未使用元素 */
|
|
3709
|
+
libJsPickUnique
|
|
3713
3710
|
};
|
|
3714
3711
|
const File$1 = {
|
|
3715
3712
|
/** @description 下载图片链接
|