@fgv/ts-utils 4.2.2 → 4.3.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/CHANGELOG.json +12 -0
- package/CHANGELOG.md +8 -1
- package/dist/ts-utils.d.ts +3085 -2658
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -2
- package/lib/index.js.map +1 -1
- package/lib/packlets/base/result.d.ts +33 -0
- package/lib/packlets/base/result.d.ts.map +1 -1
- package/lib/packlets/base/result.js +24 -0
- package/lib/packlets/base/result.js.map +1 -1
- package/lib/packlets/collections/collectible.d.ts +48 -0
- package/lib/packlets/collections/collectible.d.ts.map +1 -0
- package/lib/packlets/collections/collectible.js +59 -0
- package/lib/packlets/collections/collectible.js.map +1 -0
- package/lib/packlets/collections/collector.d.ts +130 -0
- package/lib/packlets/collections/collector.d.ts.map +1 -0
- package/lib/packlets/collections/collector.js +147 -0
- package/lib/packlets/collections/collector.js.map +1 -0
- package/lib/packlets/collections/collectorConverter.d.ts +59 -0
- package/lib/packlets/collections/collectorConverter.d.ts.map +1 -0
- package/lib/packlets/collections/collectorConverter.js +86 -0
- package/lib/packlets/collections/collectorConverter.js.map +1 -0
- package/lib/packlets/collections/collectors.d.ts +32 -0
- package/lib/packlets/collections/collectors.d.ts.map +1 -0
- package/lib/packlets/collections/collectors.js +57 -0
- package/lib/packlets/collections/collectors.js.map +1 -0
- package/lib/packlets/collections/convertingCollector.d.ts +67 -0
- package/lib/packlets/collections/convertingCollector.d.ts.map +1 -0
- package/lib/packlets/collections/convertingCollector.js +77 -0
- package/lib/packlets/collections/convertingCollector.js.map +1 -0
- package/lib/packlets/collections/{validatingResultMap.d.ts → convertingResultMap.d.ts} +18 -18
- package/lib/packlets/collections/convertingResultMap.d.ts.map +1 -0
- package/lib/packlets/collections/{validatingResultMap.js → convertingResultMap.js} +18 -18
- package/lib/packlets/collections/convertingResultMap.js.map +1 -0
- package/lib/packlets/collections/index.d.ts +8 -2
- package/lib/packlets/collections/index.d.ts.map +1 -1
- package/lib/packlets/collections/index.js +8 -2
- package/lib/packlets/collections/index.js.map +1 -1
- package/lib/packlets/collections/keyValueConverters.d.ts +90 -0
- package/lib/packlets/collections/keyValueConverters.d.ts.map +1 -0
- package/lib/packlets/collections/keyValueConverters.js +111 -0
- package/lib/packlets/collections/keyValueConverters.js.map +1 -0
- package/lib/packlets/collections/readonlyResultMap.d.ts +1 -1
- package/lib/packlets/collections/readonlyResultMap.d.ts.map +1 -1
- package/lib/packlets/collections/readonlyResultMap.js.map +1 -1
- package/lib/packlets/collections/{resultMapValidator.d.ts → resultMapConverter.d.ts} +14 -18
- package/lib/packlets/collections/resultMapConverter.d.ts.map +1 -0
- package/lib/packlets/collections/{resultMapValidator.js → resultMapConverter.js} +15 -15
- package/lib/packlets/collections/resultMapConverter.js.map +1 -0
- package/lib/packlets/collections/utils.d.ts +0 -61
- package/lib/packlets/collections/utils.d.ts.map +1 -1
- package/lib/packlets/collections/utils.js +0 -82
- package/lib/packlets/collections/utils.js.map +1 -1
- package/lib/packlets/conversion/baseConverter.d.ts +12 -7
- package/lib/packlets/conversion/baseConverter.d.ts.map +1 -1
- package/lib/packlets/conversion/baseConverter.js +12 -8
- package/lib/packlets/conversion/baseConverter.js.map +1 -1
- package/lib/packlets/conversion/converter.d.ts +6 -6
- package/lib/packlets/conversion/converter.d.ts.map +1 -1
- package/lib/packlets/conversion/converter.js.map +1 -1
- package/lib/packlets/conversion/converters.d.ts +8 -0
- package/lib/packlets/conversion/converters.d.ts.map +1 -1
- package/lib/packlets/conversion/converters.js +11 -0
- package/lib/packlets/conversion/converters.js.map +1 -1
- package/lib/packlets/conversion/objectConverter.d.ts +1 -1
- package/lib/packlets/conversion/objectConverter.d.ts.map +1 -1
- package/lib/packlets/conversion/objectConverter.js.map +1 -1
- package/lib/packlets/validation/common.d.ts +8 -0
- package/lib/packlets/validation/common.d.ts.map +1 -1
- package/lib/packlets/validation/common.js.map +1 -1
- package/lib/packlets/validation/genericValidator.d.ts +4 -6
- package/lib/packlets/validation/genericValidator.d.ts.map +1 -1
- package/lib/packlets/validation/genericValidator.js.map +1 -1
- package/lib/packlets/validation/number.d.ts.map +1 -1
- package/lib/packlets/validation/number.js +3 -1
- package/lib/packlets/validation/number.js.map +1 -1
- package/lib/packlets/validation/string.d.ts.map +1 -1
- package/lib/packlets/validation/string.js +3 -1
- package/lib/packlets/validation/string.js.map +1 -1
- package/lib/packlets/validation/validators.d.ts +12 -2
- package/lib/packlets/validation/validators.d.ts.map +1 -1
- package/lib/packlets/validation/validators.js +13 -0
- package/lib/packlets/validation/validators.js.map +1 -1
- package/package.json +1 -1
- package/lib/packlets/collections/resultMapValidator.d.ts.map +0 -1
- package/lib/packlets/collections/resultMapValidator.js.map +0 -1
- package/lib/packlets/collections/validatingResultMap.d.ts.map +0 -1
- package/lib/packlets/collections/validatingResultMap.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Erik Fortune
|
|
4
|
+
*
|
|
5
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
* in the Software without restriction, including without limitation the rights
|
|
8
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
* furnished to do so, subject to the following conditions:
|
|
11
|
+
*
|
|
12
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
* copies or substantial portions of the Software.
|
|
14
|
+
*
|
|
15
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
* SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.Collector = void 0;
|
|
25
|
+
const base_1 = require("../base");
|
|
26
|
+
/**
|
|
27
|
+
* A {@link ICollector | Collector} that collects {@link Collections.ICollectible | ICollectible} items. Items in a collector are created by key and are assigned an index at the
|
|
28
|
+
* time of addition. Items are immutable once added. Keys and indexes might be branded types, and source items might be transformed on addition.
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
class Collector {
|
|
32
|
+
/**
|
|
33
|
+
* {@inheritdoc IReadOnlyResultMap.inner}
|
|
34
|
+
*/
|
|
35
|
+
get inner() {
|
|
36
|
+
return this._byKey;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Constructor for derived classes.
|
|
40
|
+
* @param params - Parameters for constructing the collector.
|
|
41
|
+
*/
|
|
42
|
+
constructor(params) {
|
|
43
|
+
var _a;
|
|
44
|
+
this._byKey = new Map();
|
|
45
|
+
this._byIndex = [];
|
|
46
|
+
this._factory = params.factory;
|
|
47
|
+
(_a = params.entries) === null || _a === void 0 ? void 0 : _a.forEach((entry) => {
|
|
48
|
+
this.getOrAdd(entry[0], entry[1]);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* {@inheritdoc IReadOnlyResultMap.size}
|
|
53
|
+
*/
|
|
54
|
+
get size() {
|
|
55
|
+
return this._byKey.size;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* {@inheritdoc IReadOnlyResultMap.keys}
|
|
59
|
+
*/
|
|
60
|
+
keys() {
|
|
61
|
+
return this._byKey.keys();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* {@inheritdoc IReadOnlyResultMap.values}
|
|
65
|
+
*/
|
|
66
|
+
values() {
|
|
67
|
+
return this._byKey.values();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* {@inheritdoc IReadOnlyResultMap.entries}
|
|
71
|
+
*/
|
|
72
|
+
entries() {
|
|
73
|
+
return this._byKey.entries();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* {@inheritdoc IReadOnlyResultMap.forEach}
|
|
77
|
+
*/
|
|
78
|
+
forEach(callback, arg) {
|
|
79
|
+
for (const [key, value] of this._byKey.entries()) {
|
|
80
|
+
callback(value, key, this, arg);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* {@inheritdoc IReadOnlyResultMap.get}
|
|
85
|
+
*/
|
|
86
|
+
get(key) {
|
|
87
|
+
const item = this._byKey.get(key);
|
|
88
|
+
if (item === undefined) {
|
|
89
|
+
return (0, base_1.failWithDetail)(`${key}: not found.`, 'not-found');
|
|
90
|
+
}
|
|
91
|
+
return (0, base_1.succeedWithDetail)(item, 'success');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* {@inheritdoc ICollector.getAt}
|
|
95
|
+
*/
|
|
96
|
+
getAt(index) {
|
|
97
|
+
if (index < 0 || index >= this._byIndex.length) {
|
|
98
|
+
return (0, base_1.fail)(`${index}: out of range.`);
|
|
99
|
+
}
|
|
100
|
+
return (0, base_1.succeed)(this._byIndex[index]);
|
|
101
|
+
}
|
|
102
|
+
getOrAdd(key, itemOrCb) {
|
|
103
|
+
if (this._byKey.has(key)) {
|
|
104
|
+
return (0, base_1.succeedWithDetail)(this._byKey.get(key), 'exists');
|
|
105
|
+
}
|
|
106
|
+
const build = this._isFactoryCB(itemOrCb)
|
|
107
|
+
? itemOrCb(key, this._byIndex.length)
|
|
108
|
+
: this._factory(key, this._byIndex.length, itemOrCb);
|
|
109
|
+
if (build.isFailure()) {
|
|
110
|
+
return (0, base_1.failWithDetail)(build.message, 'invalid-value');
|
|
111
|
+
}
|
|
112
|
+
const newItem = build.value;
|
|
113
|
+
if (newItem.key !== key) {
|
|
114
|
+
return (0, base_1.failWithDetail)(`$[key}: key mismatch in created item - ${newItem.key} !== ${key}`, 'invalid-key');
|
|
115
|
+
}
|
|
116
|
+
if (newItem.index !== this._byIndex.length) {
|
|
117
|
+
return (0, base_1.failWithDetail)(`$[key}: index mismatch in created item - ${newItem.index} !== ${this._byIndex.length}`, 'invalid-value');
|
|
118
|
+
}
|
|
119
|
+
this._byKey.set(key, newItem);
|
|
120
|
+
this._byIndex.push(newItem);
|
|
121
|
+
return (0, base_1.succeedWithDetail)(newItem, 'added');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* {@inheritdoc IReadOnlyResultMap.has}
|
|
125
|
+
*/
|
|
126
|
+
has(key) {
|
|
127
|
+
return this._byKey.has(key);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* {@inheritdoc ICollector.toReadOnly}
|
|
131
|
+
*/
|
|
132
|
+
toReadOnly() {
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Gets an iterator over the map entries.
|
|
137
|
+
* @returns An iterator over the map entries.
|
|
138
|
+
*/
|
|
139
|
+
[Symbol.iterator]() {
|
|
140
|
+
return this._byKey[Symbol.iterator]();
|
|
141
|
+
}
|
|
142
|
+
_isFactoryCB(item) {
|
|
143
|
+
return typeof item === 'function';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.Collector = Collector;
|
|
147
|
+
//# sourceMappingURL=collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/packlets/collections/collector.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { DetailedResult, Result, fail, failWithDetail, succeed, succeedWithDetail } from '../base';\nimport { ICollectible, CollectibleFactoryCallback, CollectibleFactory } from './collectible';\nimport { KeyValueEntry } from './common';\nimport { IReadOnlyResultMap, ResultMapForEachCb, ResultMapResultDetail } from './readonlyResultMap';\n\n/**\n * Collects {@link Collections.ICollectible | ICollectible} items. Items in a collector are created by key and are assigned an index at the\n * time of addition. Items are immutable once added.\n * @public\n */\nexport interface ICollector<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> extends IReadOnlyResultMap<TKEY, TITEM> {\n /**\n * Gets the item at a specified index.\n * @param index - The index of the item to retrieve.\n * @returns Returs {@link Success | Success} with the item if it exists, or {@link Failure | Failure} with an error if the index is out of range.\n */\n getAt(index: TINDEX): Result<TITEM>;\n\n /**\n * Gets an item by key if it exists, or creates a new item and adds it using the default {@link Collections.CollectibleFactory | factory} if not.\n * @param key - The key of the item to retrieve.\n * @param item - The source representation of the item to be added if it does not exist.\n * @returns Returns {@link Success | Success} with the item if it exists or could be created, or {@link Failure | Failure} with an error if the\n * item cannot be created and indexed.\n */\n getOrAdd(key: TKEY, item: TSRC): DetailedResult<TITEM, ResultMapResultDetail>;\n\n /**\n * Gets an item by key if it exists, or creates a new item and adds it using the specified {@link Collections.CollectibleFactoryCallback | factory callback} if not.\n * @param key - The key of the item to retrieve.\n * @param callback - The factory callback to create the item if it does not exist.\n * @returns Returns {@link Success | Success} with the item if it exists, or {@link Failure | Failure} with an error if the item is not found.\n */\n getOrAdd(\n key: TKEY,\n callback: CollectibleFactoryCallback<TKEY, TINDEX>\n ): DetailedResult<TITEM, ResultMapResultDetail>;\n\n /**\n * Gets a {@link IReadOnlyResultMap | read-only map} which can access the items in the collector.\n */\n toReadOnly(): IReadOnlyResultMap<TKEY, TITEM>;\n}\n\n/**\n * A simple {@link ICollector | ICollector} with non-branded `string` key and `number` index, and no transformation of source items.\n * @public\n */\nexport type ISimpleCollector<TITEM extends ICollectible<string, number>> = ICollector<\n string,\n number,\n TITEM,\n TITEM\n>;\n\n/**\n * A {@link ICollector | Collector} with non-branded `string` key and `number` index, and transformation of source items.\n * @public\n */\nexport type IConvertingCollector<TITEM extends ICollectible<string, number>, TSRC> = ICollector<\n string,\n number,\n TITEM,\n TSRC\n>;\n\n/**\n * Parameters for constructing a {@link ICollector | Collector}.\n * @public\n */\nexport interface ICollectorConstructorParams<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> {\n /**\n * The default {@link Collections.CollectibleFactory | factory} to create items.\n */\n factory: CollectibleFactory<TKEY, TINDEX, TITEM, TSRC>;\n /**\n * An optional array of entries to add to the collector.\n */\n entries?: KeyValueEntry<TKEY, TSRC>[];\n}\n\n/**\n * A {@link ICollector | Collector} that collects {@link Collections.ICollectible | ICollectible} items. Items in a collector are created by key and are assigned an index at the\n * time of addition. Items are immutable once added. Keys and indexes might be branded types, and source items might be transformed on addition.\n * @public\n */\nexport class Collector<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> implements ICollector<TKEY, TINDEX, TITEM, TSRC>\n{\n private _byKey: Map<TKEY, TITEM>;\n private _byIndex: TITEM[];\n private _factory: CollectibleFactory<TKEY, TINDEX, TITEM, TSRC>;\n\n /**\n * {@inheritdoc IReadOnlyResultMap.inner}\n */\n public get inner(): ReadonlyMap<TKEY, TITEM> {\n return this._byKey;\n }\n\n /**\n * Constructor for derived classes.\n * @param params - Parameters for constructing the collector.\n */\n protected constructor(params: ICollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>) {\n this._byKey = new Map<TKEY, TITEM>();\n this._byIndex = [];\n this._factory = params.factory;\n params.entries?.forEach((entry) => {\n this.getOrAdd(entry[0], entry[1]);\n });\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.size}\n */\n public get size(): number {\n return this._byKey.size;\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.keys}\n */\n public keys(): IterableIterator<TKEY> {\n return this._byKey.keys();\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.values}\n */\n public values(): IterableIterator<TITEM> {\n return this._byKey.values();\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.entries}\n */\n public entries(): IterableIterator<[TKEY, TITEM]> {\n return this._byKey.entries();\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.forEach}\n */\n public forEach(callback: ResultMapForEachCb<TKEY, TITEM>, arg?: unknown): void {\n for (const [key, value] of this._byKey.entries()) {\n callback(value, key, this, arg);\n }\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.get}\n */\n public get(key: TKEY): DetailedResult<TITEM, ResultMapResultDetail> {\n const item = this._byKey.get(key);\n if (item === undefined) {\n return failWithDetail<TITEM, ResultMapResultDetail>(`${key}: not found.`, 'not-found');\n }\n return succeedWithDetail(item, 'success');\n }\n\n /**\n * {@inheritdoc ICollector.getAt}\n */\n public getAt(index: TINDEX): Result<TITEM> {\n if (index < 0 || index >= this._byIndex.length) {\n return fail(`${index}: out of range.`);\n }\n return succeed(this._byIndex[index]);\n }\n\n /**\n * {@inheritdoc ICollector.(getOrAdd:1)}\n */\n public getOrAdd(key: TKEY, item: TSRC): DetailedResult<TITEM, ResultMapResultDetail>;\n /**\n * {@inheritdoc ICollector.(getOrAdd:2)}\n */\n public getOrAdd(\n key: TKEY,\n cb: CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail>;\n public getOrAdd(\n key: TKEY,\n itemOrCb: TSRC | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail> {\n if (this._byKey.has(key)) {\n return succeedWithDetail(this._byKey.get(key)!, 'exists');\n }\n const build = this._isFactoryCB(itemOrCb)\n ? itemOrCb(key, this._byIndex.length)\n : this._factory(key, this._byIndex.length, itemOrCb);\n if (build.isFailure()) {\n return failWithDetail<TITEM, ResultMapResultDetail>(build.message, 'invalid-value');\n }\n const newItem = build.value;\n\n if (newItem.key !== key) {\n return failWithDetail(\n `$[key}: key mismatch in created item - ${newItem.key} !== ${key}`,\n 'invalid-key'\n );\n }\n if (newItem.index !== this._byIndex.length) {\n return failWithDetail(\n `$[key}: index mismatch in created item - ${newItem.index} !== ${this._byIndex.length}`,\n 'invalid-value'\n );\n }\n this._byKey.set(key, newItem);\n this._byIndex.push(newItem);\n return succeedWithDetail(newItem, 'added');\n }\n\n /**\n * {@inheritdoc IReadOnlyResultMap.has}\n */\n public has(key: TKEY): boolean {\n return this._byKey.has(key);\n }\n\n /**\n * {@inheritdoc ICollector.toReadOnly}\n */\n public toReadOnly(): IReadOnlyResultMap<TKEY, TITEM> {\n return this;\n }\n\n /**\n * Gets an iterator over the map entries.\n * @returns An iterator over the map entries.\n */\n public [Symbol.iterator](): IterableIterator<KeyValueEntry<TKEY, TITEM>> {\n return this._byKey[Symbol.iterator]();\n }\n\n protected _isFactoryCB(\n item: TSRC | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): item is CollectibleFactoryCallback<TKEY, TINDEX, TITEM> {\n return typeof item === 'function';\n }\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DetailedResult } from '../base';
|
|
2
|
+
import { IReadOnlyResultMap, ResultMapResultDetail } from './readonlyResultMap';
|
|
3
|
+
import { ResultMapValueFactory } from './resultMap';
|
|
4
|
+
import { KeyValueConverters } from './keyValueConverters';
|
|
5
|
+
import { CollectibleFactoryCallback, ICollectible } from './collectible';
|
|
6
|
+
import { ICollector } from './collector';
|
|
7
|
+
import { IReadOnlyResultMapConverter } from './resultMapConverter';
|
|
8
|
+
/**
|
|
9
|
+
* Parameters for constructing a {@link Collections.CollectorConverter | CollectorConverter}.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export interface ICollectorConverterCreateParams<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM> {
|
|
13
|
+
collector: ICollector<TKEY, TINDEX, TITEM, TSRC>;
|
|
14
|
+
converters: KeyValueConverters<TKEY, TSRC>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A {@link Collections.Collector | Collector} wrapper which validates weakly-typed keys
|
|
18
|
+
* and values before calling the wrapped collector.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare class CollectorConverter<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM> implements IReadOnlyResultMapConverter<TKEY, TITEM> {
|
|
22
|
+
readonly converters: KeyValueConverters<TKEY, TSRC>;
|
|
23
|
+
get map(): IReadOnlyResultMap<TKEY, TITEM>;
|
|
24
|
+
protected _collector: ICollector<TKEY, TINDEX, TITEM, TSRC>;
|
|
25
|
+
/**
|
|
26
|
+
* Constructs a new {@link Collections.CollectorConverter | CollectorConverter}.
|
|
27
|
+
* @param params - Required parameters for constructing the collector converter.
|
|
28
|
+
*/
|
|
29
|
+
constructor(params: ICollectorConverterCreateParams<TKEY, TINDEX, TITEM, TSRC>);
|
|
30
|
+
/**
|
|
31
|
+
* {@inheritdoc Collections.Collector.get}
|
|
32
|
+
*/
|
|
33
|
+
get(key: string): DetailedResult<TITEM, ResultMapResultDetail>;
|
|
34
|
+
/**
|
|
35
|
+
* {@inheritdoc Collections.Collector.(getOrAdd:1)}
|
|
36
|
+
*/
|
|
37
|
+
getOrAdd(key: string, value: unknown): DetailedResult<TITEM, ResultMapResultDetail>;
|
|
38
|
+
/**
|
|
39
|
+
* {@inheritdoc Collections.Collector.(getOrAdd:2)}
|
|
40
|
+
*/
|
|
41
|
+
getOrAdd(key: string, factory: ResultMapValueFactory<TKEY, TITEM>): DetailedResult<TITEM, ResultMapResultDetail>;
|
|
42
|
+
/**
|
|
43
|
+
* {@inheritdoc Collections.Collector.has}
|
|
44
|
+
*/
|
|
45
|
+
has(key: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* {@inheritdoc Collections.Collector.toReadOnly}
|
|
48
|
+
*/
|
|
49
|
+
toReadOnly(): IReadOnlyResultMapConverter<TKEY, TITEM>;
|
|
50
|
+
/**
|
|
51
|
+
* Determines if a value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback}.
|
|
52
|
+
* @param value - The value to check.
|
|
53
|
+
* @returns `true` if the value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback},
|
|
54
|
+
* `false` otherwise.
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
protected _isCollectibleFactoryCallback(value: unknown | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>): value is CollectibleFactoryCallback<TKEY, TINDEX, TITEM>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=collectorConverter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectorConverter.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/collectorConverter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,+BAA+B,CAC9C,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACrE,IAAI,GAAG,KAAK;IAEZ,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,qBAAa,kBAAkB,CAC7B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACrE,IAAI,GAAG,KAAK,CACZ,YAAW,2BAA2B,CAAC,IAAI,EAAE,KAAK,CAAC;IAEnD,SAAgB,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3D,IAAW,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAEhD;IAED,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5D;;;OAGG;gBACgB,MAAM,EAAE,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAKrF;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAMrE;;OAEG;IACI,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAE1F;;OAEG;IACI,QAAQ,CACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,GAC1C,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAgB/C;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACI,UAAU,IAAI,2BAA2B,CAAC,IAAI,EAAE,KAAK,CAAC;IAI7D;;;;;;OAMG;IACH,SAAS,CAAC,6BAA6B,CACrC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAC/D,KAAK,IAAI,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;CAG5D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Erik Fortune
|
|
4
|
+
*
|
|
5
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
* in the Software without restriction, including without limitation the rights
|
|
8
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
* furnished to do so, subject to the following conditions:
|
|
11
|
+
*
|
|
12
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
* copies or substantial portions of the Software.
|
|
14
|
+
*
|
|
15
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
* SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.CollectorConverter = void 0;
|
|
25
|
+
/**
|
|
26
|
+
* A {@link Collections.Collector | Collector} wrapper which validates weakly-typed keys
|
|
27
|
+
* and values before calling the wrapped collector.
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
class CollectorConverter {
|
|
31
|
+
get map() {
|
|
32
|
+
return this._collector.toReadOnly();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Constructs a new {@link Collections.CollectorConverter | CollectorConverter}.
|
|
36
|
+
* @param params - Required parameters for constructing the collector converter.
|
|
37
|
+
*/
|
|
38
|
+
constructor(params) {
|
|
39
|
+
this._collector = params.collector;
|
|
40
|
+
this.converters = params.converters;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* {@inheritdoc Collections.Collector.get}
|
|
44
|
+
*/
|
|
45
|
+
get(key) {
|
|
46
|
+
return this.converters.convertKey(key).onSuccess((k) => {
|
|
47
|
+
return this._collector.get(k);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
getOrAdd(key, valueOrFactory) {
|
|
51
|
+
if (!this._isCollectibleFactoryCallback(valueOrFactory)) {
|
|
52
|
+
return this.converters.convertEntry([key, valueOrFactory]).onSuccess(([vk, vs]) => {
|
|
53
|
+
return this._collector.getOrAdd(vk, vs);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return this.converters.convertKey(key).onSuccess((k) => {
|
|
58
|
+
return this._collector.getOrAdd(k, valueOrFactory);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* {@inheritdoc Collections.Collector.has}
|
|
64
|
+
*/
|
|
65
|
+
has(key) {
|
|
66
|
+
return this._collector.has(key);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* {@inheritdoc Collections.Collector.toReadOnly}
|
|
70
|
+
*/
|
|
71
|
+
toReadOnly() {
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Determines if a value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback}.
|
|
76
|
+
* @param value - The value to check.
|
|
77
|
+
* @returns `true` if the value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback},
|
|
78
|
+
* `false` otherwise.
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
_isCollectibleFactoryCallback(value) {
|
|
82
|
+
return typeof value === 'function';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.CollectorConverter = CollectorConverter;
|
|
86
|
+
//# sourceMappingURL=collectorConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectorConverter.js","sourceRoot":"","sources":["../../../src/packlets/collections/collectorConverter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAwBH;;;;GAIG;AACH,MAAa,kBAAkB;IAS7B,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAID;;;OAGG;IACH,YAAmB,MAAkE;QACnF,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YACrD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAcM,QAAQ,CACb,GAAW,EACX,cAAyE;QAEzE,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;gBAChF,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAW,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,UAAU;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACO,6BAA6B,CACrC,KAAgE;QAEhE,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;IACrC,CAAC;CACF;AAtFD,gDAsFC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { DetailedResult } from '../base';\nimport { IReadOnlyResultMap, ResultMapResultDetail } from './readonlyResultMap';\nimport { ResultMapValueFactory } from './resultMap';\nimport { KeyValueConverters } from './keyValueConverters';\nimport { CollectibleFactoryCallback, ICollectible } from './collectible';\nimport { ICollector } from './collector';\nimport { IReadOnlyResultMapConverter } from './resultMapConverter';\n\n/**\n * Parameters for constructing a {@link Collections.CollectorConverter | CollectorConverter}.\n * @public\n */\nexport interface ICollectorConverterCreateParams<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> {\n collector: ICollector<TKEY, TINDEX, TITEM, TSRC>;\n converters: KeyValueConverters<TKEY, TSRC>;\n}\n\n/**\n * A {@link Collections.Collector | Collector} wrapper which validates weakly-typed keys\n * and values before calling the wrapped collector.\n * @public\n */\nexport class CollectorConverter<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> implements IReadOnlyResultMapConverter<TKEY, TITEM>\n{\n public readonly converters: KeyValueConverters<TKEY, TSRC>;\n\n public get map(): IReadOnlyResultMap<TKEY, TITEM> {\n return this._collector.toReadOnly();\n }\n\n protected _collector: ICollector<TKEY, TINDEX, TITEM, TSRC>;\n\n /**\n * Constructs a new {@link Collections.CollectorConverter | CollectorConverter}.\n * @param params - Required parameters for constructing the collector converter.\n */\n public constructor(params: ICollectorConverterCreateParams<TKEY, TINDEX, TITEM, TSRC>) {\n this._collector = params.collector;\n this.converters = params.converters;\n }\n\n /**\n * {@inheritdoc Collections.Collector.get}\n */\n public get(key: string): DetailedResult<TITEM, ResultMapResultDetail> {\n return this.converters.convertKey(key).onSuccess((k) => {\n return this._collector.get(k);\n });\n }\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:1)}\n */\n public getOrAdd(key: string, value: unknown): DetailedResult<TITEM, ResultMapResultDetail>;\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:2)}\n */\n public getOrAdd(\n key: string,\n factory: ResultMapValueFactory<TKEY, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail>;\n public getOrAdd(\n key: string,\n valueOrFactory: unknown | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail> {\n if (!this._isCollectibleFactoryCallback(valueOrFactory)) {\n return this.converters.convertEntry([key, valueOrFactory]).onSuccess(([vk, vs]) => {\n return this._collector.getOrAdd(vk, vs);\n });\n } else {\n return this.converters.convertKey(key).onSuccess((k) => {\n return this._collector.getOrAdd(k, valueOrFactory);\n });\n }\n }\n\n /**\n * {@inheritdoc Collections.Collector.has}\n */\n public has(key: string): boolean {\n return this._collector.has(key as TKEY);\n }\n\n /**\n * {@inheritdoc Collections.Collector.toReadOnly}\n */\n public toReadOnly(): IReadOnlyResultMapConverter<TKEY, TITEM> {\n return this;\n }\n\n /**\n * Determines if a value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback}.\n * @param value - The value to check.\n * @returns `true` if the value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback},\n * `false` otherwise.\n * @public\n */\n protected _isCollectibleFactoryCallback(\n value: unknown | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): value is CollectibleFactoryCallback<TKEY, TINDEX, TITEM> {\n return typeof value === 'function';\n }\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Result } from '../base';
|
|
2
|
+
import { ICollectible } from './collectible';
|
|
3
|
+
import { Collector } from './collector';
|
|
4
|
+
/**
|
|
5
|
+
* Parameters for creating a {@link SimpleCollector | simple collector}.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface ISimpleCollectorCreateParams<TITEM extends ICollectible<string, number>> {
|
|
9
|
+
items?: TITEM[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A simple {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible items}
|
|
13
|
+
* with non-branded `string` key and `number` index, and with no transformation other than index assignment
|
|
14
|
+
* on addition.
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export declare class SimpleCollector<TITEM extends ICollectible<string, number>> extends Collector<string, number, TITEM, TITEM> {
|
|
18
|
+
/**
|
|
19
|
+
* Constructs a new {@link SimpleCollector | simple collector}.
|
|
20
|
+
* @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.
|
|
21
|
+
*/
|
|
22
|
+
constructor(params?: ISimpleCollectorCreateParams<TITEM>);
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new {@link SimpleCollector | simple collector}.
|
|
25
|
+
* @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.
|
|
26
|
+
* @returns {@link Success | Success} if the collector is created successfully, or {@link Failure | Failure} if not.
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
static createSimpleCollector<TITEM extends ICollectible<string, number>>(params?: ISimpleCollectorCreateParams<TITEM>): Result<SimpleCollector<TITEM>>;
|
|
30
|
+
private static _factory;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=collectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/collectors.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,EAA0B,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;IACtF,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,eAAe,CAAC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAE,SAAQ,SAAS,CACxF,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,CACN;IACC;;;OAGG;gBACgB,MAAM,CAAC,EAAE,4BAA4B,CAAC,KAAK,CAAC;IAK/D;;;;;OAKG;WACW,qBAAqB,CAAC,KAAK,SAAS,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5E,MAAM,CAAC,EAAE,4BAA4B,CAAC,KAAK,CAAC,GAC3C,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAIjC,OAAO,CAAC,MAAM,CAAC,QAAQ;CAOxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Erik Fortune
|
|
4
|
+
*
|
|
5
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
* in the Software without restriction, including without limitation the rights
|
|
8
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
* furnished to do so, subject to the following conditions:
|
|
11
|
+
*
|
|
12
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
* copies or substantial portions of the Software.
|
|
14
|
+
*
|
|
15
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
* SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.SimpleCollector = void 0;
|
|
25
|
+
const base_1 = require("../base");
|
|
26
|
+
const collector_1 = require("./collector");
|
|
27
|
+
/**
|
|
28
|
+
* A simple {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible items}
|
|
29
|
+
* with non-branded `string` key and `number` index, and with no transformation other than index assignment
|
|
30
|
+
* on addition.
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
class SimpleCollector extends collector_1.Collector {
|
|
34
|
+
/**
|
|
35
|
+
* Constructs a new {@link SimpleCollector | simple collector}.
|
|
36
|
+
* @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.
|
|
37
|
+
*/
|
|
38
|
+
constructor(params) {
|
|
39
|
+
var _a;
|
|
40
|
+
const entries = (_a = params === null || params === void 0 ? void 0 : params.items) === null || _a === void 0 ? void 0 : _a.map((item) => [item.key, item]);
|
|
41
|
+
super({ factory: SimpleCollector._factory, entries });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new {@link SimpleCollector | simple collector}.
|
|
45
|
+
* @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.
|
|
46
|
+
* @returns {@link Success | Success} if the collector is created successfully, or {@link Failure | Failure} if not.
|
|
47
|
+
* @public
|
|
48
|
+
*/
|
|
49
|
+
static createSimpleCollector(params) {
|
|
50
|
+
return (0, base_1.captureResult)(() => new SimpleCollector(params));
|
|
51
|
+
}
|
|
52
|
+
static _factory(key, index, item) {
|
|
53
|
+
return item.setIndex(index).onSuccess(() => (0, base_1.succeed)(item));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.SimpleCollector = SimpleCollector;
|
|
57
|
+
//# sourceMappingURL=collectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../../src/packlets/collections/collectors.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAEH,kCAAyD;AAEzD,2CAAwC;AAUxC;;;;;GAKG;AACH,MAAa,eAA4D,SAAQ,qBAKhF;IACC;;;OAGG;IACH,YAAmB,MAA4C;;QAC7D,MAAM,OAAO,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,0CAAE,GAAG,CAAC,CAAC,IAAI,EAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAChF,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,qBAAqB,CACjC,MAA4C;QAE5C,OAAO,IAAA,oBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM,CAAC,QAAQ,CACrB,GAAW,EACX,KAAa,EACb,IAAW;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF;AAlCD,0CAkCC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, captureResult, succeed } from '../base';\nimport { ICollectible } from './collectible';\nimport { Collector } from './collector';\n\n/**\n * Parameters for creating a {@link SimpleCollector | simple collector}.\n * @public\n */\nexport interface ISimpleCollectorCreateParams<TITEM extends ICollectible<string, number>> {\n items?: TITEM[];\n}\n\n/**\n * A simple {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible items}\n * with non-branded `string` key and `number` index, and with no transformation other than index assignment\n * on addition.\n * @public\n */\nexport class SimpleCollector<TITEM extends ICollectible<string, number>> extends Collector<\n string,\n number,\n TITEM,\n TITEM\n> {\n /**\n * Constructs a new {@link SimpleCollector | simple collector}.\n * @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.\n */\n public constructor(params?: ISimpleCollectorCreateParams<TITEM>) {\n const entries = params?.items?.map((item): [string, TITEM] => [item.key, item]);\n super({ factory: SimpleCollector._factory, entries });\n }\n\n /**\n * Creates a new {@link SimpleCollector | simple collector}.\n * @param params - {@link Collections.ISimpleCollectorCreateParams | Creation parameters} for the collector.\n * @returns {@link Success | Success} if the collector is created successfully, or {@link Failure | Failure} if not.\n * @public\n */\n public static createSimpleCollector<TITEM extends ICollectible<string, number>>(\n params?: ISimpleCollectorCreateParams<TITEM>\n ): Result<SimpleCollector<TITEM>> {\n return captureResult(() => new SimpleCollector(params));\n }\n\n private static _factory<TITEM extends ICollectible<string, number>>(\n key: string,\n index: number,\n item: TITEM\n ): Result<TITEM> {\n return item.setIndex(index).onSuccess(() => succeed(item));\n }\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { DetailedResult, Result } from '../base';
|
|
2
|
+
import { CollectibleFactory, CollectibleFactoryCallback, ICollectible } from './collectible';
|
|
3
|
+
import { Collector } from './collector';
|
|
4
|
+
import { CollectorConverter } from './collectorConverter';
|
|
5
|
+
import { KeyValueEntry } from './common';
|
|
6
|
+
import { IReadOnlyConvertingResultMap } from './convertingResultMap';
|
|
7
|
+
import { KeyValueConverters } from './keyValueConverters';
|
|
8
|
+
import { ResultMapResultDetail } from './readonlyResultMap';
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for constructing a {@link Collections.ConvertingCollector | ConvertingCollector}.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export interface IConvertingCollectorConstructorParams<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM> {
|
|
14
|
+
/**
|
|
15
|
+
* {@inheritdoc Collections.ICollectorConstructorParams.factory}
|
|
16
|
+
*/
|
|
17
|
+
factory: CollectibleFactory<TKEY, TINDEX, TITEM, TSRC>;
|
|
18
|
+
/**
|
|
19
|
+
* {@inheritdoc Collections.ICollectorConverterCreateParams.converters}
|
|
20
|
+
*/
|
|
21
|
+
converters: KeyValueConverters<TKEY, TSRC>;
|
|
22
|
+
/**
|
|
23
|
+
* {@inheritdoc Collections.ICollectorConstructorParams.entries}
|
|
24
|
+
*/
|
|
25
|
+
entries?: KeyValueEntry<TKEY, TSRC>[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A {@link Collections.Collector | Collector} with a {@link Collections.CollectorConverter | CollectorConverter}
|
|
29
|
+
* property that enables validated use of the underlying map with weakly-typed keys and values.
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
32
|
+
export declare class ConvertingCollector<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM> extends Collector<TKEY, TINDEX, TITEM, TSRC> {
|
|
33
|
+
/**
|
|
34
|
+
* A {@link Collections.CollectorConverter | CollectorConverter} which validates keys and values
|
|
35
|
+
* before inserting them into this collector.
|
|
36
|
+
*/
|
|
37
|
+
readonly converting: CollectorConverter<TKEY, TINDEX, TITEM, TSRC>;
|
|
38
|
+
protected readonly _converters: KeyValueConverters<TKEY, TSRC>;
|
|
39
|
+
/**
|
|
40
|
+
* Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}
|
|
41
|
+
* from the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
|
|
42
|
+
* @param params - Required parameters for constructing the collector.
|
|
43
|
+
*/
|
|
44
|
+
constructor(params: IConvertingCollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>);
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new {@link Collections.ConvertingCollector | ConvertingCollector} instance from
|
|
47
|
+
* the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
|
|
48
|
+
* @param params - Required parameters for constructing the collector.
|
|
49
|
+
* @returns {@link Success} with the new collector if successful, {@link Failure} otherwise.
|
|
50
|
+
*/
|
|
51
|
+
static createConvertingCollector<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM>(params: IConvertingCollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>): Result<ConvertingCollector<TKEY, TINDEX, TITEM, TSRC>>;
|
|
52
|
+
/**
|
|
53
|
+
* {@inheritdoc Collections.Collector.(getOrAdd:1)}
|
|
54
|
+
*/
|
|
55
|
+
getOrAdd(key: TKEY, item: TSRC): DetailedResult<TITEM, ResultMapResultDetail>;
|
|
56
|
+
/**
|
|
57
|
+
* {@inheritdoc Collections.Collector.(getOrAdd:2)}
|
|
58
|
+
*/
|
|
59
|
+
getOrAdd(key: TKEY, cb: CollectibleFactoryCallback<TKEY, TINDEX, TITEM>): DetailedResult<TITEM, ResultMapResultDetail>;
|
|
60
|
+
/**
|
|
61
|
+
* Gets a read-only version of this collector as a
|
|
62
|
+
* {@link Collections.IReadOnlyConvertingResultMap | read-only map}.
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
toReadOnly(): IReadOnlyConvertingResultMap<TKEY, TITEM>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=convertingCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertingCollector.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/convertingCollector.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiB,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,qCAAqC,CACpD,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACrE,IAAI,GAAG,KAAK;IAEZ;;OAEG;IACH,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvD;;OAEG;IACH,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3C;;OAEG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;CACvC;AAED;;;;GAIG;AACH,qBAAa,mBAAmB,CAC9B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACrE,IAAI,GAAG,KAAK,CACZ,SAAQ,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAC5C;;;OAGG;IACH,SAAgB,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE1E,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE/D;;;;OAIG;gBACgB,MAAM,EAAE,qCAAqC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;IAS3F;;;;;OAKG;WACW,yBAAyB,CACrC,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EACrE,IAAI,GAAG,KAAK,EAEZ,MAAM,EAAE,qCAAqC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GACvE,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAIzD;;OAEG;IACI,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAEpF;;OAEG;IACI,QAAQ,CACb,GAAG,EAAE,IAAI,EACT,EAAE,EAAE,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAClD,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAe/C;;;;OAIG;IACI,UAAU,IAAI,4BAA4B,CAAC,IAAI,EAAE,KAAK,CAAC;CAG/D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Erik Fortune
|
|
4
|
+
*
|
|
5
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
* in the Software without restriction, including without limitation the rights
|
|
8
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
* furnished to do so, subject to the following conditions:
|
|
11
|
+
*
|
|
12
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
* copies or substantial portions of the Software.
|
|
14
|
+
*
|
|
15
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
* SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.ConvertingCollector = void 0;
|
|
25
|
+
const base_1 = require("../base");
|
|
26
|
+
const collector_1 = require("./collector");
|
|
27
|
+
const collectorConverter_1 = require("./collectorConverter");
|
|
28
|
+
/**
|
|
29
|
+
* A {@link Collections.Collector | Collector} with a {@link Collections.CollectorConverter | CollectorConverter}
|
|
30
|
+
* property that enables validated use of the underlying map with weakly-typed keys and values.
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
class ConvertingCollector extends collector_1.Collector {
|
|
34
|
+
/**
|
|
35
|
+
* Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}
|
|
36
|
+
* from the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
|
|
37
|
+
* @param params - Required parameters for constructing the collector.
|
|
38
|
+
*/
|
|
39
|
+
constructor(params) {
|
|
40
|
+
var _a;
|
|
41
|
+
super({ factory: params.factory });
|
|
42
|
+
this._converters = params.converters;
|
|
43
|
+
this.converting = new collectorConverter_1.CollectorConverter({ collector: this, converters: params.converters });
|
|
44
|
+
for (const entry of (_a = params.entries) !== null && _a !== void 0 ? _a : []) {
|
|
45
|
+
this.getOrAdd(entry[0], entry[1]).orThrow();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates a new {@link Collections.ConvertingCollector | ConvertingCollector} instance from
|
|
50
|
+
* the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
|
|
51
|
+
* @param params - Required parameters for constructing the collector.
|
|
52
|
+
* @returns {@link Success} with the new collector if successful, {@link Failure} otherwise.
|
|
53
|
+
*/
|
|
54
|
+
static createConvertingCollector(params) {
|
|
55
|
+
return (0, base_1.captureResult)(() => new ConvertingCollector(params));
|
|
56
|
+
}
|
|
57
|
+
getOrAdd(key, itemOrCb) {
|
|
58
|
+
if (this._isFactoryCB(itemOrCb)) {
|
|
59
|
+
return this.converting.converters.convertKey(key).onSuccess((k) => {
|
|
60
|
+
return super.getOrAdd(k, itemOrCb);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return this.converting.converters.convertEntry([key, itemOrCb]).onSuccess(([k, v]) => {
|
|
64
|
+
return super.getOrAdd(k, v);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Gets a read-only version of this collector as a
|
|
69
|
+
* {@link Collections.IReadOnlyConvertingResultMap | read-only map}.
|
|
70
|
+
* @returns
|
|
71
|
+
*/
|
|
72
|
+
toReadOnly() {
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.ConvertingCollector = ConvertingCollector;
|
|
77
|
+
//# sourceMappingURL=convertingCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertingCollector.js","sourceRoot":"","sources":["../../../src/packlets/collections/convertingCollector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAEH,kCAAgE;AAEhE,2CAAwC;AACxC,6DAA0D;AAgC1D;;;;GAIG;AACH,MAAa,mBAKX,SAAQ,qBAAoC;IAS5C;;;;OAIG;IACH,YAAmB,MAAwE;;QACzF,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,uCAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7F,KAAK,MAAM,KAAK,IAAI,MAAA,MAAM,CAAC,OAAO,mCAAI,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,yBAAyB,CAMrC,MAAwE;QAExE,OAAO,IAAA,oBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IAcM,QAAQ,CACb,GAAS,EACT,QAAgE;QAEhE,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChE,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACnF,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,UAAU;QACf,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA/ED,kDA+EC","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { captureResult, DetailedResult, Result } from '../base';\nimport { CollectibleFactory, CollectibleFactoryCallback, ICollectible } from './collectible';\nimport { Collector } from './collector';\nimport { CollectorConverter } from './collectorConverter';\nimport { KeyValueEntry } from './common';\nimport { IReadOnlyConvertingResultMap } from './convertingResultMap';\nimport { KeyValueConverters } from './keyValueConverters';\nimport { ResultMapResultDetail } from './readonlyResultMap';\n\n/**\n * Parameters for constructing a {@link Collections.ConvertingCollector | ConvertingCollector}.\n * @public\n */\nexport interface IConvertingCollectorConstructorParams<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> {\n /**\n * {@inheritdoc Collections.ICollectorConstructorParams.factory}\n */\n factory: CollectibleFactory<TKEY, TINDEX, TITEM, TSRC>;\n\n /**\n * {@inheritdoc Collections.ICollectorConverterCreateParams.converters}\n */\n converters: KeyValueConverters<TKEY, TSRC>;\n\n /**\n * {@inheritdoc Collections.ICollectorConstructorParams.entries}\n */\n entries?: KeyValueEntry<TKEY, TSRC>[];\n}\n\n/**\n * A {@link Collections.Collector | Collector} with a {@link Collections.CollectorConverter | CollectorConverter}\n * property that enables validated use of the underlying map with weakly-typed keys and values.\n * @public\n */\nexport class ConvertingCollector<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n> extends Collector<TKEY, TINDEX, TITEM, TSRC> {\n /**\n * A {@link Collections.CollectorConverter | CollectorConverter} which validates keys and values\n * before inserting them into this collector.\n */\n public readonly converting: CollectorConverter<TKEY, TINDEX, TITEM, TSRC>;\n\n protected readonly _converters: KeyValueConverters<TKEY, TSRC>;\n\n /**\n * Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}\n * from the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.\n * @param params - Required parameters for constructing the collector.\n */\n public constructor(params: IConvertingCollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>) {\n super({ factory: params.factory });\n this._converters = params.converters;\n this.converting = new CollectorConverter({ collector: this, converters: params.converters });\n for (const entry of params.entries ?? []) {\n this.getOrAdd(entry[0], entry[1]).orThrow();\n }\n }\n\n /**\n * Creates a new {@link Collections.ConvertingCollector | ConvertingCollector} instance from\n * the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.\n * @param params - Required parameters for constructing the collector.\n * @returns {@link Success} with the new collector if successful, {@link Failure} otherwise.\n */\n public static createConvertingCollector<\n TKEY extends string = string,\n TINDEX extends number = number,\n TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>,\n TSRC = TITEM\n >(\n params: IConvertingCollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>\n ): Result<ConvertingCollector<TKEY, TINDEX, TITEM, TSRC>> {\n return captureResult(() => new ConvertingCollector(params));\n }\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:1)}\n */\n public getOrAdd(key: TKEY, item: TSRC): DetailedResult<TITEM, ResultMapResultDetail>;\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:2)}\n */\n public getOrAdd(\n key: TKEY,\n cb: CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail>;\n public getOrAdd(\n key: TKEY,\n itemOrCb: TSRC | CollectibleFactoryCallback<TKEY, TINDEX, TITEM>\n ): DetailedResult<TITEM, ResultMapResultDetail> {\n if (this._isFactoryCB(itemOrCb)) {\n return this.converting.converters.convertKey(key).onSuccess((k) => {\n return super.getOrAdd(k, itemOrCb);\n });\n }\n return this.converting.converters.convertEntry([key, itemOrCb]).onSuccess(([k, v]) => {\n return super.getOrAdd(k, v);\n });\n }\n\n /**\n * Gets a read-only version of this collector as a\n * {@link Collections.IReadOnlyConvertingResultMap | read-only map}.\n * @returns\n */\n public toReadOnly(): IReadOnlyConvertingResultMap<TKEY, TITEM> {\n return this;\n }\n}\n"]}
|