@oscarpalmer/atoms 0.202.0 → 0.203.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/difference.d.mts +4 -5
- package/dist/array/exists.d.mts +5 -6
- package/dist/array/filter.d.mts +10 -11
- package/dist/array/find.d.mts +10 -11
- package/dist/array/first.d.mts +10 -11
- package/dist/array/flatten.d.mts +2 -3
- package/dist/array/from.d.mts +7 -8
- package/dist/array/group-by.d.mts +7 -8
- package/dist/array/insert.d.mts +3 -4
- package/dist/array/intersection.d.mts +4 -5
- package/dist/array/last.d.mts +10 -11
- package/dist/array/move.d.mts +9 -10
- package/dist/array/partition.d.mts +5 -6
- package/dist/array/push.d.mts +2 -3
- package/dist/array/reverse.d.mts +2 -3
- package/dist/array/select.d.mts +11 -12
- package/dist/array/single.d.mts +4 -5
- package/dist/array/slice.d.mts +12 -13
- package/dist/array/sort.d.mts +31 -32
- package/dist/array/sort.mjs +41 -33
- package/dist/array/splice.d.mts +5 -6
- package/dist/array/swap.d.mts +8 -9
- package/dist/array/to-map.d.mts +7 -8
- package/dist/array/to-record.d.mts +7 -8
- package/dist/array/to-set.d.mts +4 -5
- package/dist/array/toggle.d.mts +4 -5
- package/dist/array/union.d.mts +4 -5
- package/dist/array/unique.d.mts +4 -5
- package/dist/array/update.d.mts +4 -5
- package/dist/beacon.d.mts +8 -9
- package/dist/beacon.mjs +90 -65
- package/dist/color/constants.d.mts +14 -13
- package/dist/color/constants.mjs +9 -2
- package/dist/color/index.d.mts +2 -2
- package/dist/color/instance.d.mts +3 -3
- package/dist/color/instance.mjs +125 -61
- package/dist/color/misc/alpha.d.mts +4 -5
- package/dist/color/misc/format.d.mts +6 -7
- package/dist/color/misc/format.mjs +15 -12
- package/dist/color/misc/get.d.mts +14 -15
- package/dist/color/misc/is.d.mts +16 -17
- package/dist/color/misc/is.mjs +3 -4
- package/dist/color/misc/state.d.mts +8 -10
- package/dist/color/misc/state.mjs +22 -20
- package/dist/color/models.d.mts +25 -19
- package/dist/color/space/hex.d.mts +9 -10
- package/dist/color/space/hsl.d.mts +8 -9
- package/dist/color/space/hwb.d.mts +9 -10
- package/dist/color/space/rgb.d.mts +11 -12
- package/dist/function/limit.d.mts +9 -8
- package/dist/function/limit.mjs +5 -5
- package/dist/function/once.d.mts +26 -6
- package/dist/function/once.mjs +135 -76
- package/dist/function/retry.d.mts +5 -6
- package/dist/function/retry.mjs +3 -3
- package/dist/index.d.mts +182 -58
- package/dist/index.mjs +1191 -810
- package/dist/internal/abort.d.mts +3 -4
- package/dist/internal/array/callbacks.d.mts +4 -5
- package/dist/internal/array/chunk.d.mts +2 -3
- package/dist/internal/array/compact.d.mts +3 -4
- package/dist/internal/array/find.d.mts +10 -11
- package/dist/internal/array/get.d.mts +7 -8
- package/dist/internal/array/group.d.mts +2 -3
- package/dist/internal/array/index-of.d.mts +10 -11
- package/dist/internal/array/insert.d.mts +5 -6
- package/dist/internal/array/match.d.mts +17 -18
- package/dist/internal/array/overlap.d.mts +2 -3
- package/dist/internal/array/sets.d.mts +5 -6
- package/dist/internal/array/shuffle.d.mts +2 -3
- package/dist/internal/array/update.d.mts +2 -3
- package/dist/internal/defaults.d.mts +3 -4
- package/dist/internal/function/assert.d.mts +10 -11
- package/dist/internal/function/limit.d.mts +41 -0
- package/dist/internal/function/limit.mjs +110 -0
- package/dist/internal/function/memoize.d.mts +4 -5
- package/dist/internal/function/memoize.mjs +53 -31
- package/dist/internal/function/misc.d.mts +2 -3
- package/dist/internal/function/work.d.mts +53 -54
- package/dist/internal/herald.d.mts +8 -9
- package/dist/internal/herald.mjs +38 -26
- package/dist/internal/is.d.mts +19 -20
- package/dist/internal/math/aggregate.d.mts +14 -15
- package/dist/internal/math/misc.d.mts +3 -4
- package/dist/internal/number.d.mts +4 -5
- package/dist/internal/random.d.mts +3 -4
- package/dist/internal/result/misc.d.mts +29 -14
- package/dist/internal/result/misc.mjs +4 -0
- package/dist/internal/result/models.d.mts +9 -10
- package/dist/internal/sized/map.d.mts +2 -3
- package/dist/internal/sized/misc.d.mts +2 -3
- package/dist/internal/string/case.d.mts +9 -10
- package/dist/internal/string/misc.d.mts +8 -9
- package/dist/internal/subscription.d.mts +10 -11
- package/dist/internal/subscription.mjs +69 -57
- package/dist/internal/value/compare.d.mts +17 -9
- package/dist/internal/value/compare.mjs +7 -7
- package/dist/internal/value/equal.d.mts +34 -15
- package/dist/internal/value/equal.mjs +28 -13
- package/dist/internal/value/get.d.mts +3 -4
- package/dist/internal/value/handlers.d.mts +19 -9
- package/dist/internal/value/handlers.mjs +50 -50
- package/dist/internal/value/has.d.mts +6 -7
- package/dist/internal/value/misc.d.mts +6 -7
- package/dist/internal/value/partial.d.mts +3 -4
- package/dist/internal/value/set.d.mts +4 -5
- package/dist/is.d.mts +13 -13
- package/dist/logger.d.mts +5 -4
- package/dist/logger.mjs +61 -54
- package/dist/math.d.mts +20 -20
- package/dist/models.d.mts +45 -49
- package/dist/promise/constants.d.mts +14 -15
- package/dist/promise/delay.d.mts +3 -4
- package/dist/promise/delay.mjs +4 -4
- package/dist/promise/helpers.d.mts +7 -8
- package/dist/promise/index.d.mts +13 -14
- package/dist/promise/misc.d.mts +6 -6
- package/dist/promise/models.d.mts +16 -17
- package/dist/promise/timed.d.mts +4 -5
- package/dist/promise/timed.mjs +5 -5
- package/dist/query.d.mts +3 -4
- package/dist/queue.d.mts +14 -15
- package/dist/queue.mjs +185 -129
- package/dist/random.d.mts +8 -8
- package/dist/result/index.d.mts +8 -9
- package/dist/result/match.d.mts +6 -7
- package/dist/result/misc.d.mts +3 -3
- package/dist/result/work/flow.d.mts +28 -29
- package/dist/result/work/pipe.d.mts +24 -25
- package/dist/sized/set.d.mts +2 -3
- package/dist/string/fuzzy.d.mts +21 -12
- package/dist/string/fuzzy.mjs +77 -49
- package/dist/string/index.d.mts +8 -8
- package/dist/string/match.d.mts +4 -5
- package/dist/string/normalize.d.mts +8 -9
- package/dist/string/normalize.mjs +9 -4
- package/dist/string/template.d.mts +9 -9
- package/dist/string/template.mjs +11 -4
- package/dist/value/clone.d.mts +21 -13
- package/dist/value/clone.mjs +22 -20
- package/dist/value/collection.d.mts +4 -5
- package/dist/value/diff.d.mts +5 -6
- package/dist/value/freeze.d.mts +18 -19
- package/dist/value/freeze.mjs +1 -1
- package/dist/value/merge.d.mts +13 -14
- package/dist/value/merge.mjs +21 -5
- package/dist/value/omit.d.mts +2 -3
- package/dist/value/pick.d.mts +2 -3
- package/dist/value/shake.d.mts +3 -4
- package/dist/value/smush.d.mts +3 -4
- package/dist/value/transform.d.mts +15 -10
- package/dist/value/transform.mjs +12 -7
- package/dist/value/unsmush.d.mts +3 -4
- package/package.json +1 -1
- package/dist/internal/function/timer.d.mts +0 -10
- package/dist/internal/function/timer.mjs +0 -87
|
@@ -5,55 +5,54 @@
|
|
|
5
5
|
* @param value String to convert
|
|
6
6
|
* @returns Camel-cased string
|
|
7
7
|
*/
|
|
8
|
-
declare function camelCase(value: string): string;
|
|
8
|
+
export declare function camelCase(value: string): string;
|
|
9
9
|
/**
|
|
10
10
|
* Capitalize the first letter of a string _(and lowercase the rest)_
|
|
11
11
|
*
|
|
12
12
|
* @param value String to capitalize
|
|
13
13
|
* @returns Capitalized string
|
|
14
14
|
*/
|
|
15
|
-
declare function capitalize(value: string): string;
|
|
15
|
+
export declare function capitalize(value: string): string;
|
|
16
16
|
/**
|
|
17
17
|
* Convert a string to kebab case _(this-is-kebab-case)_
|
|
18
18
|
*
|
|
19
19
|
* @param value String to convert
|
|
20
20
|
* @returns Kebab-cased string
|
|
21
21
|
*/
|
|
22
|
-
declare function kebabCase(value: string): string;
|
|
22
|
+
export declare function kebabCase(value: string): string;
|
|
23
23
|
/**
|
|
24
24
|
* Convert a string to lower case
|
|
25
25
|
*
|
|
26
26
|
* @param value String to convert
|
|
27
27
|
* @returns Lower-cased string
|
|
28
28
|
*/
|
|
29
|
-
declare function lowerCase(value: string): string;
|
|
29
|
+
export declare function lowerCase(value: string): string;
|
|
30
30
|
/**
|
|
31
31
|
* Convert a string to pascal case _(ThisIsPascalCase)_
|
|
32
32
|
*
|
|
33
33
|
* @param value String to convert
|
|
34
34
|
* @returns Pascal-cased string
|
|
35
35
|
*/
|
|
36
|
-
declare function pascalCase(value: string): string;
|
|
36
|
+
export declare function pascalCase(value: string): string;
|
|
37
37
|
/**
|
|
38
38
|
* Convert a string to snake case _(this_is_snake_case)_
|
|
39
39
|
*
|
|
40
40
|
* @param value String to convert
|
|
41
41
|
* @returns Snake-cased string
|
|
42
42
|
*/
|
|
43
|
-
declare function snakeCase(value: string): string;
|
|
43
|
+
export declare function snakeCase(value: string): string;
|
|
44
44
|
/**
|
|
45
45
|
* Convert a string to title case _(Capitalizing Every Word)_
|
|
46
46
|
*
|
|
47
47
|
* @param value String to convert
|
|
48
48
|
* @returns Title-cased string
|
|
49
49
|
*/
|
|
50
|
-
declare function titleCase(value: string): string;
|
|
50
|
+
export declare function titleCase(value: string): string;
|
|
51
51
|
/**
|
|
52
52
|
* Convert a string to upper case
|
|
53
53
|
*
|
|
54
54
|
* @param value String to convert
|
|
55
55
|
* @returns Upper-cased string
|
|
56
56
|
*/
|
|
57
|
-
declare function upperCase(value: string): string;
|
|
58
|
-
//#endregion
|
|
59
|
-
export { camelCase, capitalize, kebabCase, lowerCase, pascalCase, snakeCase, titleCase, upperCase };
|
|
57
|
+
export declare function upperCase(value: string): string;
|
|
58
|
+
//#endregion
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* getString(() => 123) // => '123'
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
declare function getString(value: unknown): string;
|
|
20
|
-
declare function ignoreKey(key: string): boolean;
|
|
21
|
-
declare function interpolate(strings: TemplateStringsArray, values: unknown[]): string;
|
|
19
|
+
export declare function getString(value: unknown): string;
|
|
20
|
+
export declare function ignoreKey(key: string): boolean;
|
|
21
|
+
export declare function interpolate(strings: TemplateStringsArray, values: unknown[]): string;
|
|
22
22
|
/**
|
|
23
23
|
* Join an array of values into a string _(while ignoring empty values)_
|
|
24
24
|
*
|
|
@@ -28,15 +28,14 @@ declare function interpolate(strings: TemplateStringsArray, values: unknown[]):
|
|
|
28
28
|
* @param delimiter Delimiter to use between values
|
|
29
29
|
* @returns Joined string
|
|
30
30
|
*/
|
|
31
|
-
declare function join(array: unknown[], delimiter?: string): string;
|
|
32
|
-
declare function tryDecode(value: string): string;
|
|
33
|
-
declare function tryEncode(value: boolean | number | string): unknown;
|
|
31
|
+
export declare function join(array: unknown[], delimiter?: string): string;
|
|
32
|
+
export declare function tryDecode(value: string): string;
|
|
33
|
+
export declare function tryEncode(value: boolean | number | string): unknown;
|
|
34
34
|
/**
|
|
35
35
|
* Split a string into words _(and other readable parts)_
|
|
36
36
|
*
|
|
37
37
|
* @param value Original string
|
|
38
38
|
* @returns Array of words found in the string
|
|
39
39
|
*/
|
|
40
|
-
declare function words(value: string): string[];
|
|
41
|
-
//#endregion
|
|
42
|
-
export { getString, ignoreKey, interpolate, join, tryDecode, tryEncode, words };
|
|
40
|
+
export declare function words(value: string): string[];
|
|
41
|
+
//#endregion
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Key } from "../models.mjs";
|
|
2
2
|
//#region src/internal/subscription.d.ts
|
|
3
|
-
|
|
3
|
+
export declare const SUBSCRIPTION_NAME = "subscription";
|
|
4
|
+
export type Subscription = {
|
|
4
5
|
/**
|
|
5
6
|
* Is the subscription active?
|
|
6
7
|
*/
|
|
@@ -13,7 +14,7 @@ type Subscription = {
|
|
|
13
14
|
/**
|
|
14
15
|
* Parameters for creating a subscription
|
|
15
16
|
*/
|
|
16
|
-
type SubscriptionParameters = {
|
|
17
|
+
export type SubscriptionParameters = {
|
|
17
18
|
/**
|
|
18
19
|
* Is the owner of the subscription alive? _(defaults to `true`)_
|
|
19
20
|
*/
|
|
@@ -34,7 +35,7 @@ type SubscriptionParameters = {
|
|
|
34
35
|
/**
|
|
35
36
|
* Property information for subscription identification
|
|
36
37
|
*/
|
|
37
|
-
type SubscriptionProperty = {
|
|
38
|
+
export type SubscriptionProperty = {
|
|
38
39
|
/**
|
|
39
40
|
* Name of the property used to identify a subscription
|
|
40
41
|
*/
|
|
@@ -44,7 +45,7 @@ type SubscriptionProperty = {
|
|
|
44
45
|
*/
|
|
45
46
|
value: unknown;
|
|
46
47
|
};
|
|
47
|
-
type Subscriptions<Value = unknown> = {
|
|
48
|
+
export type Subscriptions<Value = unknown> = {
|
|
48
49
|
/**
|
|
49
50
|
* Items of the subscriptions store
|
|
50
51
|
*
|
|
@@ -76,7 +77,7 @@ type Subscriptions<Value = unknown> = {
|
|
|
76
77
|
/**
|
|
77
78
|
* Parameters for creating a subscription store
|
|
78
79
|
*/
|
|
79
|
-
type SubscriptionsParameters = {
|
|
80
|
+
export type SubscriptionsParameters = {
|
|
80
81
|
/**
|
|
81
82
|
* Allow any or specific keys for subscriptions? _(defaults to `false`, which prevents keyed subscriptions)_
|
|
82
83
|
*/
|
|
@@ -104,21 +105,19 @@ type SubscriptionsValuesItem<MapKey, MapValue> = {
|
|
|
104
105
|
* @param value Value to check
|
|
105
106
|
* @returns `true` if the value is a subscription, otherwise `false`
|
|
106
107
|
*/
|
|
107
|
-
declare function isSubscription(value: unknown): value is Subscription;
|
|
108
|
+
export declare function isSubscription(value: unknown): value is Subscription;
|
|
108
109
|
/**
|
|
109
110
|
* Is the value a subscriptions store?
|
|
110
111
|
*
|
|
111
112
|
* @param value Value to check
|
|
112
113
|
* @returns `true` if the value is a subscriptions store, otherwise `false`
|
|
113
114
|
*/
|
|
114
|
-
declare function isSubscriptions(value: unknown): value is Subscriptions;
|
|
115
|
+
export declare function isSubscriptions(value: unknown): value is Subscriptions;
|
|
115
116
|
/**
|
|
116
117
|
* Create a subscription store
|
|
117
118
|
*
|
|
118
119
|
* @param parameters Store parameters
|
|
119
120
|
* @returns Subscription store
|
|
120
121
|
*/
|
|
121
|
-
declare function subscriptions<Value = unknown>(parameters?: SubscriptionsParameters): Subscriptions<Value>;
|
|
122
|
-
|
|
123
|
-
//#endregion
|
|
124
|
-
export { SUBSCRIPTION_NAME, Subscription, SubscriptionParameters, SubscriptionProperty, Subscriptions, SubscriptionsParameters, isSubscription, isSubscriptions, subscriptions };
|
|
122
|
+
export declare function subscriptions<Value = unknown>(parameters?: SubscriptionsParameters): Subscriptions<Value>;
|
|
123
|
+
//#endregion
|
|
@@ -1,13 +1,54 @@
|
|
|
1
1
|
import { isKey, isPlainObject } from "./is.mjs";
|
|
2
2
|
import { createAborter } from "./abort.mjs";
|
|
3
3
|
//#region src/internal/subscription.ts
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const SUBSCRIPTION_NAME = "subscription";
|
|
5
|
+
const SUBSCRIPTION_PROPERTY = "$subscription";
|
|
6
|
+
const SUBSCRIPTION_STORE = "subscriptions";
|
|
7
|
+
function Subscription(state, property, parameters) {
|
|
8
|
+
Object.defineProperty(this, SUBSCRIPTION_SYMBOL, { value: state });
|
|
9
|
+
state.aborter = createAborter(parameters.signal, () => this.unsubscribe(subscriptions, this, state));
|
|
10
|
+
Object.defineProperties(this, {
|
|
11
|
+
[property.key]: { value: property.value },
|
|
12
|
+
active: {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: () => (state.parameters?.isActive?.() ?? true) && state.active
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
addSubscription(this);
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperties(Subscription.prototype, {
|
|
20
|
+
[SUBSCRIPTION_PROPERTY]: { value: SUBSCRIPTION_NAME },
|
|
21
|
+
unsubscribe: { value: removeSubscription }
|
|
22
|
+
});
|
|
23
|
+
function Subscriptions(parameters) {
|
|
24
|
+
const { keys, property } = createSubscriptionsParameters(parameters);
|
|
25
|
+
Object.defineProperty(this, SUBSCRIPTION_SYMBOL, { value: createSubscriptionsState(property, keys) });
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperties(Subscriptions.prototype, {
|
|
28
|
+
[SUBSCRIPTION_PROPERTY]: { value: SUBSCRIPTION_STORE },
|
|
29
|
+
clear: { value: clearSubscriptions },
|
|
30
|
+
create: { value: createSubscription },
|
|
31
|
+
items: {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get() {
|
|
34
|
+
return this[SUBSCRIPTION_SYMBOL].items;
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
values: {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
get() {
|
|
40
|
+
return this[SUBSCRIPTION_SYMBOL].values;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
function addSubscription(instance) {
|
|
45
|
+
const state = instance[SUBSCRIPTION_SYMBOL];
|
|
6
46
|
const { key, value } = state.parameters;
|
|
47
|
+
const { items, values } = state.subscriptions;
|
|
7
48
|
if (!isKey(key)) {
|
|
8
|
-
items.any.add(
|
|
9
|
-
values.from.any.set(value,
|
|
10
|
-
values.to.any.set(
|
|
49
|
+
items.any.add(instance);
|
|
50
|
+
values.from.any.set(value, instance);
|
|
51
|
+
values.to.any.set(instance, value);
|
|
11
52
|
return;
|
|
12
53
|
}
|
|
13
54
|
/* istanbul ignore if */
|
|
@@ -19,29 +60,32 @@ function addSubscription(subscriptions, subscription, state) {
|
|
|
19
60
|
keyedItems = /* @__PURE__ */ new Set();
|
|
20
61
|
items.keyed.set(key, keyedItems);
|
|
21
62
|
}
|
|
22
|
-
keyedItems.add(
|
|
63
|
+
keyedItems.add(instance);
|
|
23
64
|
let keyedFrom = values.from.keyed.get(key);
|
|
24
65
|
if (keyedFrom == null) {
|
|
25
66
|
keyedFrom = /* @__PURE__ */ new Map();
|
|
26
67
|
values.from.keyed.set(key, keyedFrom);
|
|
27
68
|
}
|
|
28
|
-
keyedFrom.set(value,
|
|
69
|
+
keyedFrom.set(value, instance);
|
|
29
70
|
let keyedTo = values.to.keyed.get(key);
|
|
30
71
|
if (keyedTo == null) {
|
|
31
72
|
keyedTo = /* @__PURE__ */ new Map();
|
|
32
73
|
values.to.keyed.set(key, keyedTo);
|
|
33
74
|
}
|
|
34
|
-
keyedTo.set(
|
|
75
|
+
keyedTo.set(instance, value);
|
|
35
76
|
}
|
|
36
|
-
function clearSubscriptions(
|
|
37
|
-
|
|
38
|
-
|
|
77
|
+
function clearSubscriptions() {
|
|
78
|
+
const state = this[SUBSCRIPTION_SYMBOL];
|
|
79
|
+
for (const susbcription of state.values.to.any.keys()) susbcription.unsubscribe();
|
|
80
|
+
if (state.values.to.keyed != null && state.values.to.keyed.size > 0) for (const values of state.values.to.keyed.values()) for (const susbcription of values.keys()) susbcription.unsubscribe();
|
|
39
81
|
}
|
|
40
|
-
function createSubscription(
|
|
82
|
+
function createSubscription(params) {
|
|
41
83
|
const parameters = createSubscriptionParameters(params);
|
|
42
84
|
if (parameters.signal?.aborted ?? false) throw new Error(parameters.signal?.reason);
|
|
85
|
+
const subscriptions = this[SUBSCRIPTION_SYMBOL];
|
|
43
86
|
const state = {
|
|
44
87
|
parameters,
|
|
88
|
+
subscriptions,
|
|
45
89
|
active: true
|
|
46
90
|
};
|
|
47
91
|
const existing = getExistingSubscription(subscriptions, state);
|
|
@@ -50,18 +94,7 @@ function createSubscription(subscriptions, property, params) {
|
|
|
50
94
|
if (subscriptions.keys === false) throw new Error(SUBSCRIPTION_DISALLOWED_KEY);
|
|
51
95
|
else if (subscriptions.keys !== true && !subscriptions.keys.has(parameters.key)) throw new Error(SUBSCRIPTION_INVALID_KEY);
|
|
52
96
|
}
|
|
53
|
-
|
|
54
|
-
const instance = { unsubscribe: () => unsubscribe(subscriptions, instance, state) };
|
|
55
|
-
Object.defineProperties(instance, {
|
|
56
|
-
[SUBSCRIPTION_PROPERTY]: { value: SUBSCRIPTION_NAME },
|
|
57
|
-
[property.key]: { value: property.value },
|
|
58
|
-
active: {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
get: () => (parameters.isActive?.() ?? true) && state.active
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
addSubscription(subscriptions, instance, state);
|
|
64
|
-
return [Object.freeze(instance), false];
|
|
97
|
+
return [new Subscription(state, subscriptions.property, parameters), false];
|
|
65
98
|
}
|
|
66
99
|
function getExistingSubscription(subscriptions, state) {
|
|
67
100
|
const { values } = subscriptions;
|
|
@@ -95,9 +128,10 @@ function createSubscriptionsProperty(input) {
|
|
|
95
128
|
value: values.value == null ? SUBSCRIPTION_NAME : values.value
|
|
96
129
|
};
|
|
97
130
|
}
|
|
98
|
-
function createSubscriptionsState(keys) {
|
|
131
|
+
function createSubscriptionsState(property, keys) {
|
|
99
132
|
return {
|
|
100
133
|
keys,
|
|
134
|
+
property,
|
|
101
135
|
items: {
|
|
102
136
|
any: /* @__PURE__ */ new Set(),
|
|
103
137
|
keyed: keys === false ? void 0 : /* @__PURE__ */ new Map()
|
|
@@ -124,7 +158,7 @@ function isSubscription(value) {
|
|
|
124
158
|
return isSubscriptionInstance(value, SUBSCRIPTION_NAME);
|
|
125
159
|
}
|
|
126
160
|
function isSubscriptionInstance(value, name) {
|
|
127
|
-
return
|
|
161
|
+
return typeof value === "object" && value !== null && SUBSCRIPTION_PROPERTY in value && value[SUBSCRIPTION_PROPERTY] === name;
|
|
128
162
|
}
|
|
129
163
|
/**
|
|
130
164
|
* Is the value a subscriptions store?
|
|
@@ -145,16 +179,17 @@ function removeFromStore(items, values, subscription, value, key) {
|
|
|
145
179
|
values.to.keyed?.get(key)?.delete(subscription);
|
|
146
180
|
}
|
|
147
181
|
}
|
|
148
|
-
function removeSubscription(
|
|
182
|
+
function removeSubscription() {
|
|
183
|
+
const state = this[SUBSCRIPTION_SYMBOL];
|
|
149
184
|
if (!state.active) return;
|
|
150
185
|
state.aborter = void 0;
|
|
151
186
|
state.active = false;
|
|
152
|
-
|
|
153
|
-
state.parameters.signal = void 0;
|
|
154
|
-
const { items, values } = subscriptionsState;
|
|
187
|
+
const { items, values } = state.subscriptions;
|
|
155
188
|
const { key, value } = state.parameters;
|
|
189
|
+
state.parameters = void 0;
|
|
190
|
+
state.subscriptions = void 0;
|
|
156
191
|
if (!isKey(key)) {
|
|
157
|
-
removeFromStore(items.any, values,
|
|
192
|
+
removeFromStore(items.any, values, this, value);
|
|
158
193
|
return;
|
|
159
194
|
}
|
|
160
195
|
const keyed = items.keyed?.get(key);
|
|
@@ -162,7 +197,7 @@ function removeSubscription(subscriptionsState, subscription, state) {
|
|
|
162
197
|
if (items.keyed == null || keyed == null)
|
|
163
198
|
// istanbul ignore next
|
|
164
199
|
return;
|
|
165
|
-
removeFromStore(keyed, values,
|
|
200
|
+
removeFromStore(keyed, values, this, value, key);
|
|
166
201
|
if (keyed.size === 0) items.keyed.delete(key);
|
|
167
202
|
}
|
|
168
203
|
/**
|
|
@@ -172,34 +207,11 @@ function removeSubscription(subscriptionsState, subscription, state) {
|
|
|
172
207
|
* @returns Subscription store
|
|
173
208
|
*/
|
|
174
209
|
function subscriptions(parameters) {
|
|
175
|
-
|
|
176
|
-
const state = createSubscriptionsState(keys);
|
|
177
|
-
const instance = {
|
|
178
|
-
clear: () => clearSubscriptions(state),
|
|
179
|
-
create: (parameters) => createSubscription(state, property, parameters)
|
|
180
|
-
};
|
|
181
|
-
Object.defineProperties(instance, {
|
|
182
|
-
[SUBSCRIPTION_PROPERTY]: { value: SUBSCRIPTION_STORE },
|
|
183
|
-
items: {
|
|
184
|
-
enumerable: true,
|
|
185
|
-
value: state.items
|
|
186
|
-
},
|
|
187
|
-
values: {
|
|
188
|
-
enumerable: true,
|
|
189
|
-
value: state.values
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
return Object.freeze(instance);
|
|
193
|
-
}
|
|
194
|
-
function unsubscribe(subscriptionsState, subscription, state) {
|
|
195
|
-
state.aborter?.cancel();
|
|
196
|
-
removeSubscription(subscriptionsState, subscription, state);
|
|
210
|
+
return new Subscriptions(parameters);
|
|
197
211
|
}
|
|
198
212
|
const SUBSCRIPTION_DISALLOWED_KEY = "Disallowed key for subscription";
|
|
199
213
|
const SUBSCRIPTION_INVALID_KEY = "Invalid key for subscription";
|
|
200
214
|
const SUBSCRIPTION_INVALID_VALUE = "A subscription requires a non-null value to identify it";
|
|
201
|
-
const
|
|
202
|
-
const SUBSCRIPTION_PROPERTY = "$subscriptions";
|
|
203
|
-
const SUBSCRIPTION_STORE = "subscriptions";
|
|
215
|
+
const SUBSCRIPTION_SYMBOL = Symbol(SUBSCRIPTION_PROPERTY);
|
|
204
216
|
//#endregion
|
|
205
217
|
export { SUBSCRIPTION_NAME, isSubscription, isSubscriptions, subscriptions };
|
|
@@ -8,13 +8,22 @@ type Comparator<Value = any> = (first: Value, second: Value) => number;
|
|
|
8
8
|
* @param second Second value
|
|
9
9
|
* @returns `0` if equal; `-1` first comes before second; `1` first comes after second
|
|
10
10
|
*/
|
|
11
|
-
declare function compare(first: unknown, second: unknown): number;
|
|
12
|
-
declare namespace compare {
|
|
11
|
+
export declare function compare(first: unknown, second: unknown): number;
|
|
12
|
+
export declare namespace compare {
|
|
13
13
|
var deregister: typeof deregisterComparator;
|
|
14
|
-
var
|
|
15
|
-
|
|
14
|
+
var handler: {
|
|
15
|
+
base: {
|
|
16
|
+
handlers: WeakMap<Constructor, string | GenericCallback>;
|
|
17
|
+
options: {
|
|
18
|
+
callback: GenericCallback;
|
|
19
|
+
method?: string;
|
|
20
|
+
};
|
|
21
|
+
owner: GenericCallback;
|
|
22
|
+
deregister: (constructor: Constructor) => void;
|
|
23
|
+
get: (first: unknown, second: unknown) => string | GenericCallback | undefined;
|
|
24
|
+
register: (constructor: Constructor, handler?: string | GenericCallback) => void;
|
|
25
|
+
};
|
|
16
26
|
handle(first: unknown, second: unknown, ...parameters: unknown[]): number;
|
|
17
|
-
register(constructor: Constructor, handler?: string | GenericCallback): void;
|
|
18
27
|
};
|
|
19
28
|
var register: typeof registerComparator;
|
|
20
29
|
}
|
|
@@ -25,7 +34,7 @@ declare namespace compare {
|
|
|
25
34
|
*
|
|
26
35
|
* @param constructor Class constructor
|
|
27
36
|
*/
|
|
28
|
-
declare function deregisterComparator<Instance>(constructor: Constructor<Instance>): void;
|
|
37
|
+
export declare function deregisterComparator<Instance>(constructor: Constructor<Instance>): void;
|
|
29
38
|
/**
|
|
30
39
|
* Register a custom comparison handler for a class
|
|
31
40
|
*
|
|
@@ -34,6 +43,5 @@ declare function deregisterComparator<Instance>(constructor: Constructor<Instanc
|
|
|
34
43
|
* @param constructor Class constructor
|
|
35
44
|
* @param handler Method name or comparison function _(defaults to `compare`)_
|
|
36
45
|
*/
|
|
37
|
-
declare function registerComparator<Instance>(constructor: Constructor<Instance>, handler?: string | Comparator<Instance>): void;
|
|
38
|
-
//#endregion
|
|
39
|
-
export { compare, deregisterComparator, registerComparator };
|
|
46
|
+
export declare function registerComparator<Instance>(constructor: Constructor<Instance>, handler?: string | Comparator<Instance>): void;
|
|
47
|
+
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { max } from "../math/aggregate.mjs";
|
|
2
2
|
import { getString, words } from "../string/misc.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { createCompareHandler } from "./handlers.mjs";
|
|
4
4
|
//#region src/internal/value/compare.ts
|
|
5
5
|
const COMPARE_NAME = "compare";
|
|
6
6
|
/**
|
|
@@ -45,7 +45,7 @@ function compareValue(first, second, compareStrings) {
|
|
|
45
45
|
const firstType = typeof first;
|
|
46
46
|
if (firstType === typeof second && firstType in comparators) return comparators[firstType](first, second);
|
|
47
47
|
if (first instanceof Date && second instanceof Date) return compareNumbers(first.getTime(), second.getTime());
|
|
48
|
-
return compare.
|
|
48
|
+
return compare.handler.handle(first, second, compareStrings);
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Deregister a custom comparison handler for a class
|
|
@@ -55,7 +55,7 @@ function compareValue(first, second, compareStrings) {
|
|
|
55
55
|
* @param constructor Class constructor
|
|
56
56
|
*/
|
|
57
57
|
function deregisterComparator(constructor) {
|
|
58
|
-
compare.
|
|
58
|
+
compare.handler.base.deregister(constructor);
|
|
59
59
|
}
|
|
60
60
|
function getComparisonParts(value) {
|
|
61
61
|
if (Array.isArray(value)) return value;
|
|
@@ -70,7 +70,7 @@ function getComparisonParts(value) {
|
|
|
70
70
|
* @param handler Method name or comparison function _(defaults to `compare`)_
|
|
71
71
|
*/
|
|
72
72
|
function registerComparator(constructor, handler) {
|
|
73
|
-
compare.
|
|
73
|
+
compare.handler.base.register(constructor, handler);
|
|
74
74
|
}
|
|
75
75
|
const comparators = {
|
|
76
76
|
bigint: compareNumbers,
|
|
@@ -78,16 +78,16 @@ const comparators = {
|
|
|
78
78
|
number: compareNumbers,
|
|
79
79
|
symbol: compareSymbols
|
|
80
80
|
};
|
|
81
|
-
const
|
|
81
|
+
const compareHandler = createCompareHandler(compare, {
|
|
82
82
|
callback: (first, second, compareStrings) => compareStrings ? getString(first).localeCompare(getString(second)) : void 0,
|
|
83
83
|
method: COMPARE_NAME
|
|
84
84
|
});
|
|
85
85
|
compare.deregister = deregisterComparator;
|
|
86
|
-
compare.
|
|
86
|
+
compare.handler = compareHandler;
|
|
87
87
|
compare.register = registerComparator;
|
|
88
88
|
Object.defineProperties(compare, {
|
|
89
89
|
deregister: { value: deregisterComparator },
|
|
90
|
-
|
|
90
|
+
handler: { value: compareHandler },
|
|
91
91
|
register: { value: registerComparator }
|
|
92
92
|
});
|
|
93
93
|
//#endregion
|
|
@@ -3,7 +3,7 @@ import { Constructor, GenericCallback } from "../../models.mjs";
|
|
|
3
3
|
/**
|
|
4
4
|
* Options for value equality comparison
|
|
5
5
|
*/
|
|
6
|
-
type EqualOptions = {
|
|
6
|
+
export type EqualOptions = {
|
|
7
7
|
/**
|
|
8
8
|
* When `true`, strings are compared case-insensitively
|
|
9
9
|
*/
|
|
@@ -31,7 +31,7 @@ type Equalizer = {
|
|
|
31
31
|
* @param ignoreCase If `true`, comparison will be case-insensitive
|
|
32
32
|
* @returns `true` if the strings are equal, otherwise `false`
|
|
33
33
|
*/
|
|
34
|
-
(first: string, second: string, ignoreCase?: boolean): boolean;
|
|
34
|
+
compare(first: string, second: string, ignoreCase?: boolean): boolean;
|
|
35
35
|
/**
|
|
36
36
|
* Are two values equal?
|
|
37
37
|
*
|
|
@@ -39,7 +39,7 @@ type Equalizer = {
|
|
|
39
39
|
* @param second Second value
|
|
40
40
|
* @returns `true` if the values are equal, otherwise `false`
|
|
41
41
|
*/
|
|
42
|
-
(first: unknown, second: unknown): boolean;
|
|
42
|
+
compare(first: unknown, second: unknown): boolean;
|
|
43
43
|
/**
|
|
44
44
|
* Deregister a equality comparison handler for a specific class
|
|
45
45
|
*
|
|
@@ -54,6 +54,17 @@ type Equalizer = {
|
|
|
54
54
|
*/
|
|
55
55
|
register: <Instance>(constructor: Constructor<Instance>, handler: (first: Instance, second: Instance) => boolean) => void;
|
|
56
56
|
};
|
|
57
|
+
type Options = {
|
|
58
|
+
ignoreCase: boolean;
|
|
59
|
+
ignoreExpressions: OptionsKeys<RegExp[]>;
|
|
60
|
+
ignoreKeys: OptionsKeys<Set<string>>;
|
|
61
|
+
relaxedNullish: boolean;
|
|
62
|
+
};
|
|
63
|
+
type OptionsKeys<Values> = {
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
values: Values;
|
|
66
|
+
};
|
|
67
|
+
declare function Equalizer(this: any, options: Options): void;
|
|
57
68
|
/**
|
|
58
69
|
* Deregister a equality comparison handler for a specific class
|
|
59
70
|
*
|
|
@@ -61,7 +72,7 @@ type Equalizer = {
|
|
|
61
72
|
*
|
|
62
73
|
* @param constructor Class constructor
|
|
63
74
|
*/
|
|
64
|
-
declare function deregisterEqualizer<Instance>(constructor: Constructor<Instance>): void;
|
|
75
|
+
export declare function deregisterEqualizer<Instance>(constructor: Constructor<Instance>): void;
|
|
65
76
|
/**
|
|
66
77
|
* Are two strings equal?
|
|
67
78
|
*
|
|
@@ -70,7 +81,7 @@ declare function deregisterEqualizer<Instance>(constructor: Constructor<Instance
|
|
|
70
81
|
* @param ignoreCase If `true`, comparison will be case-insensitive
|
|
71
82
|
* @returns `true` if the strings are equal, otherwise `false`
|
|
72
83
|
*/
|
|
73
|
-
declare function equal(first: string, second: string, ignoreCase?: boolean): boolean;
|
|
84
|
+
export declare function equal(first: string, second: string, ignoreCase?: boolean): boolean;
|
|
74
85
|
/**
|
|
75
86
|
* Are two values equal?
|
|
76
87
|
*
|
|
@@ -79,14 +90,23 @@ declare function equal(first: string, second: string, ignoreCase?: boolean): boo
|
|
|
79
90
|
* @param options Comparison options
|
|
80
91
|
* @returns `true` if the values are equal, otherwise `false`
|
|
81
92
|
*/
|
|
82
|
-
declare function equal(first: unknown, second: unknown, options?: EqualOptions): boolean;
|
|
83
|
-
declare namespace equal {
|
|
84
|
-
var
|
|
85
|
-
|
|
93
|
+
export declare function equal(first: unknown, second: unknown, options?: EqualOptions): boolean;
|
|
94
|
+
export declare namespace equal {
|
|
95
|
+
var deregister: typeof deregisterEqualizer;
|
|
96
|
+
var handler: {
|
|
97
|
+
base: {
|
|
98
|
+
handlers: WeakMap<Constructor, string | GenericCallback>;
|
|
99
|
+
options: {
|
|
100
|
+
callback: GenericCallback;
|
|
101
|
+
method?: string;
|
|
102
|
+
};
|
|
103
|
+
owner: GenericCallback;
|
|
104
|
+
deregister: (constructor: Constructor) => void;
|
|
105
|
+
get: (first: unknown, second: unknown) => string | GenericCallback | undefined;
|
|
106
|
+
register: (constructor: Constructor, handler?: string | GenericCallback) => void;
|
|
107
|
+
};
|
|
86
108
|
handle(first: unknown, second: unknown, ...parameters: unknown[]): boolean;
|
|
87
|
-
register(constructor: Constructor, handler?: string | GenericCallback): void;
|
|
88
109
|
};
|
|
89
|
-
var deregister: typeof deregisterEqualizer;
|
|
90
110
|
var initialize: typeof initializeEqualizer;
|
|
91
111
|
var register: typeof registerEqualizer;
|
|
92
112
|
}
|
|
@@ -98,7 +118,7 @@ declare namespace equal {
|
|
|
98
118
|
* @param options Comparison options
|
|
99
119
|
* @returns Equalizer function
|
|
100
120
|
*/
|
|
101
|
-
declare function initializeEqualizer(options?: EqualOptions): Equalizer;
|
|
121
|
+
export declare function initializeEqualizer(options?: EqualOptions): Equalizer;
|
|
102
122
|
/**
|
|
103
123
|
* Register a equality comparison function for a specific class
|
|
104
124
|
*
|
|
@@ -107,6 +127,5 @@ declare function initializeEqualizer(options?: EqualOptions): Equalizer;
|
|
|
107
127
|
* @param constructor Class constructor
|
|
108
128
|
* @param handler Comparison function
|
|
109
129
|
*/
|
|
110
|
-
declare function registerEqualizer<Instance>(constructor: Constructor<Instance>, handler: (first: Instance, second: Instance) => boolean): void;
|
|
111
|
-
//#endregion
|
|
112
|
-
export { EqualOptions, deregisterEqualizer, equal, initializeEqualizer, registerEqualizer };
|
|
130
|
+
export declare function registerEqualizer<Instance>(constructor: Constructor<Instance>, handler: (first: Instance, second: Instance) => boolean): void;
|
|
131
|
+
//#endregion
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { isNonPlainObject, isPlainObject, isPrimitive, isTypedArray } from "../is.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { createCompareHandler } from "./handlers.mjs";
|
|
3
3
|
//#region src/internal/value/equal.ts
|
|
4
|
+
function Equalizer(options) {
|
|
5
|
+
Object.defineProperty(this, EQUAL_SYMBOL, { value: options });
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperties(Equalizer.prototype, {
|
|
8
|
+
compare: { value: compare },
|
|
9
|
+
deregister: { value: deregisterEqualizer },
|
|
10
|
+
register: { value: registerEqualizer }
|
|
11
|
+
});
|
|
12
|
+
function compare(first, second) {
|
|
13
|
+
return equalValue(first, second, this[EQUAL_SYMBOL]);
|
|
14
|
+
}
|
|
4
15
|
function createEqualOptions(input) {
|
|
5
16
|
const options = {
|
|
6
17
|
ignoreCase: false,
|
|
@@ -35,7 +46,7 @@ function createEqualOptions(input) {
|
|
|
35
46
|
* @param constructor Class constructor
|
|
36
47
|
*/
|
|
37
48
|
function deregisterEqualizer(constructor) {
|
|
38
|
-
|
|
49
|
+
equalHandler.base.deregister(constructor);
|
|
39
50
|
}
|
|
40
51
|
function filterKey(key, options) {
|
|
41
52
|
if (typeof key !== "string") return true;
|
|
@@ -46,10 +57,6 @@ function filterKey(key, options) {
|
|
|
46
57
|
function equal(first, second, options) {
|
|
47
58
|
return equalValue(first, second, createEqualOptions(options));
|
|
48
59
|
}
|
|
49
|
-
equal.handlers = createCompareHandlers(equal, { callback: Object.is });
|
|
50
|
-
equal.deregister = deregisterEqualizer;
|
|
51
|
-
equal.initialize = initializeEqualizer;
|
|
52
|
-
equal.register = registerEqualizer;
|
|
53
60
|
function equalArray(first, second, options) {
|
|
54
61
|
const { length } = first;
|
|
55
62
|
if (length !== second.length) return false;
|
|
@@ -138,7 +145,7 @@ function equalValue(first, second, options) {
|
|
|
138
145
|
case Array.isArray(first) && Array.isArray(second): return equalArray(first, second, options);
|
|
139
146
|
case isPlainObject(first) && isPlainObject(second): return equalPlainObject(first, second, options);
|
|
140
147
|
case isTypedArray(first) && isTypedArray(second): return equalTypedArray(first, second);
|
|
141
|
-
default: return
|
|
148
|
+
default: return equalHandler.handle(first, second, options);
|
|
142
149
|
}
|
|
143
150
|
}
|
|
144
151
|
/**
|
|
@@ -150,11 +157,7 @@ function equalValue(first, second, options) {
|
|
|
150
157
|
* @returns Equalizer function
|
|
151
158
|
*/
|
|
152
159
|
function initializeEqualizer(options) {
|
|
153
|
-
|
|
154
|
-
const equalizer = (first, second) => equalValue(first, second, actual);
|
|
155
|
-
equalizer.deregister = deregisterEqualizer;
|
|
156
|
-
equalizer.register = registerEqualizer;
|
|
157
|
-
return equalizer;
|
|
160
|
+
return new Equalizer(createEqualOptions(options));
|
|
158
161
|
}
|
|
159
162
|
/**
|
|
160
163
|
* Register a equality comparison function for a specific class
|
|
@@ -165,12 +168,24 @@ function initializeEqualizer(options) {
|
|
|
165
168
|
* @param handler Comparison function
|
|
166
169
|
*/
|
|
167
170
|
function registerEqualizer(constructor, handler) {
|
|
168
|
-
|
|
171
|
+
equalHandler.base.register(constructor, handler);
|
|
169
172
|
}
|
|
170
173
|
const EQUAL_ARRAY_PEEK_PERCENTAGE = 10;
|
|
171
174
|
const EQUAL_ARRAY_THRESHOLD = 100;
|
|
172
175
|
const EQUAL_ERROR_PROPERTIES = ["name", "message"];
|
|
173
176
|
const EQUAL_EXPRESSION_PROPERTIES = ["source", "flags"];
|
|
174
177
|
const EQUAL_MINIMUM_LENGTH_FOR_SET = 16;
|
|
178
|
+
const EQUAL_SYMBOL = Symbol("equal");
|
|
179
|
+
const equalHandler = createCompareHandler(equal, { callback: Object.is });
|
|
180
|
+
equal.deregister = deregisterEqualizer;
|
|
181
|
+
equal.handler = equalHandler;
|
|
182
|
+
equal.initialize = initializeEqualizer;
|
|
183
|
+
equal.register = registerEqualizer;
|
|
184
|
+
Object.defineProperties(equal, {
|
|
185
|
+
deregister: { value: deregisterEqualizer },
|
|
186
|
+
handler: { value: equalHandler },
|
|
187
|
+
initialize: { value: initializeEqualizer },
|
|
188
|
+
register: { value: registerEqualizer }
|
|
189
|
+
});
|
|
175
190
|
//#endregion
|
|
176
191
|
export { deregisterEqualizer, equal, initializeEqualizer, registerEqualizer };
|