@cloudcome/utils-core 0.0.0 → 1.1.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.
- package/dist/array.cjs +129 -0
- package/dist/array.cjs.map +1 -0
- package/dist/array.d.ts +171 -0
- package/dist/array.mjs +129 -0
- package/dist/array.mjs.map +1 -0
- package/dist/async.cjs +219 -0
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.ts +137 -0
- package/dist/async.mjs +219 -0
- package/dist/async.mjs.map +1 -0
- package/dist/base64.cjs +16 -0
- package/dist/base64.cjs.map +1 -0
- package/dist/base64.d.ts +7 -0
- package/dist/base64.mjs +16 -0
- package/dist/base64.mjs.map +1 -0
- package/dist/cache.cjs +79 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.ts +90 -0
- package/dist/cache.mjs +79 -0
- package/dist/cache.mjs.map +1 -0
- package/dist/color/contrast.d.ts +10 -0
- package/dist/color/distance.d.ts +8 -0
- package/dist/color/helpers.d.ts +2 -0
- package/dist/color/hex-hsl.d.ts +3 -0
- package/dist/color/hex-hsv.d.ts +20 -0
- package/dist/color/hex-hwb.d.ts +23 -0
- package/dist/color/hex-rgb.d.ts +18 -0
- package/dist/color/hsl-lighten.d.ts +10 -0
- package/dist/color/hsv-brighten.d.ts +12 -0
- package/dist/color/luminance.d.ts +10 -0
- package/dist/color/mix.d.ts +18 -0
- package/dist/color/rgb-hsl.d.ts +23 -0
- package/dist/color/rgb-hsv.d.ts +25 -0
- package/dist/color/rgb-hwb.d.ts +29 -0
- package/dist/color/rgb-lab.d.ts +25 -0
- package/dist/color/rgb-whiter.d.ts +12 -0
- package/dist/color/rgb-xyz.d.ts +22 -0
- package/dist/color/types.d.ts +83 -0
- package/dist/color/xyz-lab.d.ts +25 -0
- package/dist/color.cjs +250 -0
- package/dist/color.cjs.map +1 -0
- package/dist/color.d.ts +19 -0
- package/dist/color.mjs +250 -0
- package/dist/color.mjs.map +1 -0
- package/dist/const.cjs +14 -0
- package/dist/const.cjs.map +1 -0
- package/dist/const.mjs +15 -0
- package/dist/const.mjs.map +1 -0
- package/dist/core.cjs +250 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.mjs +251 -0
- package/dist/core.mjs.map +1 -0
- package/dist/crypto/md5.d.mts +1 -0
- package/dist/crypto/sha1.d.mts +1 -0
- package/dist/crypto/sha256.d.mts +1 -0
- package/dist/crypto/sha512.d.mts +1 -0
- package/dist/crypto.cjs +812 -0
- package/dist/crypto.cjs.map +1 -0
- package/dist/crypto.d.ts +44 -0
- package/dist/crypto.mjs +812 -0
- package/dist/crypto.mjs.map +1 -0
- package/dist/date/const.d.ts +6 -0
- package/dist/date/core.d.ts +52 -0
- package/dist/date/days.d.ts +23 -0
- package/dist/date/is.d.ts +92 -0
- package/dist/date/relative.d.ts +44 -0
- package/dist/date/start-end.d.ts +73 -0
- package/dist/date/timezone.d.ts +67 -0
- package/dist/date/weeks.d.ts +72 -0
- package/dist/date.cjs +239 -0
- package/dist/date.cjs.map +1 -0
- package/dist/date.d.ts +8 -0
- package/dist/date.mjs +241 -0
- package/dist/date.mjs.map +1 -0
- package/dist/dict.cjs +2 -0
- package/dist/dict.cjs.map +1 -0
- package/dist/dict.d.ts +1 -0
- package/dist/dict.mjs +2 -0
- package/dist/dict.mjs.map +1 -0
- package/dist/each.cjs +18 -0
- package/dist/each.cjs.map +1 -0
- package/dist/each.mjs +19 -0
- package/dist/each.mjs.map +1 -0
- package/dist/easing.cjs +151 -0
- package/dist/easing.cjs.map +1 -0
- package/dist/easing.d.ts +46 -0
- package/dist/easing.mjs +151 -0
- package/dist/easing.mjs.map +1 -0
- package/dist/emitter.cjs +94 -0
- package/dist/emitter.cjs.map +1 -0
- package/dist/emitter.d.ts +68 -0
- package/dist/emitter.mjs +94 -0
- package/dist/emitter.mjs.map +1 -0
- package/dist/enum.cjs +58 -0
- package/dist/enum.cjs.map +1 -0
- package/dist/enum.d.ts +68 -0
- package/dist/enum.mjs +58 -0
- package/dist/enum.mjs.map +1 -0
- package/dist/env.cjs +28 -0
- package/dist/env.cjs.map +1 -0
- package/dist/env.d.ts +38 -0
- package/dist/env.mjs +28 -0
- package/dist/env.mjs.map +1 -0
- package/dist/error.cjs +12 -0
- package/dist/error.cjs.map +1 -0
- package/dist/error.d.ts +22 -0
- package/dist/error.mjs +12 -0
- package/dist/error.mjs.map +1 -0
- package/dist/exception.cjs +22 -0
- package/dist/exception.cjs.map +1 -0
- package/dist/exception.d.ts +31 -0
- package/dist/exception.mjs +22 -0
- package/dist/exception.mjs.map +1 -0
- package/dist/fn.cjs +76 -0
- package/dist/fn.cjs.map +1 -0
- package/dist/fn.d.ts +102 -0
- package/dist/fn.mjs +76 -0
- package/dist/fn.mjs.map +1 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -0
- package/dist/merge.cjs +87 -0
- package/dist/merge.cjs.map +1 -0
- package/dist/merge.mjs +88 -0
- package/dist/merge.mjs.map +1 -0
- package/dist/number.cjs +11 -0
- package/dist/number.cjs.map +1 -0
- package/dist/number.d.ts +137 -0
- package/dist/number.mjs +11 -0
- package/dist/number.mjs.map +1 -0
- package/dist/object/each.d.ts +36 -0
- package/dist/object/get-set.d.ts +111 -0
- package/dist/object/is.d.ts +32 -0
- package/dist/object/merge.d.ts +72 -0
- package/dist/object/process.d.ts +46 -0
- package/dist/object.cjs +130 -0
- package/dist/object.cjs.map +1 -0
- package/dist/object.d.ts +5 -0
- package/dist/object.mjs +130 -0
- package/dist/object.mjs.map +1 -0
- package/dist/path.cjs +77 -0
- package/dist/path.cjs.map +1 -0
- package/dist/path.d.ts +82 -0
- package/dist/path.mjs +77 -0
- package/dist/path.mjs.map +1 -0
- package/dist/promise.cjs +62 -0
- package/dist/promise.cjs.map +1 -0
- package/dist/promise.d.ts +50 -0
- package/dist/promise.mjs +62 -0
- package/dist/promise.mjs.map +1 -0
- package/dist/qs.cjs +47 -0
- package/dist/qs.cjs.map +1 -0
- package/dist/qs.d.ts +62 -0
- package/dist/qs.mjs +47 -0
- package/dist/qs.mjs.map +1 -0
- package/dist/regexp.cjs +66 -0
- package/dist/regexp.cjs.map +1 -0
- package/dist/regexp.d.ts +65 -0
- package/dist/regexp.mjs +66 -0
- package/dist/regexp.mjs.map +1 -0
- package/dist/string.cjs +16 -0
- package/dist/string.cjs.map +1 -0
- package/dist/string.d.ts +80 -0
- package/dist/string.mjs +16 -0
- package/dist/string.mjs.map +1 -0
- package/dist/string2.cjs +147 -0
- package/dist/string2.cjs.map +1 -0
- package/dist/string2.mjs +148 -0
- package/dist/string2.mjs.map +1 -0
- package/dist/time/from.d.ts +14 -0
- package/dist/time/to.d.ts +38 -0
- package/dist/time.cjs +82 -0
- package/dist/time.cjs.map +1 -0
- package/dist/time.d.ts +2 -0
- package/dist/time.mjs +82 -0
- package/dist/time.mjs.map +1 -0
- package/dist/timer.cjs +119 -0
- package/dist/timer.cjs.map +1 -0
- package/dist/timer.d.ts +96 -0
- package/dist/timer.mjs +119 -0
- package/dist/timer.mjs.map +1 -0
- package/dist/tree.cjs +125 -0
- package/dist/tree.cjs.map +1 -0
- package/dist/tree.d.ts +210 -0
- package/dist/tree.mjs +125 -0
- package/dist/tree.mjs.map +1 -0
- package/dist/type.cjs +78 -0
- package/dist/type.cjs.map +1 -0
- package/dist/type.d.ts +121 -0
- package/dist/type.mjs +78 -0
- package/dist/type.mjs.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/unique.cjs +46 -0
- package/dist/unique.cjs.map +1 -0
- package/dist/unique.d.ts +22 -0
- package/dist/unique.mjs +46 -0
- package/dist/unique.mjs.map +1 -0
- package/dist/url.cjs +37 -0
- package/dist/url.cjs.map +1 -0
- package/dist/url.d.ts +53 -0
- package/dist/url.mjs +37 -0
- package/dist/url.mjs.map +1 -0
- package/dist/version.cjs +33 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.ts +32 -0
- package/dist/version.mjs +33 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +1 -8
package/dist/each.cjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function objectEach(obj, iterator) {
|
|
3
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
4
|
+
if (iterator.call(obj, val, key) === false) {
|
|
5
|
+
break;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
async function objectEachAsync(obj, iterator) {
|
|
10
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
11
|
+
if (await iterator.call(obj, val, key) === false) {
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.objectEach = objectEach;
|
|
17
|
+
exports.objectEachAsync = objectEachAsync;
|
|
18
|
+
//# sourceMappingURL=each.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each.cjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":";AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;;;"}
|
package/dist/each.mjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function objectEach(obj, iterator) {
|
|
2
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
3
|
+
if (iterator.call(obj, val, key) === false) {
|
|
4
|
+
break;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
async function objectEachAsync(obj, iterator) {
|
|
9
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
10
|
+
if (await iterator.call(obj, val, key) === false) {
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
objectEachAsync as a,
|
|
17
|
+
objectEach as o
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=each.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each.mjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":"AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
package/dist/easing.cjs
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const NEWTON_ITERATIONS = 4;
|
|
4
|
+
const NEWTON_MIN_SLOPE = 1e-3;
|
|
5
|
+
const SUBDIVISION_PRECISION = 1e-7;
|
|
6
|
+
const SUBDIVISION_MAX_ITERATIONS = 10;
|
|
7
|
+
const kSplineTableSize = 11;
|
|
8
|
+
const kSampleStepSize = 1 / (kSplineTableSize - 1);
|
|
9
|
+
const float32ArraySupported = typeof Float32Array === "function";
|
|
10
|
+
function A(aA1, aA2) {
|
|
11
|
+
return 1 - 3 * aA2 + 3 * aA1;
|
|
12
|
+
}
|
|
13
|
+
function B(aA1, aA2) {
|
|
14
|
+
return 3 * aA2 - 6 * aA1;
|
|
15
|
+
}
|
|
16
|
+
function C(aA1) {
|
|
17
|
+
return 3 * aA1;
|
|
18
|
+
}
|
|
19
|
+
function calcBezier(aT, aA1, aA2) {
|
|
20
|
+
return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
|
|
21
|
+
}
|
|
22
|
+
function getSlope(aT, aA1, aA2) {
|
|
23
|
+
return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
|
|
24
|
+
}
|
|
25
|
+
function binarySubdivide(aX, aA, aB, mX1, mX2) {
|
|
26
|
+
let currentX;
|
|
27
|
+
let currentT;
|
|
28
|
+
let i = 0;
|
|
29
|
+
let aBFinal = aB;
|
|
30
|
+
let aAFinal = aA;
|
|
31
|
+
do {
|
|
32
|
+
currentT = aAFinal + (aBFinal - aAFinal) / 2;
|
|
33
|
+
currentX = calcBezier(currentT, mX1, mX2) - aX;
|
|
34
|
+
if (currentX > 0) {
|
|
35
|
+
aBFinal = currentT;
|
|
36
|
+
} else {
|
|
37
|
+
aAFinal = currentT;
|
|
38
|
+
}
|
|
39
|
+
} while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
|
|
40
|
+
return currentT;
|
|
41
|
+
}
|
|
42
|
+
function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
|
|
43
|
+
let aGuessTFinal = aGuessT;
|
|
44
|
+
for (let i = 0; i < NEWTON_ITERATIONS; ++i) {
|
|
45
|
+
const currentSlope = getSlope(aGuessTFinal, mX1, mX2);
|
|
46
|
+
if (currentSlope === 0) {
|
|
47
|
+
return aGuessTFinal;
|
|
48
|
+
}
|
|
49
|
+
const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;
|
|
50
|
+
aGuessTFinal -= currentX / currentSlope;
|
|
51
|
+
}
|
|
52
|
+
return aGuessTFinal;
|
|
53
|
+
}
|
|
54
|
+
function LinearEasing(x) {
|
|
55
|
+
return x;
|
|
56
|
+
}
|
|
57
|
+
function createEasingFn(x1, y1, x2, y2) {
|
|
58
|
+
if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {
|
|
59
|
+
throw new Error("bezier x values must be in [0, 1] range");
|
|
60
|
+
}
|
|
61
|
+
if (x1 === y1 && x2 === y2) {
|
|
62
|
+
return LinearEasing;
|
|
63
|
+
}
|
|
64
|
+
const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
|
|
65
|
+
for (let i = 0; i < kSplineTableSize; ++i) {
|
|
66
|
+
sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);
|
|
67
|
+
}
|
|
68
|
+
function getTForX(aX) {
|
|
69
|
+
let intervalStart = 0;
|
|
70
|
+
let currentSample = 1;
|
|
71
|
+
const lastSample = kSplineTableSize - 1;
|
|
72
|
+
for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
|
|
73
|
+
intervalStart += kSampleStepSize;
|
|
74
|
+
}
|
|
75
|
+
--currentSample;
|
|
76
|
+
const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
|
|
77
|
+
const guessForT = intervalStart + dist * kSampleStepSize;
|
|
78
|
+
const initialSlope = getSlope(guessForT, x1, x2);
|
|
79
|
+
if (initialSlope >= NEWTON_MIN_SLOPE) {
|
|
80
|
+
return newtonRaphsonIterate(aX, guessForT, x1, x2);
|
|
81
|
+
}
|
|
82
|
+
if (initialSlope === 0) {
|
|
83
|
+
return guessForT;
|
|
84
|
+
}
|
|
85
|
+
return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);
|
|
86
|
+
}
|
|
87
|
+
return function easingFunc(x) {
|
|
88
|
+
if (x === 0 || x === 1) {
|
|
89
|
+
return x;
|
|
90
|
+
}
|
|
91
|
+
return calcBezier(getTForX(x), y1, y2);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);
|
|
95
|
+
const easingLinear = createEasingFn(0, 0, 1, 1);
|
|
96
|
+
const easingSnap = createEasingFn(0, 1, 0.5, 1);
|
|
97
|
+
const easingIn = createEasingFn(0.42, 0, 1, 1);
|
|
98
|
+
const easingOut = createEasingFn(0, 0, 0.58, 1);
|
|
99
|
+
const easingInOut = createEasingFn(0.42, 0, 0.58, 1);
|
|
100
|
+
const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);
|
|
101
|
+
const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);
|
|
102
|
+
const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);
|
|
103
|
+
const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);
|
|
104
|
+
const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);
|
|
105
|
+
const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);
|
|
106
|
+
const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);
|
|
107
|
+
const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);
|
|
108
|
+
const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);
|
|
109
|
+
const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);
|
|
110
|
+
const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);
|
|
111
|
+
const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);
|
|
112
|
+
const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);
|
|
113
|
+
const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);
|
|
114
|
+
const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);
|
|
115
|
+
const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);
|
|
116
|
+
const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);
|
|
117
|
+
const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);
|
|
118
|
+
const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);
|
|
119
|
+
const easingInOutExpo = createEasingFn(1, 0, 0, 1);
|
|
120
|
+
const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);
|
|
121
|
+
const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);
|
|
122
|
+
exports.createEasingFn = createEasingFn;
|
|
123
|
+
exports.easingEase = easingEase;
|
|
124
|
+
exports.easingIn = easingIn;
|
|
125
|
+
exports.easingInBack = easingInBack;
|
|
126
|
+
exports.easingInCirc = easingInCirc;
|
|
127
|
+
exports.easingInCubic = easingInCubic;
|
|
128
|
+
exports.easingInExpo = easingInExpo;
|
|
129
|
+
exports.easingInOut = easingInOut;
|
|
130
|
+
exports.easingInOutBack = easingInOutBack;
|
|
131
|
+
exports.easingInOutCirc = easingInOutCirc;
|
|
132
|
+
exports.easingInOutExpo = easingInOutExpo;
|
|
133
|
+
exports.easingInOutQuart = easingInOutQuart;
|
|
134
|
+
exports.easingInOutQuint = easingInOutQuint;
|
|
135
|
+
exports.easingInOutSine = easingInOutSine;
|
|
136
|
+
exports.easingInQuad = easingInQuad;
|
|
137
|
+
exports.easingInQuart = easingInQuart;
|
|
138
|
+
exports.easingInQuint = easingInQuint;
|
|
139
|
+
exports.easingInSine = easingInSine;
|
|
140
|
+
exports.easingLinear = easingLinear;
|
|
141
|
+
exports.easingOut = easingOut;
|
|
142
|
+
exports.easingOutBack = easingOutBack;
|
|
143
|
+
exports.easingOutCirc = easingOutCirc;
|
|
144
|
+
exports.easingOutCubic = easingOutCubic;
|
|
145
|
+
exports.easingOutExpo = easingOutExpo;
|
|
146
|
+
exports.easingOutQuad = easingOutQuad;
|
|
147
|
+
exports.easingOutQuart = easingOutQuart;
|
|
148
|
+
exports.easingOutQuint = easingOutQuint;
|
|
149
|
+
exports.easingOutSine = easingOutSine;
|
|
150
|
+
exports.easingSnap = easingSnap;
|
|
151
|
+
//# sourceMappingURL=easing.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.cjs","sources":["../src/easing.ts"],"sourcesContent":["/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nconst float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A(aA1: number, aA2: number) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n}\nfunction B(aA1: number, aA2: number) {\n return 3.0 * aA2 - 6.0 * aA1;\n}\nfunction C(aA1: number) {\n return 3.0 * aA1;\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n let currentX: number;\n let currentT: number;\n let i = 0;\n let aBFinal = aB;\n let aAFinal = aA;\n\n do {\n currentT = aAFinal + (aBFinal - aAFinal) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aBFinal = currentT;\n } else {\n aAFinal = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {\n let aGuessTFinal = aGuessT;\n for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n const currentSlope = getSlope(aGuessTFinal, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessTFinal;\n }\n const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;\n aGuessTFinal -= currentX / currentSlope;\n }\n return aGuessTFinal;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\n/**\n * 创建一个基于贝塞尔曲线的缓动函数。\n *\n * @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。\n * @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。\n */\nexport function createEasingFn(x1: number, y1: number, x2: number, y2: number) {\n if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (x1 === y1 && x2 === y2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (let i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);\n }\n\n function getTForX(aX: number) {\n let intervalStart = 0.0;\n let currentSample = 1;\n const lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n const guessForT = intervalStart + dist * kSampleStepSize;\n const initialSlope = getSlope(guessForT, x1, x2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, x1, x2);\n }\n\n if (initialSlope === 0.0) {\n return guessForT;\n }\n\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);\n }\n\n /**\n * 贝塞尔曲线方程\n * @param x {number} 0~1\n */\n return function easingFunc(x: number) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n\n return calcBezier(getTForX(x), y1, y2);\n };\n}\n\nexport const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);\nexport const easingLinear = createEasingFn(0, 0, 1, 1);\nexport const easingSnap = createEasingFn(0, 1, 0.5, 1);\nexport const easingIn = createEasingFn(0.42, 0, 1, 1);\nexport const easingOut = createEasingFn(0, 0, 0.58, 1);\nexport const easingInOut = createEasingFn(0.42, 0, 0.58, 1);\nexport const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);\nexport const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);\nexport const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);\nexport const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);\nexport const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);\nexport const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);\nexport const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);\nexport const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);\nexport const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);\nexport const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);\nexport const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);\nexport const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);\nexport const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);\nexport const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);\nexport const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);\nexport const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);\nexport const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);\nexport const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);\nexport const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);\nexport const easingInOutExpo = createEasingFn(1, 0, 0, 1);\nexport const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);\nexport const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);\n"],"names":[],"mappings":";;AAOA,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,wBAAwB;AAC9B,MAAM,6BAA6B;AAEnC,MAAM,mBAAmB;AACzB,MAAM,kBAAkB,KAAO,mBAAmB;AAElD,MAAM,wBAAwB,OAAO,iBAAiB;AAEtD,SAAS,EAAE,KAAa,KAAa;AAC5B,SAAA,IAAM,IAAM,MAAM,IAAM;AACjC;AACA,SAAS,EAAE,KAAa,KAAa;AAC5B,SAAA,IAAM,MAAM,IAAM;AAC3B;AACA,SAAS,EAAE,KAAa;AACtB,SAAO,IAAM;AACf;AAGA,SAAS,WAAW,IAAY,KAAa,KAAa;AACxD,WAAS,EAAE,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,EAAE,GAAG,KAAK;AAC5D;AAGA,SAAS,SAAS,IAAY,KAAa,KAAa;AACtD,SAAO,IAAM,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,IAAM,EAAE,KAAK,GAAG,IAAI,KAAK,EAAE,GAAG;AACrE;AAEA,SAAS,gBAAgB,IAAY,IAAY,IAAY,KAAa,KAAa;AACjF,MAAA;AACA,MAAA;AACJ,MAAI,IAAI;AACR,MAAI,UAAU;AACd,MAAI,UAAU;AAEX,KAAA;AACU,eAAA,WAAW,UAAU,WAAW;AAC3C,eAAW,WAAW,UAAU,KAAK,GAAG,IAAI;AAC5C,QAAI,WAAW,GAAK;AACR,gBAAA;AAAA,IAAA,OACL;AACK,gBAAA;AAAA,IAAA;AAAA,EACZ,SACO,KAAK,IAAI,QAAQ,IAAI,yBAAyB,EAAE,IAAI;AACtD,SAAA;AACT;AAEA,SAAS,qBAAqB,IAAY,SAAiB,KAAa,KAAa;AACnF,MAAI,eAAe;AACnB,WAAS,IAAI,GAAG,IAAI,mBAAmB,EAAE,GAAG;AAC1C,UAAM,eAAe,SAAS,cAAc,KAAK,GAAG;AACpD,QAAI,iBAAiB,GAAK;AACjB,aAAA;AAAA,IAAA;AAET,UAAM,WAAW,WAAW,cAAc,KAAK,GAAG,IAAI;AACtD,oBAAgB,WAAW;AAAA,EAAA;AAEtB,SAAA;AACT;AAEA,SAAS,aAAa,GAAW;AACxB,SAAA;AACT;AAYO,SAAS,eAAe,IAAY,IAAY,IAAY,IAAY;AACzE,MAAA,EAAE,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI;AACzC,UAAA,IAAI,MAAM,yCAAyC;AAAA,EAAA;AAGvD,MAAA,OAAO,MAAM,OAAO,IAAI;AACnB,WAAA;AAAA,EAAA;AAIH,QAAA,eAAe,wBAAwB,IAAI,aAAa,gBAAgB,IAAI,IAAI,MAAM,gBAAgB;AAC5G,WAAS,IAAI,GAAG,IAAI,kBAAkB,EAAE,GAAG;AACzC,iBAAa,CAAC,IAAI,WAAW,IAAI,iBAAiB,IAAI,EAAE;AAAA,EAAA;AAG1D,WAAS,SAAS,IAAY;AAC5B,QAAI,gBAAgB;AACpB,QAAI,gBAAgB;AACpB,UAAM,aAAa,mBAAmB;AAEtC,WAAO,kBAAkB,cAAc,aAAa,aAAa,KAAK,IAAI,EAAE,eAAe;AACxE,uBAAA;AAAA,IAAA;AAEjB,MAAA;AAGI,UAAA,QAAQ,KAAK,aAAa,aAAa,MAAM,aAAa,gBAAgB,CAAC,IAAI,aAAa,aAAa;AACzG,UAAA,YAAY,gBAAgB,OAAO;AACzC,UAAM,eAAe,SAAS,WAAW,IAAI,EAAE;AAE/C,QAAI,gBAAgB,kBAAkB;AACpC,aAAO,qBAAqB,IAAI,WAAW,IAAI,EAAE;AAAA,IAAA;AAGnD,QAAI,iBAAiB,GAAK;AACjB,aAAA;AAAA,IAAA;AAGT,WAAO,gBAAgB,IAAI,eAAe,gBAAgB,iBAAiB,IAAI,EAAE;AAAA,EAAA;AAO5E,SAAA,SAAS,WAAW,GAAW;AAEhC,QAAA,MAAM,KAAK,MAAM,GAAG;AACf,aAAA;AAAA,IAAA;AAGT,WAAO,WAAW,SAAS,CAAC,GAAG,IAAI,EAAE;AAAA,EACvC;AACF;AAEO,MAAM,aAAa,eAAe,MAAM,KAAK,MAAM,CAAC;AACpD,MAAM,eAAe,eAAe,GAAG,GAAG,GAAG,CAAC;AAC9C,MAAM,aAAa,eAAe,GAAG,GAAG,KAAK,CAAC;AAC9C,MAAM,WAAW,eAAe,MAAM,GAAG,GAAG,CAAC;AAC7C,MAAM,YAAY,eAAe,GAAG,GAAG,MAAM,CAAC;AAC9C,MAAM,cAAc,eAAe,MAAM,GAAG,MAAM,CAAC;AACnD,MAAM,eAAe,eAAe,MAAM,OAAO,MAAM,IAAI;AAC3D,MAAM,gBAAgB,eAAe,MAAM,OAAO,OAAO,IAAI;AAC7D,MAAM,gBAAgB,eAAe,OAAO,MAAM,OAAO,IAAI;AAC7D,MAAM,gBAAgB,eAAe,OAAO,MAAM,OAAO,IAAI;AAC7D,MAAM,eAAe,eAAe,MAAM,GAAG,OAAO,KAAK;AACzD,MAAM,eAAe,eAAe,MAAM,MAAM,OAAO,KAAK;AAC5D,MAAM,eAAe,eAAe,KAAK,MAAM,MAAM,KAAK;AAC1D,MAAM,eAAe,eAAe,KAAK,OAAO,OAAO,KAAK;AAC5D,MAAM,gBAAgB,eAAe,MAAM,MAAM,MAAM,IAAI;AAC3D,MAAM,iBAAiB,eAAe,OAAO,MAAM,OAAO,CAAC;AAC3D,MAAM,iBAAiB,eAAe,OAAO,MAAM,MAAM,CAAC;AAC1D,MAAM,iBAAiB,eAAe,MAAM,GAAG,MAAM,CAAC;AACtD,MAAM,gBAAgB,eAAe,MAAM,OAAO,OAAO,CAAC;AAC1D,MAAM,gBAAgB,eAAe,MAAM,GAAG,MAAM,CAAC;AACrD,MAAM,gBAAgB,eAAe,OAAO,MAAM,OAAO,CAAC;AAC1D,MAAM,gBAAgB,eAAe,OAAO,OAAO,MAAM,KAAK;AAC9D,MAAM,mBAAmB,eAAe,MAAM,GAAG,OAAO,CAAC;AACzD,MAAM,mBAAmB,eAAe,MAAM,GAAG,MAAM,CAAC;AACxD,MAAM,kBAAkB,eAAe,OAAO,MAAM,MAAM,IAAI;AAC9D,MAAM,kBAAkB,eAAe,GAAG,GAAG,GAAG,CAAC;AACjD,MAAM,kBAAkB,eAAe,OAAO,OAAO,MAAM,IAAI;AAC/D,MAAM,kBAAkB,eAAe,MAAM,OAAO,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/easing.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* https://github.com/gre/bezier-easing
|
|
3
|
+
* BezierEasing - use bezier curve for transition easing function
|
|
4
|
+
* by Gaëtan Renaudeau 2014 - 2015 – MIT License
|
|
5
|
+
*/
|
|
6
|
+
declare function LinearEasing(x: number): number;
|
|
7
|
+
/**
|
|
8
|
+
* 创建一个基于贝塞尔曲线的缓动函数。
|
|
9
|
+
*
|
|
10
|
+
* @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。
|
|
11
|
+
* @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。
|
|
12
|
+
* @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。
|
|
13
|
+
* @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。
|
|
14
|
+
* @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。
|
|
15
|
+
* @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。
|
|
16
|
+
*/
|
|
17
|
+
export declare function createEasingFn(x1: number, y1: number, x2: number, y2: number): typeof LinearEasing;
|
|
18
|
+
export declare const easingEase: typeof LinearEasing;
|
|
19
|
+
export declare const easingLinear: typeof LinearEasing;
|
|
20
|
+
export declare const easingSnap: typeof LinearEasing;
|
|
21
|
+
export declare const easingIn: typeof LinearEasing;
|
|
22
|
+
export declare const easingOut: typeof LinearEasing;
|
|
23
|
+
export declare const easingInOut: typeof LinearEasing;
|
|
24
|
+
export declare const easingInQuad: typeof LinearEasing;
|
|
25
|
+
export declare const easingInCubic: typeof LinearEasing;
|
|
26
|
+
export declare const easingInQuart: typeof LinearEasing;
|
|
27
|
+
export declare const easingInQuint: typeof LinearEasing;
|
|
28
|
+
export declare const easingInSine: typeof LinearEasing;
|
|
29
|
+
export declare const easingInExpo: typeof LinearEasing;
|
|
30
|
+
export declare const easingInCirc: typeof LinearEasing;
|
|
31
|
+
export declare const easingInBack: typeof LinearEasing;
|
|
32
|
+
export declare const easingOutQuad: typeof LinearEasing;
|
|
33
|
+
export declare const easingOutCubic: typeof LinearEasing;
|
|
34
|
+
export declare const easingOutQuart: typeof LinearEasing;
|
|
35
|
+
export declare const easingOutQuint: typeof LinearEasing;
|
|
36
|
+
export declare const easingOutSine: typeof LinearEasing;
|
|
37
|
+
export declare const easingOutExpo: typeof LinearEasing;
|
|
38
|
+
export declare const easingOutCirc: typeof LinearEasing;
|
|
39
|
+
export declare const easingOutBack: typeof LinearEasing;
|
|
40
|
+
export declare const easingInOutQuart: typeof LinearEasing;
|
|
41
|
+
export declare const easingInOutQuint: typeof LinearEasing;
|
|
42
|
+
export declare const easingInOutSine: typeof LinearEasing;
|
|
43
|
+
export declare const easingInOutExpo: typeof LinearEasing;
|
|
44
|
+
export declare const easingInOutCirc: typeof LinearEasing;
|
|
45
|
+
export declare const easingInOutBack: typeof LinearEasing;
|
|
46
|
+
export {};
|
package/dist/easing.mjs
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
const NEWTON_ITERATIONS = 4;
|
|
2
|
+
const NEWTON_MIN_SLOPE = 1e-3;
|
|
3
|
+
const SUBDIVISION_PRECISION = 1e-7;
|
|
4
|
+
const SUBDIVISION_MAX_ITERATIONS = 10;
|
|
5
|
+
const kSplineTableSize = 11;
|
|
6
|
+
const kSampleStepSize = 1 / (kSplineTableSize - 1);
|
|
7
|
+
const float32ArraySupported = typeof Float32Array === "function";
|
|
8
|
+
function A(aA1, aA2) {
|
|
9
|
+
return 1 - 3 * aA2 + 3 * aA1;
|
|
10
|
+
}
|
|
11
|
+
function B(aA1, aA2) {
|
|
12
|
+
return 3 * aA2 - 6 * aA1;
|
|
13
|
+
}
|
|
14
|
+
function C(aA1) {
|
|
15
|
+
return 3 * aA1;
|
|
16
|
+
}
|
|
17
|
+
function calcBezier(aT, aA1, aA2) {
|
|
18
|
+
return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
|
|
19
|
+
}
|
|
20
|
+
function getSlope(aT, aA1, aA2) {
|
|
21
|
+
return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
|
|
22
|
+
}
|
|
23
|
+
function binarySubdivide(aX, aA, aB, mX1, mX2) {
|
|
24
|
+
let currentX;
|
|
25
|
+
let currentT;
|
|
26
|
+
let i = 0;
|
|
27
|
+
let aBFinal = aB;
|
|
28
|
+
let aAFinal = aA;
|
|
29
|
+
do {
|
|
30
|
+
currentT = aAFinal + (aBFinal - aAFinal) / 2;
|
|
31
|
+
currentX = calcBezier(currentT, mX1, mX2) - aX;
|
|
32
|
+
if (currentX > 0) {
|
|
33
|
+
aBFinal = currentT;
|
|
34
|
+
} else {
|
|
35
|
+
aAFinal = currentT;
|
|
36
|
+
}
|
|
37
|
+
} while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
|
|
38
|
+
return currentT;
|
|
39
|
+
}
|
|
40
|
+
function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
|
|
41
|
+
let aGuessTFinal = aGuessT;
|
|
42
|
+
for (let i = 0; i < NEWTON_ITERATIONS; ++i) {
|
|
43
|
+
const currentSlope = getSlope(aGuessTFinal, mX1, mX2);
|
|
44
|
+
if (currentSlope === 0) {
|
|
45
|
+
return aGuessTFinal;
|
|
46
|
+
}
|
|
47
|
+
const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;
|
|
48
|
+
aGuessTFinal -= currentX / currentSlope;
|
|
49
|
+
}
|
|
50
|
+
return aGuessTFinal;
|
|
51
|
+
}
|
|
52
|
+
function LinearEasing(x) {
|
|
53
|
+
return x;
|
|
54
|
+
}
|
|
55
|
+
function createEasingFn(x1, y1, x2, y2) {
|
|
56
|
+
if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {
|
|
57
|
+
throw new Error("bezier x values must be in [0, 1] range");
|
|
58
|
+
}
|
|
59
|
+
if (x1 === y1 && x2 === y2) {
|
|
60
|
+
return LinearEasing;
|
|
61
|
+
}
|
|
62
|
+
const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
|
|
63
|
+
for (let i = 0; i < kSplineTableSize; ++i) {
|
|
64
|
+
sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);
|
|
65
|
+
}
|
|
66
|
+
function getTForX(aX) {
|
|
67
|
+
let intervalStart = 0;
|
|
68
|
+
let currentSample = 1;
|
|
69
|
+
const lastSample = kSplineTableSize - 1;
|
|
70
|
+
for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
|
|
71
|
+
intervalStart += kSampleStepSize;
|
|
72
|
+
}
|
|
73
|
+
--currentSample;
|
|
74
|
+
const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
|
|
75
|
+
const guessForT = intervalStart + dist * kSampleStepSize;
|
|
76
|
+
const initialSlope = getSlope(guessForT, x1, x2);
|
|
77
|
+
if (initialSlope >= NEWTON_MIN_SLOPE) {
|
|
78
|
+
return newtonRaphsonIterate(aX, guessForT, x1, x2);
|
|
79
|
+
}
|
|
80
|
+
if (initialSlope === 0) {
|
|
81
|
+
return guessForT;
|
|
82
|
+
}
|
|
83
|
+
return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);
|
|
84
|
+
}
|
|
85
|
+
return function easingFunc(x) {
|
|
86
|
+
if (x === 0 || x === 1) {
|
|
87
|
+
return x;
|
|
88
|
+
}
|
|
89
|
+
return calcBezier(getTForX(x), y1, y2);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);
|
|
93
|
+
const easingLinear = createEasingFn(0, 0, 1, 1);
|
|
94
|
+
const easingSnap = createEasingFn(0, 1, 0.5, 1);
|
|
95
|
+
const easingIn = createEasingFn(0.42, 0, 1, 1);
|
|
96
|
+
const easingOut = createEasingFn(0, 0, 0.58, 1);
|
|
97
|
+
const easingInOut = createEasingFn(0.42, 0, 0.58, 1);
|
|
98
|
+
const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);
|
|
99
|
+
const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);
|
|
100
|
+
const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);
|
|
101
|
+
const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);
|
|
102
|
+
const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);
|
|
103
|
+
const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);
|
|
104
|
+
const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);
|
|
105
|
+
const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);
|
|
106
|
+
const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);
|
|
107
|
+
const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);
|
|
108
|
+
const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);
|
|
109
|
+
const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);
|
|
110
|
+
const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);
|
|
111
|
+
const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);
|
|
112
|
+
const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);
|
|
113
|
+
const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);
|
|
114
|
+
const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);
|
|
115
|
+
const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);
|
|
116
|
+
const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);
|
|
117
|
+
const easingInOutExpo = createEasingFn(1, 0, 0, 1);
|
|
118
|
+
const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);
|
|
119
|
+
const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);
|
|
120
|
+
export {
|
|
121
|
+
createEasingFn,
|
|
122
|
+
easingEase,
|
|
123
|
+
easingIn,
|
|
124
|
+
easingInBack,
|
|
125
|
+
easingInCirc,
|
|
126
|
+
easingInCubic,
|
|
127
|
+
easingInExpo,
|
|
128
|
+
easingInOut,
|
|
129
|
+
easingInOutBack,
|
|
130
|
+
easingInOutCirc,
|
|
131
|
+
easingInOutExpo,
|
|
132
|
+
easingInOutQuart,
|
|
133
|
+
easingInOutQuint,
|
|
134
|
+
easingInOutSine,
|
|
135
|
+
easingInQuad,
|
|
136
|
+
easingInQuart,
|
|
137
|
+
easingInQuint,
|
|
138
|
+
easingInSine,
|
|
139
|
+
easingLinear,
|
|
140
|
+
easingOut,
|
|
141
|
+
easingOutBack,
|
|
142
|
+
easingOutCirc,
|
|
143
|
+
easingOutCubic,
|
|
144
|
+
easingOutExpo,
|
|
145
|
+
easingOutQuad,
|
|
146
|
+
easingOutQuart,
|
|
147
|
+
easingOutQuint,
|
|
148
|
+
easingOutSine,
|
|
149
|
+
easingSnap
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=easing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.mjs","sources":["../src/easing.ts"],"sourcesContent":["/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nconst float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A(aA1: number, aA2: number) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n}\nfunction B(aA1: number, aA2: number) {\n return 3.0 * aA2 - 6.0 * aA1;\n}\nfunction C(aA1: number) {\n return 3.0 * aA1;\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n let currentX: number;\n let currentT: number;\n let i = 0;\n let aBFinal = aB;\n let aAFinal = aA;\n\n do {\n currentT = aAFinal + (aBFinal - aAFinal) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aBFinal = currentT;\n } else {\n aAFinal = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {\n let aGuessTFinal = aGuessT;\n for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n const currentSlope = getSlope(aGuessTFinal, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessTFinal;\n }\n const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;\n aGuessTFinal -= currentX / currentSlope;\n }\n return aGuessTFinal;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\n/**\n * 创建一个基于贝塞尔曲线的缓动函数。\n *\n * @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。\n * @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。\n */\nexport function createEasingFn(x1: number, y1: number, x2: number, y2: number) {\n if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (x1 === y1 && x2 === y2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (let i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);\n }\n\n function getTForX(aX: number) {\n let intervalStart = 0.0;\n let currentSample = 1;\n const lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n const guessForT = intervalStart + dist * kSampleStepSize;\n const initialSlope = getSlope(guessForT, x1, x2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, x1, x2);\n }\n\n if (initialSlope === 0.0) {\n return guessForT;\n }\n\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);\n }\n\n /**\n * 贝塞尔曲线方程\n * @param x {number} 0~1\n */\n return function easingFunc(x: number) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n\n return calcBezier(getTForX(x), y1, y2);\n };\n}\n\nexport const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);\nexport const easingLinear = createEasingFn(0, 0, 1, 1);\nexport const easingSnap = createEasingFn(0, 1, 0.5, 1);\nexport const easingIn = createEasingFn(0.42, 0, 1, 1);\nexport const easingOut = createEasingFn(0, 0, 0.58, 1);\nexport const easingInOut = createEasingFn(0.42, 0, 0.58, 1);\nexport const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);\nexport const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);\nexport const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);\nexport const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);\nexport const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);\nexport const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);\nexport const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);\nexport const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);\nexport const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);\nexport const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);\nexport const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);\nexport const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);\nexport const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);\nexport const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);\nexport const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);\nexport const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);\nexport const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);\nexport const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);\nexport const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);\nexport const easingInOutExpo = createEasingFn(1, 0, 0, 1);\nexport const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);\nexport const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);\n"],"names":[],"mappings":"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"}
|
package/dist/emitter.cjs
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __typeError = (msg) => {
|
|
3
|
+
throw TypeError(msg);
|
|
4
|
+
};
|
|
5
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
6
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
7
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
8
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
+
var _events, _Emitter_instances, offAll_fn, offEvent_fn, offListener_fn;
|
|
10
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
11
|
+
class Emitter {
|
|
12
|
+
constructor() {
|
|
13
|
+
__privateAdd(this, _Emitter_instances);
|
|
14
|
+
__privateAdd(this, _events, /* @__PURE__ */ new Map());
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 注册事件监听器
|
|
18
|
+
* @param event - 要监听的事件名称
|
|
19
|
+
* @param listener - 事件监听器函数
|
|
20
|
+
* @example
|
|
21
|
+
* emitter.on('click', (x, y) => {
|
|
22
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
23
|
+
* });
|
|
24
|
+
*/
|
|
25
|
+
on(event, listener) {
|
|
26
|
+
const listeners = __privateGet(this, _events).get(event);
|
|
27
|
+
if (listeners) {
|
|
28
|
+
listeners.add(listener);
|
|
29
|
+
} else {
|
|
30
|
+
__privateGet(this, _events).set(event, /* @__PURE__ */ new Set([listener]));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 移除事件监听器,有三种使用方式:
|
|
35
|
+
* 1. 移除特定事件的特定监听器
|
|
36
|
+
* 2. 移除特定事件的所有监听器
|
|
37
|
+
* 3. 移除所有事件的所有监听器
|
|
38
|
+
* @param event - 要移除的事件名称(可选)
|
|
39
|
+
* @param listener - 要移除的监听器函数(可选)
|
|
40
|
+
* @example
|
|
41
|
+
* // 移除特定事件的特定监听器
|
|
42
|
+
* emitter.off('click', clickHandler);
|
|
43
|
+
*
|
|
44
|
+
* // 移除特定事件的所有监听器
|
|
45
|
+
* emitter.off('click');
|
|
46
|
+
*
|
|
47
|
+
* // 移除所有事件的所有监听器
|
|
48
|
+
* emitter.off();
|
|
49
|
+
*/
|
|
50
|
+
off(event, listener) {
|
|
51
|
+
if (event && listener) {
|
|
52
|
+
__privateMethod(this, _Emitter_instances, offListener_fn).call(this, event, listener);
|
|
53
|
+
} else if (event) {
|
|
54
|
+
__privateMethod(this, _Emitter_instances, offEvent_fn).call(this, event);
|
|
55
|
+
} else {
|
|
56
|
+
__privateMethod(this, _Emitter_instances, offAll_fn).call(this);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 触发指定事件,调用所有注册的监听器
|
|
61
|
+
* @param event - 要触发的事件名称
|
|
62
|
+
* @param payloads - 传递给监听器的参数
|
|
63
|
+
* @remarks
|
|
64
|
+
* 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,
|
|
65
|
+
* 则后续监听器将不会被执行
|
|
66
|
+
* @example
|
|
67
|
+
* emitter.emit('click', 10, 20);
|
|
68
|
+
*/
|
|
69
|
+
emit(event, ...payloads) {
|
|
70
|
+
const listeners = __privateGet(this, _events).get(event);
|
|
71
|
+
if (!listeners) return;
|
|
72
|
+
for (const listener of [...listeners]) {
|
|
73
|
+
if (listener(...payloads) === false) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
_events = new WeakMap();
|
|
80
|
+
_Emitter_instances = new WeakSet();
|
|
81
|
+
offAll_fn = function() {
|
|
82
|
+
__privateGet(this, _events).clear();
|
|
83
|
+
};
|
|
84
|
+
offEvent_fn = function(event) {
|
|
85
|
+
__privateGet(this, _events).delete(event);
|
|
86
|
+
};
|
|
87
|
+
offListener_fn = function(event, listener) {
|
|
88
|
+
const listeners = __privateGet(this, _events).get(event);
|
|
89
|
+
if (listeners) {
|
|
90
|
+
listeners.delete(listener);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.Emitter = Emitter;
|
|
94
|
+
//# sourceMappingURL=emitter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.cjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap> {\n #events: Map<keyof E, Set<AnyFunction>> = new Map();\n\n /**\n * 注册事件监听器\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n on<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n if (listeners) {\n listeners.add(listener);\n } else {\n this.#events.set(event, new Set([listener]));\n }\n }\n\n /**\n * 移除事件监听器,有三种使用方式:\n * 1. 移除特定事件的特定监听器\n * 2. 移除特定事件的所有监听器\n * 3. 移除所有事件的所有监听器\n * @param event - 要移除的事件名称(可选)\n * @param listener - 要移除的监听器函数(可选)\n * @example\n * // 移除特定事件的特定监听器\n * emitter.off('click', clickHandler);\n *\n * // 移除特定事件的所有监听器\n * emitter.off('click');\n *\n * // 移除所有事件的所有监听器\n * emitter.off();\n */\n off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>) {\n if (event && listener) {\n this.#offListener(event, listener);\n } else if (event) {\n this.#offEvent(event);\n } else {\n this.#offAll();\n }\n }\n\n #offAll() {\n this.#events.clear();\n }\n\n #offEvent<K extends keyof E>(event: K) {\n this.#events.delete(event);\n }\n\n #offListener<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 触发指定事件,调用所有注册的监听器\n * @param event - 要触发的事件名称\n * @param payloads - 传递给监听器的参数\n * @remarks\n * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,\n * 则后续监听器将不会被执行\n * @example\n * emitter.emit('click', 10, 20);\n */\n emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>) {\n const listeners = this.#events.get(event) as Set<EmitterListener<E, K>> | undefined;\n\n if (!listeners) return;\n\n // 避免在 emit、on 的过程中改变 listeners 从而影响本次 emit\n for (const listener of [...listeners]) {\n if (listener(...payloads) === false) {\n break;\n }\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,QAA8B;AAAA,EAApC;AAAA;AACL,oDAA8C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,GAAsB,OAAU,UAAiC;AAC/D,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AACxC,QAAI,WAAW;AACb,gBAAU,IAAI,QAAQ;AAAA,IAAA,OACjB;AACA,yBAAA,SAAQ,IAAI,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBF,IAAuB,OAAW,UAAkC;AAClE,QAAI,SAAS,UAAU;AAChB,4BAAA,oCAAA,WAAa,OAAO;AAAA,eAChB,OAAO;AAChB,4BAAK,iCAAL,WAAe;AAAA,IAAK,OACf;AACL,4BAAK,+BAAL;AAAA,IAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BF,KAAwB,UAAa,UAA6C;AAChF,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,QAAI,CAAC,UAAW;AAGhB,eAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AACrC,UAAI,SAAS,GAAG,QAAQ,MAAM,OAAO;AACnC;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;AArFE;AADK;AAgDL,YAAU,WAAA;AACR,qBAAK,SAAQ,MAAM;AAAA;AAGrB,uBAA6B,OAAU;AAChC,qBAAA,SAAQ,OAAO,KAAK;AAAA;AAG3B,iBAAA,SAAgC,OAAU,UAAiC;AACzE,QAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,MAAI,WAAW;AACb,cAAU,OAAO,QAAQ;AAAA,EAAA;AAC3B;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 事件类型映射,key 为事件名称,value 为事件参数类型数组
|
|
3
|
+
*/
|
|
4
|
+
export type EmitterMap = Record<string, unknown[]>;
|
|
5
|
+
/**
|
|
6
|
+
* 事件监听器函数类型
|
|
7
|
+
* @template E - EmitterMap 类型
|
|
8
|
+
* @template K - 事件名称类型
|
|
9
|
+
*/
|
|
10
|
+
export type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;
|
|
11
|
+
/**
|
|
12
|
+
* 事件发射器类,用于管理事件监听和触发
|
|
13
|
+
* @template E - 事件类型映射
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* type MyEvents = {
|
|
17
|
+
* 'click': [x: number, y: number];
|
|
18
|
+
* 'change': [value: string];
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* const emitter = new Emitter<MyEvents>();
|
|
22
|
+
* emitter.on('click', (x, y) => {
|
|
23
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
24
|
+
* });
|
|
25
|
+
* emitter.emit('click', 10, 20);
|
|
26
|
+
*/
|
|
27
|
+
export declare class Emitter<E extends EmitterMap> {
|
|
28
|
+
#private;
|
|
29
|
+
/**
|
|
30
|
+
* 注册事件监听器
|
|
31
|
+
* @param event - 要监听的事件名称
|
|
32
|
+
* @param listener - 事件监听器函数
|
|
33
|
+
* @example
|
|
34
|
+
* emitter.on('click', (x, y) => {
|
|
35
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
36
|
+
* });
|
|
37
|
+
*/
|
|
38
|
+
on<K extends keyof E>(event: K, listener: EmitterListener<E, K>): void;
|
|
39
|
+
/**
|
|
40
|
+
* 移除事件监听器,有三种使用方式:
|
|
41
|
+
* 1. 移除特定事件的特定监听器
|
|
42
|
+
* 2. 移除特定事件的所有监听器
|
|
43
|
+
* 3. 移除所有事件的所有监听器
|
|
44
|
+
* @param event - 要移除的事件名称(可选)
|
|
45
|
+
* @param listener - 要移除的监听器函数(可选)
|
|
46
|
+
* @example
|
|
47
|
+
* // 移除特定事件的特定监听器
|
|
48
|
+
* emitter.off('click', clickHandler);
|
|
49
|
+
*
|
|
50
|
+
* // 移除特定事件的所有监听器
|
|
51
|
+
* emitter.off('click');
|
|
52
|
+
*
|
|
53
|
+
* // 移除所有事件的所有监听器
|
|
54
|
+
* emitter.off();
|
|
55
|
+
*/
|
|
56
|
+
off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>): void;
|
|
57
|
+
/**
|
|
58
|
+
* 触发指定事件,调用所有注册的监听器
|
|
59
|
+
* @param event - 要触发的事件名称
|
|
60
|
+
* @param payloads - 传递给监听器的参数
|
|
61
|
+
* @remarks
|
|
62
|
+
* 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,
|
|
63
|
+
* 则后续监听器将不会被执行
|
|
64
|
+
* @example
|
|
65
|
+
* emitter.emit('click', 10, 20);
|
|
66
|
+
*/
|
|
67
|
+
emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>): void;
|
|
68
|
+
}
|