semantic-typescript 0.3.8 → 0.5.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/collectable.d.ts +119 -1
- package/dist/collectable.js +624 -21
- package/dist/collector.d.ts +94 -50
- package/dist/collector.js +128 -110
- package/dist/factory.d.ts +23 -35
- package/dist/factory.js +162 -68
- package/dist/guard.d.ts +43 -28
- package/dist/guard.js +144 -65
- package/dist/hash.d.ts +13 -0
- package/dist/hash.js +205 -0
- package/dist/hook.d.ts +16 -4
- package/dist/hook.js +19 -15
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/map.d.ts +76 -0
- package/dist/map.js +253 -0
- package/dist/node.d.ts +182 -0
- package/dist/node.js +918 -0
- package/dist/optional.d.ts +3 -0
- package/dist/optional.js +26 -23
- package/dist/semantic.d.ts +1 -3
- package/dist/semantic.js +43 -50
- package/dist/set.d.ts +19 -0
- package/dist/set.js +65 -0
- package/dist/statistics.js +21 -15
- package/dist/symbol.d.ts +14 -0
- package/dist/symbol.js +14 -0
- package/dist/tree.d.ts +82 -0
- package/dist/tree.js +257 -0
- package/dist/utility.d.ts +8 -1
- package/dist/utility.js +9 -0
- package/dist/window.js +7 -5
- package/package.json +1 -5
- package/readme.cn.md +381 -636
- package/readme.md +3 -1
package/dist/guard.js
CHANGED
|
@@ -1,121 +1,200 @@
|
|
|
1
|
-
import { BigIntStatisticsSymbol, CollectableSymbol, CollectorsSymbol, NumericStatisticsSymbol, OrderedCollectableSymbol, SemanticSymbol, StatisticsSymbol, UnorderedCollectableSymbol, WindowCollectableSymbol } from "./symbol";
|
|
2
|
-
export let isBoolean = (
|
|
3
|
-
return typeof
|
|
1
|
+
import { BigIntStatisticsSymbol, BinaryNodeSymbol, CollectableSymbol, CollectorsSymbol, LinearNodeSymbol, NodeSymbol, NumericStatisticsSymbol, OptionalSymbol, OrderedCollectableSymbol, RedBlackNodeSymbol, SemanticMapSymbol, SemanticSymbol, StatisticsSymbol, UnorderedCollectableSymbol, WindowCollectableSymbol } from "./symbol";
|
|
2
|
+
export let isBoolean = (target) => {
|
|
3
|
+
return typeof target === "boolean";
|
|
4
4
|
};
|
|
5
|
-
export let isString = (
|
|
6
|
-
return typeof
|
|
5
|
+
export let isString = (target) => {
|
|
6
|
+
return typeof target === "string";
|
|
7
7
|
};
|
|
8
|
-
export let isNumber = (
|
|
9
|
-
return typeof
|
|
8
|
+
export let isNumber = (target) => {
|
|
9
|
+
return typeof target === "number" && !Number.isNaN(target) && Number.isFinite(target);
|
|
10
10
|
};
|
|
11
|
-
export let isFunction = (
|
|
12
|
-
return typeof
|
|
11
|
+
export let isFunction = (target) => {
|
|
12
|
+
return typeof target === "function";
|
|
13
13
|
};
|
|
14
|
-
export let isObject = (
|
|
15
|
-
return typeof
|
|
14
|
+
export let isObject = (target) => {
|
|
15
|
+
return typeof target === "object" && target !== null;
|
|
16
16
|
};
|
|
17
|
-
export let isSymbol = (
|
|
18
|
-
return typeof
|
|
17
|
+
export let isSymbol = (target) => {
|
|
18
|
+
return typeof target === "symbol";
|
|
19
19
|
};
|
|
20
|
-
export let isBigInt = (
|
|
21
|
-
return typeof
|
|
20
|
+
export let isBigInt = (target) => {
|
|
21
|
+
return typeof target === "bigint";
|
|
22
22
|
};
|
|
23
|
-
export let isPrimitive = (
|
|
24
|
-
return isBoolean(
|
|
23
|
+
export let isPrimitive = (target) => {
|
|
24
|
+
return isBoolean(target) || isString(target) || isNumber(target) || isSymbol(target) || isBigInt(target) || isFunction(target);
|
|
25
25
|
};
|
|
26
|
-
export let isAsyncIterable = (
|
|
27
|
-
if (isObject(
|
|
28
|
-
return isFunction(Reflect.get(
|
|
26
|
+
export let isAsyncIterable = (target) => {
|
|
27
|
+
if (isObject(target)) {
|
|
28
|
+
return isFunction(Reflect.get(target, Symbol.asyncIterator));
|
|
29
29
|
}
|
|
30
30
|
return false;
|
|
31
31
|
};
|
|
32
|
-
export let isIterable = (
|
|
33
|
-
if (isObject(
|
|
34
|
-
return isFunction(Reflect.get(
|
|
32
|
+
export let isIterable = (target) => {
|
|
33
|
+
if (isObject(target)) {
|
|
34
|
+
return isFunction(Reflect.get(target, Symbol.iterator));
|
|
35
35
|
}
|
|
36
36
|
return false;
|
|
37
37
|
};
|
|
38
|
-
export let isSemantic = (
|
|
39
|
-
if (isObject(
|
|
40
|
-
return Reflect.get(
|
|
38
|
+
export let isSemantic = (target) => {
|
|
39
|
+
if (isObject(target)) {
|
|
40
|
+
return Reflect.get(target, "Semantic") === SemanticSymbol;
|
|
41
41
|
}
|
|
42
42
|
return false;
|
|
43
43
|
};
|
|
44
|
-
export let isCollector = (
|
|
45
|
-
if (isObject(
|
|
46
|
-
return Reflect.get(
|
|
44
|
+
export let isCollector = (target) => {
|
|
45
|
+
if (isObject(target)) {
|
|
46
|
+
return Reflect.get(target, "Collector") === CollectorsSymbol;
|
|
47
47
|
}
|
|
48
48
|
return false;
|
|
49
49
|
};
|
|
50
|
-
export let isCollectable = (
|
|
51
|
-
if (isObject(
|
|
52
|
-
return Reflect.get(
|
|
50
|
+
export let isCollectable = (target) => {
|
|
51
|
+
if (isObject(target)) {
|
|
52
|
+
return Reflect.get(target, "Collectable") === CollectableSymbol;
|
|
53
53
|
}
|
|
54
54
|
return false;
|
|
55
55
|
};
|
|
56
|
-
export let isOrderedCollectable = (
|
|
57
|
-
if (isObject(
|
|
58
|
-
return Reflect.get(
|
|
56
|
+
export let isOrderedCollectable = (target) => {
|
|
57
|
+
if (isObject(target)) {
|
|
58
|
+
return Reflect.get(target, "OrderedCollectable") === OrderedCollectableSymbol;
|
|
59
59
|
}
|
|
60
60
|
return false;
|
|
61
61
|
};
|
|
62
|
-
export let isWindowCollectable = (
|
|
63
|
-
if (isObject(
|
|
64
|
-
return Reflect.get(
|
|
62
|
+
export let isWindowCollectable = (target) => {
|
|
63
|
+
if (isObject(target)) {
|
|
64
|
+
return Reflect.get(target, "WindowCollectable") === WindowCollectableSymbol;
|
|
65
65
|
}
|
|
66
66
|
return false;
|
|
67
67
|
};
|
|
68
|
-
export let isUnorderedCollectable = (
|
|
69
|
-
if (isObject(
|
|
70
|
-
return Reflect.get(
|
|
68
|
+
export let isUnorderedCollectable = (target) => {
|
|
69
|
+
if (isObject(target)) {
|
|
70
|
+
return Reflect.get(target, "UnorderedCollectable") === UnorderedCollectableSymbol;
|
|
71
71
|
}
|
|
72
72
|
return false;
|
|
73
73
|
};
|
|
74
|
-
export let isStatistics = (
|
|
75
|
-
if (isObject(
|
|
76
|
-
return Reflect.get(
|
|
74
|
+
export let isStatistics = (target) => {
|
|
75
|
+
if (isObject(target)) {
|
|
76
|
+
return Reflect.get(target, "Statistics") === StatisticsSymbol;
|
|
77
77
|
}
|
|
78
78
|
return false;
|
|
79
79
|
};
|
|
80
|
-
export let isNumericStatistics = (
|
|
81
|
-
if (isObject(
|
|
82
|
-
return Reflect.get(
|
|
80
|
+
export let isNumericStatistics = (target) => {
|
|
81
|
+
if (isObject(target)) {
|
|
82
|
+
return Reflect.get(target, "NumericStatistics") === NumericStatisticsSymbol;
|
|
83
83
|
}
|
|
84
84
|
return false;
|
|
85
85
|
};
|
|
86
|
-
export let isBigIntStatistics = (
|
|
87
|
-
if (isObject(
|
|
88
|
-
return Reflect.get(
|
|
86
|
+
export let isBigIntStatistics = (target) => {
|
|
87
|
+
if (isObject(target)) {
|
|
88
|
+
return Reflect.get(target, "BigIntStatistics") === BigIntStatisticsSymbol;
|
|
89
89
|
}
|
|
90
90
|
return false;
|
|
91
91
|
};
|
|
92
|
-
export let
|
|
93
|
-
if (isObject(
|
|
94
|
-
return
|
|
92
|
+
export let isSemanticMap = (target) => {
|
|
93
|
+
if (isObject(target)) {
|
|
94
|
+
return Reflect.get(target, "SemanticMap") === SemanticMapSymbol;
|
|
95
95
|
}
|
|
96
96
|
return false;
|
|
97
97
|
};
|
|
98
|
-
export let
|
|
99
|
-
if (
|
|
100
|
-
return
|
|
98
|
+
export let isHashMap = (target) => {
|
|
99
|
+
if (isObject(target)) {
|
|
100
|
+
return Reflect.get(target, "HashMap") === SemanticMapSymbol;
|
|
101
101
|
}
|
|
102
102
|
return false;
|
|
103
103
|
};
|
|
104
|
-
export let
|
|
105
|
-
if (
|
|
106
|
-
return
|
|
104
|
+
export let isHashSet = (target) => {
|
|
105
|
+
if (isObject(target)) {
|
|
106
|
+
return false;
|
|
107
107
|
}
|
|
108
108
|
return false;
|
|
109
109
|
};
|
|
110
|
-
export let
|
|
111
|
-
if (
|
|
112
|
-
return Reflect.get(
|
|
110
|
+
export let isNode = (target) => {
|
|
111
|
+
if (isObject(target)) {
|
|
112
|
+
return Reflect.get(target, "Node") === NodeSymbol;
|
|
113
113
|
}
|
|
114
114
|
return false;
|
|
115
115
|
};
|
|
116
|
-
export let
|
|
117
|
-
if (
|
|
118
|
-
return Reflect.get(
|
|
116
|
+
export let isLinearNode = (target) => {
|
|
117
|
+
if (isObject(target)) {
|
|
118
|
+
return isNode(target) && Reflect.get(target, "LinearNode") === LinearNodeSymbol;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
};
|
|
122
|
+
export let isBinaryNode = (target) => {
|
|
123
|
+
if (isObject(target)) {
|
|
124
|
+
return isNode(target) && Reflect.get(target, "BinaryNode") === BinaryNodeSymbol;
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
};
|
|
128
|
+
export let isRedBlackNode = (target) => {
|
|
129
|
+
if (isObject(target)) {
|
|
130
|
+
return isBinaryNode(target) && Reflect.get(target, "RedBlackNode") === RedBlackNodeSymbol;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
};
|
|
134
|
+
export let isTree = (target) => {
|
|
135
|
+
if (isObject(target)) {
|
|
136
|
+
return isNode(target) && (isLinearNode(target) || isBinaryNode(target));
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
};
|
|
140
|
+
export let isBinaryTree = (target) => {
|
|
141
|
+
if (isObject(target)) {
|
|
142
|
+
return isNode(target) && isBinaryNode(target);
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
};
|
|
146
|
+
export let isRedBlackTree = (target) => {
|
|
147
|
+
if (isObject(target)) {
|
|
148
|
+
return isNode(target) && isRedBlackNode(target);
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
};
|
|
152
|
+
export let isOptional = (target) => {
|
|
153
|
+
if (isObject(target)) {
|
|
154
|
+
return Reflect.get(target, "Optional") === OptionalSymbol;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
};
|
|
158
|
+
export let isPromise = (target) => {
|
|
159
|
+
if (isObject(target)) {
|
|
160
|
+
return isFunction(Reflect.get(target, "then")) && isFunction(Reflect.get(target, "catch"));
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
};
|
|
164
|
+
export let isAsyncFunction = (target) => {
|
|
165
|
+
if (isFunction(target)) {
|
|
166
|
+
return Reflect.get(target, Symbol.toStringTag) === "AsyncFunction" && target.constructor.name === "AsyncFunction";
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
};
|
|
170
|
+
export let isGeneratorFunction = (target) => {
|
|
171
|
+
if (isObject(target)) {
|
|
172
|
+
return isFunction(target) && Reflect.get(target, "constructor").name === "GeneratorFunction";
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
};
|
|
176
|
+
export let isAsyncGeneratorFunction = (target) => {
|
|
177
|
+
if (isObject(target)) {
|
|
178
|
+
return isFunction(target) && Reflect.get(target, "constructor").name === "AsyncGeneratorFunction";
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
};
|
|
182
|
+
export let isWindow = (target) => {
|
|
183
|
+
if (isObject(target) && isObject(Reflect.get(target, "window"))) {
|
|
184
|
+
return Object.prototype.toString.call(Reflect.get(target, "window")) === "[object Window]";
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
};
|
|
188
|
+
export let isDocument = (target) => {
|
|
189
|
+
if (isObject(target) && isObject(Reflect.get(target, "document"))) {
|
|
190
|
+
return Object.prototype.toString.call(Reflect.get(target, "document")) === "[object HTMLDocument]";
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
};
|
|
194
|
+
export let isHTMLElemet = (target) => {
|
|
195
|
+
if (isObject(target)) {
|
|
196
|
+
let regex = /^\[object HTML\w+Element\]$/;
|
|
197
|
+
return regex.test(Object.prototype.toString.call(target));
|
|
119
198
|
}
|
|
120
199
|
return false;
|
|
121
200
|
};
|
package/dist/hash.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Type } from "./utility";
|
|
2
|
+
export declare let maskOf: (type: Type) => bigint;
|
|
3
|
+
interface Handler<T> {
|
|
4
|
+
(value: T): bigint;
|
|
5
|
+
}
|
|
6
|
+
export declare let register: <T>(type: Type, handler: Handler<T>) => void;
|
|
7
|
+
export declare let unregister: (type: Type) => void;
|
|
8
|
+
interface UseHash {
|
|
9
|
+
<T = unknown>(target: T): bigint;
|
|
10
|
+
(...value: Array<unknown>): bigint;
|
|
11
|
+
}
|
|
12
|
+
export declare let useHash: UseHash;
|
|
13
|
+
export {};
|
package/dist/hash.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { isBigInt, isBoolean, isFunction, isNumber, isObject, isString, isSymbol } from "./guard";
|
|
2
|
+
import { useTraverse } from "./hook";
|
|
3
|
+
import { typeOf } from "./utility";
|
|
4
|
+
const masks = new Map();
|
|
5
|
+
masks.set("undefined", BigInt(masks.size));
|
|
6
|
+
masks.set("null", BigInt(masks.size));
|
|
7
|
+
masks.set("boolean", BigInt(masks.size));
|
|
8
|
+
masks.set("number", BigInt(masks.size));
|
|
9
|
+
masks.set("bigint", BigInt(masks.size));
|
|
10
|
+
masks.set("symbol", BigInt(masks.size));
|
|
11
|
+
masks.set("string", BigInt(masks.size));
|
|
12
|
+
masks.set("function", BigInt(masks.size));
|
|
13
|
+
masks.set("object", BigInt(masks.size));
|
|
14
|
+
Object.freeze(masks);
|
|
15
|
+
export let maskOf = (type) => {
|
|
16
|
+
return masks.get(type) || masks.get("object") || 0n;
|
|
17
|
+
};
|
|
18
|
+
let primitive = new Map();
|
|
19
|
+
let complex = new WeakMap();
|
|
20
|
+
const handlers = new Map();
|
|
21
|
+
export let register = (type, handler) => {
|
|
22
|
+
if (isString(type) && isFunction(handler)) {
|
|
23
|
+
handlers.set(type, handler);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export let unregister = (type) => {
|
|
27
|
+
let whiteList = ["undefined", "null", "boolean", "number", "bigint", "symbol", "string", "function", "object"];
|
|
28
|
+
if (isString(type) && handlers.has(type) && !whiteList.includes(type)) {
|
|
29
|
+
handlers.delete(type);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
register("undefined", (value) => {
|
|
33
|
+
if (value === (void 0)) {
|
|
34
|
+
if (primitive.has(value)) {
|
|
35
|
+
return primitive.get(value) || 0n;
|
|
36
|
+
}
|
|
37
|
+
let mask = maskOf("undefined");
|
|
38
|
+
let result = (0n << 4n) | mask;
|
|
39
|
+
primitive.set(value, result);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
return 0n;
|
|
43
|
+
});
|
|
44
|
+
register("null", (value) => {
|
|
45
|
+
if (value === null) {
|
|
46
|
+
if (primitive.has(value)) {
|
|
47
|
+
return primitive.get(value) || 0n;
|
|
48
|
+
}
|
|
49
|
+
let mask = maskOf("null");
|
|
50
|
+
let result = (0n << 4n) | mask;
|
|
51
|
+
primitive.set(value, result);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
return 0n;
|
|
55
|
+
});
|
|
56
|
+
register("boolean", (value) => {
|
|
57
|
+
if (isBoolean(value)) {
|
|
58
|
+
if (primitive.has(value)) {
|
|
59
|
+
return primitive.get(value) || 0n;
|
|
60
|
+
}
|
|
61
|
+
let mask = maskOf("boolean");
|
|
62
|
+
let result = ((value === true ? 1n : 0n) << 4n) | mask;
|
|
63
|
+
primitive.set(value, result);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
return 0n;
|
|
67
|
+
});
|
|
68
|
+
register("number", (value) => {
|
|
69
|
+
if (isNumber(value)) {
|
|
70
|
+
if (primitive.has(value)) {
|
|
71
|
+
return primitive.get(value) || 0n;
|
|
72
|
+
}
|
|
73
|
+
let mask = maskOf("number");
|
|
74
|
+
let bit = 0xffffffffffffffffn;
|
|
75
|
+
let buffer = new ArrayBuffer(8);
|
|
76
|
+
let array = new Float64Array(buffer);
|
|
77
|
+
array[0] = value;
|
|
78
|
+
let view = new BigInt64Array(buffer);
|
|
79
|
+
let result = ((view[0] << 4n) & bit) | mask;
|
|
80
|
+
primitive.set(value, result);
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
return 0n;
|
|
84
|
+
});
|
|
85
|
+
register("bigint", (value) => {
|
|
86
|
+
if (isBigInt(value)) {
|
|
87
|
+
if (primitive.has(value)) {
|
|
88
|
+
return primitive.get(value) || 0n;
|
|
89
|
+
}
|
|
90
|
+
let mask = maskOf("bigint");
|
|
91
|
+
let bit = 0xffffffffffffffffn;
|
|
92
|
+
let result = ((value << 4n) & bit) | mask;
|
|
93
|
+
primitive.set(value, result);
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
return 0n;
|
|
97
|
+
});
|
|
98
|
+
register("string", (value) => {
|
|
99
|
+
if (isString(value)) {
|
|
100
|
+
if (primitive.has(value)) {
|
|
101
|
+
return primitive.get(value) || 0n;
|
|
102
|
+
}
|
|
103
|
+
let mask = maskOf("string");
|
|
104
|
+
let bit = 0xffffffffffffffffn;
|
|
105
|
+
let gap = value.length < 64 ? 1 : Math.ceil(Math.log2(value.length));
|
|
106
|
+
let result = 0n;
|
|
107
|
+
for (let i = 0; i < value.length; i += gap) {
|
|
108
|
+
result = (((result * 33n) & bit) ^ BigInt(value.charCodeAt(i))) + BigInt(i);
|
|
109
|
+
}
|
|
110
|
+
result = (result ^ (result >> 32n)) * 0x9e3779b97f4a7c15n;
|
|
111
|
+
result = (((result ^ (result >> 32n)) << 4n) & bit) | mask;
|
|
112
|
+
primitive.set(value, result);
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
return 0n;
|
|
116
|
+
});
|
|
117
|
+
register("symbol", (value) => {
|
|
118
|
+
if (isSymbol(value)) {
|
|
119
|
+
if (primitive.has(value)) {
|
|
120
|
+
return primitive.get(value) || 0n;
|
|
121
|
+
}
|
|
122
|
+
let mask = maskOf("symbol");
|
|
123
|
+
let bit = 0xffffffffffffffffn;
|
|
124
|
+
let description = (value.description || "") + String(value);
|
|
125
|
+
let result = 0n;
|
|
126
|
+
let gap = description.length < 64 ? 1 : Math.ceil(Math.log2(description.length));
|
|
127
|
+
for (let i = 0; i < description.length; i += gap) {
|
|
128
|
+
result = (((result * 33n) & bit) ^ BigInt(description.charCodeAt(i))) + BigInt(i);
|
|
129
|
+
}
|
|
130
|
+
result = (result ^ (result >> 32n)) * 0x9e3779b97f4a7c15n;
|
|
131
|
+
result = (((result ^ (result >> 32n)) << 4n) & bit) | mask;
|
|
132
|
+
primitive.set(value, result);
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
return 0n;
|
|
136
|
+
});
|
|
137
|
+
register("function", (value) => {
|
|
138
|
+
if (isFunction(value)) {
|
|
139
|
+
if (primitive.has(value)) {
|
|
140
|
+
return primitive.get(value) || 0n;
|
|
141
|
+
}
|
|
142
|
+
let mask = maskOf("function");
|
|
143
|
+
let bit = 0xffffffffffffffffn;
|
|
144
|
+
let description = (value.name || "") + String(value);
|
|
145
|
+
let result = 0n;
|
|
146
|
+
let gap = description.length < 64 ? 1 : Math.ceil(Math.log2(description.length));
|
|
147
|
+
for (let i = 0; i < description.length; i += gap) {
|
|
148
|
+
result = (((result * 33n) & bit) ^ BigInt(description.charCodeAt(i))) + BigInt(i);
|
|
149
|
+
}
|
|
150
|
+
result = (result ^ (result >> 32n)) * 0x9e3779b97f4a7c15n;
|
|
151
|
+
result = (((result ^ (result >> 32n)) << 4n) & bit) | mask;
|
|
152
|
+
primitive.set(value, result);
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
return 0n;
|
|
156
|
+
});
|
|
157
|
+
register("object", (value) => {
|
|
158
|
+
if (isObject(value)) {
|
|
159
|
+
if (complex.has(value)) {
|
|
160
|
+
return complex.get(value) || 0n;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
let mask = maskOf("object");
|
|
164
|
+
let bit = 0xffffffffffffffffn;
|
|
165
|
+
let result = 0n;
|
|
166
|
+
useTraverse(value, (key, value, path) => {
|
|
167
|
+
let keyHashHandler = handlers.get(typeOf(key));
|
|
168
|
+
let keyHash = keyHashHandler ? keyHashHandler(key) : 0n;
|
|
169
|
+
let valueHashHandler = handlers.get(typeOf(value));
|
|
170
|
+
let valueHash = valueHashHandler ? valueHashHandler(value) : 0n;
|
|
171
|
+
let pathHash = 0n;
|
|
172
|
+
if (complex.has(path)) {
|
|
173
|
+
pathHash = complex.get(path) || 0n;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
for (let p of path) {
|
|
177
|
+
let pathHashHandler = handlers.get(typeOf(p));
|
|
178
|
+
pathHash = (((pathHash << 5n) - pathHash) ^ (pathHashHandler ? pathHashHandler(p) : 0n)) & bit;
|
|
179
|
+
}
|
|
180
|
+
complex.set(path, pathHash);
|
|
181
|
+
}
|
|
182
|
+
result = (((result << 13n) | (result >> 51n)) ^ (keyHash * 0x243f6a8885a308d3n) ^ (valueHash * 0x517cc1b727220a95n) ^ (pathHash * 0x9e3779b97f4a7c15n)) & bit;
|
|
183
|
+
return true;
|
|
184
|
+
});
|
|
185
|
+
result = (result ^ (result >> 32n)) * 0x9e3779b97f4a7c15n;
|
|
186
|
+
result = (((result ^ (result >> 32n)) << 4n) & bit) | mask;
|
|
187
|
+
complex.set(value, result);
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
throw new Error("Uncaught error on hashing object.");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return 0n;
|
|
195
|
+
});
|
|
196
|
+
;
|
|
197
|
+
export let useHash = (...value) => {
|
|
198
|
+
let target = value.length === 1 ? value[0] : value;
|
|
199
|
+
let type = typeOf(target);
|
|
200
|
+
let handler = handlers.get(type);
|
|
201
|
+
if (handler) {
|
|
202
|
+
return handler(target);
|
|
203
|
+
}
|
|
204
|
+
return 0n;
|
|
205
|
+
};
|
package/dist/hook.d.ts
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type DeepPropertyKey, type DeepPropertyValue } from "./utility";
|
|
2
2
|
import type { Comparator, Generator } from "./utility";
|
|
3
3
|
export declare let useCompare: <T>(t1: T, t2: T) => number;
|
|
4
|
-
export declare let
|
|
5
|
-
export
|
|
4
|
+
export declare let Useandom: <T = number | bigint>(index: T) => T;
|
|
5
|
+
export type UseTraverseKey<T extends object> = DeepPropertyKey<T> & (symbol | string | number);
|
|
6
|
+
export type UseTraverseValue<T extends object> = DeepPropertyValue<T>;
|
|
7
|
+
export type UseTraversePath<T extends object> = Array<UseTraverseKey<T> & (symbol | string | number)>;
|
|
8
|
+
export interface UseTraverseCallback<T extends object> {
|
|
9
|
+
(key: UseTraverseKey<T>, value: UseTraverseValue<T>): boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface UseTraversePathCallback<T extends object> {
|
|
12
|
+
(key: UseTraverseKey<T>, value: UseTraverseValue<T>, path: UseTraversePath<T>): boolean;
|
|
13
|
+
}
|
|
14
|
+
interface UseTraverse {
|
|
15
|
+
<T extends object>(t: T, callback: UseTraverseCallback<T>): void;
|
|
16
|
+
<T extends object>(t: T, callback: UseTraversePathCallback<T>): void;
|
|
17
|
+
}
|
|
18
|
+
export declare let useTraverse: UseTraverse;
|
|
6
19
|
export declare let useGenerator: <E>(iterable: Iterable<E>) => Generator<E>;
|
|
7
20
|
interface UseArrange {
|
|
8
21
|
<E>(source: Iterable<E>): Generator<E>;
|
|
@@ -13,5 +26,4 @@ interface UseArrange {
|
|
|
13
26
|
export declare let useArrange: UseArrange;
|
|
14
27
|
export declare let useToNumber: <T = unknown>(target: T) => number;
|
|
15
28
|
export declare let useToBigInt: <T = unknown>(target: T) => bigint;
|
|
16
|
-
export declare let useFunction: <T extends ((...args: any[]) => any)>(target: T) => T;
|
|
17
29
|
export {};
|
package/dist/hook.js
CHANGED
|
@@ -16,7 +16,10 @@ export let useCompare = (t1, t2) => {
|
|
|
16
16
|
case "boolean":
|
|
17
17
|
return t1 === t2 ? 0 : (t1 ? 1 : -1);
|
|
18
18
|
case "symbol":
|
|
19
|
-
|
|
19
|
+
if (t1.description === t2.description) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
return (t1.description || "").localeCompare((t2.description) || "");
|
|
20
23
|
case "function":
|
|
21
24
|
throw new TypeError("Cannot compare functions.");
|
|
22
25
|
case "undefined":
|
|
@@ -41,7 +44,7 @@ export let useCompare = (t1, t2) => {
|
|
|
41
44
|
}
|
|
42
45
|
throw new TypeError("Cannot compare values of different types.");
|
|
43
46
|
};
|
|
44
|
-
export let
|
|
47
|
+
export let Useandom = (index) => {
|
|
45
48
|
if (isNumber(index)) {
|
|
46
49
|
let x = Number(index);
|
|
47
50
|
let phi = (1 + Math.sqrt(5)) / 2;
|
|
@@ -64,15 +67,20 @@ export let useRandom = (index) => {
|
|
|
64
67
|
}
|
|
65
68
|
throw new TypeError("Invalid input type");
|
|
66
69
|
};
|
|
70
|
+
;
|
|
71
|
+
;
|
|
72
|
+
;
|
|
67
73
|
export let useTraverse = (t, callback) => {
|
|
68
74
|
if (isObject(t)) {
|
|
69
75
|
let seen = new WeakSet();
|
|
76
|
+
let path = [];
|
|
70
77
|
let traverse = (target) => {
|
|
71
78
|
if (!seen.has(target)) {
|
|
72
79
|
seen.add(target);
|
|
73
80
|
let stop = false;
|
|
74
81
|
let properties = Reflect.ownKeys(target);
|
|
75
82
|
for (let property of properties) {
|
|
83
|
+
path.push(property);
|
|
76
84
|
let value = Reflect.get(target, property);
|
|
77
85
|
if (stop) {
|
|
78
86
|
break;
|
|
@@ -82,12 +90,13 @@ export let useTraverse = (t, callback) => {
|
|
|
82
90
|
if (isIterable(value)) {
|
|
83
91
|
let index = 0;
|
|
84
92
|
for (let item of value) {
|
|
93
|
+
path.push(index);
|
|
85
94
|
if (validate(item)) {
|
|
86
95
|
if (isObject(item)) {
|
|
87
96
|
traverse(item);
|
|
88
97
|
}
|
|
89
98
|
else {
|
|
90
|
-
if (!callback(index, item)) {
|
|
99
|
+
if (!callback(index, item, path)) {
|
|
91
100
|
stop = true;
|
|
92
101
|
break;
|
|
93
102
|
}
|
|
@@ -96,9 +105,12 @@ export let useTraverse = (t, callback) => {
|
|
|
96
105
|
index++;
|
|
97
106
|
}
|
|
98
107
|
}
|
|
108
|
+
else {
|
|
109
|
+
traverse(value);
|
|
110
|
+
}
|
|
99
111
|
}
|
|
100
112
|
else {
|
|
101
|
-
if (!callback(property, value)) {
|
|
113
|
+
if (!callback(property, value, path)) {
|
|
102
114
|
stop = true;
|
|
103
115
|
break;
|
|
104
116
|
}
|
|
@@ -172,7 +184,7 @@ export let useToNumber = (target) => {
|
|
|
172
184
|
case "boolean":
|
|
173
185
|
return target ? 1 : 0;
|
|
174
186
|
case "string":
|
|
175
|
-
let result = Number(target
|
|
187
|
+
let result = Number(target);
|
|
176
188
|
return isNumber(result) ? result : 0;
|
|
177
189
|
case "bigint":
|
|
178
190
|
return Number(target);
|
|
@@ -180,9 +192,6 @@ export let useToNumber = (target) => {
|
|
|
180
192
|
if (invalidate(target)) {
|
|
181
193
|
return 0;
|
|
182
194
|
}
|
|
183
|
-
if (target instanceof Date) {
|
|
184
|
-
return target.getTime();
|
|
185
|
-
}
|
|
186
195
|
if (Reflect.has(target, Symbol.toPrimitive)) {
|
|
187
196
|
let resolved = Reflect.apply(Reflect.get(target, Symbol.toPrimitive), target, ["default"]);
|
|
188
197
|
return isNumber(resolved) ? resolved : 0;
|
|
@@ -200,7 +209,7 @@ export let useToBigInt = (target) => {
|
|
|
200
209
|
return target ? 1n : 0n;
|
|
201
210
|
case "string":
|
|
202
211
|
let regex = /^[-+]?\d+$/;
|
|
203
|
-
return regex.test(target) ? BigInt(target
|
|
212
|
+
return regex.test(target) ? BigInt(target) : 0n;
|
|
204
213
|
case "bigint":
|
|
205
214
|
return target;
|
|
206
215
|
case "object":
|
|
@@ -209,15 +218,10 @@ export let useToBigInt = (target) => {
|
|
|
209
218
|
}
|
|
210
219
|
if (Reflect.has(target, Symbol.toPrimitive)) {
|
|
211
220
|
let resolved = Reflect.apply(Reflect.get(target, Symbol.toPrimitive), target, ["default"]);
|
|
212
|
-
return isBigInt(resolved) ? resolved :
|
|
221
|
+
return isBigInt(resolved) ? resolved : 0n;
|
|
213
222
|
}
|
|
214
223
|
return 0n;
|
|
215
224
|
default:
|
|
216
225
|
return 0n;
|
|
217
226
|
}
|
|
218
227
|
};
|
|
219
|
-
export let useFunction = (target) => {
|
|
220
|
-
return Object.freeze((...args) => {
|
|
221
|
-
return target(...args);
|
|
222
|
-
});
|
|
223
|
-
};
|
package/dist/index.d.ts
CHANGED