@fgv/ts-utils 4.3.0 → 4.5.0-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.
Files changed (112) hide show
  1. package/CHANGELOG.json +6 -0
  2. package/CHANGELOG.md +6 -1
  3. package/dist/ts-utils.d.ts +4248 -3531
  4. package/dist/tsdoc-metadata.json +1 -1
  5. package/lib/index.d.ts +3 -2
  6. package/lib/index.d.ts.map +1 -1
  7. package/lib/index.js +7 -3
  8. package/lib/index.js.map +1 -1
  9. package/lib/packlets/base/utils.d.ts.map +1 -1
  10. package/lib/packlets/base/utils.js +0 -1
  11. package/lib/packlets/base/utils.js.map +1 -1
  12. package/lib/packlets/collections/collectible.d.ts +82 -8
  13. package/lib/packlets/collections/collectible.d.ts.map +1 -1
  14. package/lib/packlets/collections/collectible.js +36 -11
  15. package/lib/packlets/collections/collectible.js.map +1 -1
  16. package/lib/packlets/collections/collector.d.ts +78 -79
  17. package/lib/packlets/collections/collector.d.ts.map +1 -1
  18. package/lib/packlets/collections/collector.js +83 -52
  19. package/lib/packlets/collections/collector.js.map +1 -1
  20. package/lib/packlets/collections/collectorValidator.d.ts +89 -0
  21. package/lib/packlets/collections/collectorValidator.d.ts.map +1 -0
  22. package/lib/packlets/collections/collectorValidator.js +98 -0
  23. package/lib/packlets/collections/collectorValidator.js.map +1 -0
  24. package/lib/packlets/collections/convertingCollector.d.ts +77 -36
  25. package/lib/packlets/collections/convertingCollector.d.ts.map +1 -1
  26. package/lib/packlets/collections/convertingCollector.js +71 -26
  27. package/lib/packlets/collections/convertingCollector.js.map +1 -1
  28. package/lib/packlets/collections/convertingCollectorValidator.d.ts +69 -0
  29. package/lib/packlets/collections/convertingCollectorValidator.d.ts.map +1 -0
  30. package/lib/packlets/collections/{collectorConverter.js → convertingCollectorValidator.js} +28 -15
  31. package/lib/packlets/collections/convertingCollectorValidator.js.map +1 -0
  32. package/lib/packlets/collections/index.d.ts +7 -5
  33. package/lib/packlets/collections/index.d.ts.map +1 -1
  34. package/lib/packlets/collections/index.js +7 -5
  35. package/lib/packlets/collections/index.js.map +1 -1
  36. package/lib/packlets/collections/keyValueConverters.d.ts +1 -17
  37. package/lib/packlets/collections/keyValueConverters.d.ts.map +1 -1
  38. package/lib/packlets/collections/keyValueConverters.js +1 -8
  39. package/lib/packlets/collections/keyValueConverters.js.map +1 -1
  40. package/lib/packlets/collections/readonlyResultMap.d.ts +0 -4
  41. package/lib/packlets/collections/readonlyResultMap.d.ts.map +1 -1
  42. package/lib/packlets/collections/readonlyResultMap.js.map +1 -1
  43. package/lib/packlets/collections/resultMap.d.ts +0 -4
  44. package/lib/packlets/collections/resultMap.d.ts.map +1 -1
  45. package/lib/packlets/collections/resultMap.js +0 -6
  46. package/lib/packlets/collections/resultMap.js.map +1 -1
  47. package/lib/packlets/collections/{resultMapConverter.d.ts → resultMapValidator.d.ts} +11 -11
  48. package/lib/packlets/collections/{resultMapConverter.d.ts.map → resultMapValidator.d.ts.map} +1 -1
  49. package/lib/packlets/collections/{resultMapConverter.js → resultMapValidator.js} +6 -6
  50. package/lib/packlets/collections/{resultMapConverter.js.map → resultMapValidator.js.map} +1 -1
  51. package/lib/packlets/collections/validatingCollector.d.ts +69 -0
  52. package/lib/packlets/collections/validatingCollector.d.ts.map +1 -0
  53. package/lib/packlets/collections/validatingCollector.js +67 -0
  54. package/lib/packlets/collections/validatingCollector.js.map +1 -0
  55. package/lib/packlets/collections/validatingConvertingCollector.d.ts +59 -0
  56. package/lib/packlets/collections/validatingConvertingCollector.d.ts.map +1 -0
  57. package/lib/packlets/collections/validatingConvertingCollector.js +68 -0
  58. package/lib/packlets/collections/validatingConvertingCollector.js.map +1 -0
  59. package/lib/packlets/collections/validatingResultMap.d.ts +53 -0
  60. package/lib/packlets/collections/validatingResultMap.d.ts.map +1 -0
  61. package/lib/packlets/collections/validatingResultMap.js +61 -0
  62. package/lib/packlets/collections/validatingResultMap.js.map +1 -0
  63. package/lib/packlets/file-tree/directoryItem.d.ts +47 -0
  64. package/lib/packlets/file-tree/directoryItem.d.ts.map +1 -0
  65. package/lib/packlets/file-tree/directoryItem.js +71 -0
  66. package/lib/packlets/file-tree/directoryItem.js.map +1 -0
  67. package/lib/packlets/file-tree/fileItem.d.ts +64 -0
  68. package/lib/packlets/file-tree/fileItem.d.ts.map +1 -0
  69. package/lib/packlets/file-tree/fileItem.js +93 -0
  70. package/lib/packlets/file-tree/fileItem.js.map +1 -0
  71. package/lib/packlets/file-tree/fileTree.d.ts +84 -0
  72. package/lib/packlets/file-tree/fileTree.d.ts.map +1 -0
  73. package/lib/packlets/file-tree/fileTree.js +135 -0
  74. package/lib/packlets/file-tree/fileTree.js.map +1 -0
  75. package/lib/packlets/file-tree/fileTreeAccessors.d.ts +134 -0
  76. package/lib/packlets/file-tree/fileTreeAccessors.d.ts.map +1 -0
  77. package/lib/packlets/file-tree/fileTreeAccessors.js +24 -0
  78. package/lib/packlets/file-tree/fileTreeAccessors.js.map +1 -0
  79. package/lib/packlets/file-tree/fsTree.d.ts +45 -0
  80. package/lib/packlets/file-tree/fsTree.d.ts.map +1 -0
  81. package/lib/packlets/file-tree/fsTree.js +116 -0
  82. package/lib/packlets/file-tree/fsTree.js.map +1 -0
  83. package/lib/packlets/file-tree/in-memory/inMemoryTree.d.ts +67 -0
  84. package/lib/packlets/file-tree/in-memory/inMemoryTree.d.ts.map +1 -0
  85. package/lib/packlets/file-tree/in-memory/inMemoryTree.js +150 -0
  86. package/lib/packlets/file-tree/in-memory/inMemoryTree.js.map +1 -0
  87. package/lib/packlets/file-tree/in-memory/index.d.ts +2 -0
  88. package/lib/packlets/file-tree/in-memory/index.d.ts.map +1 -0
  89. package/lib/packlets/file-tree/in-memory/index.js +39 -0
  90. package/lib/packlets/file-tree/in-memory/index.js.map +1 -0
  91. package/lib/packlets/file-tree/in-memory/treeBuilder.d.ts +106 -0
  92. package/lib/packlets/file-tree/in-memory/treeBuilder.d.ts.map +1 -0
  93. package/lib/packlets/file-tree/in-memory/treeBuilder.js +170 -0
  94. package/lib/packlets/file-tree/in-memory/treeBuilder.js.map +1 -0
  95. package/lib/packlets/file-tree/index.d.ts +8 -0
  96. package/lib/packlets/file-tree/index.d.ts.map +1 -0
  97. package/lib/packlets/file-tree/index.js +46 -0
  98. package/lib/packlets/file-tree/index.js.map +1 -0
  99. package/lib/packlets/hash/crcNormalizer.js +1 -1
  100. package/lib/packlets/hash/crcNormalizer.js.map +1 -1
  101. package/package.json +15 -15
  102. package/lib/packlets/collections/collectorConverter.d.ts +0 -59
  103. package/lib/packlets/collections/collectorConverter.d.ts.map +0 -1
  104. package/lib/packlets/collections/collectorConverter.js.map +0 -1
  105. package/lib/packlets/collections/collectors.d.ts +0 -32
  106. package/lib/packlets/collections/collectors.d.ts.map +0 -1
  107. package/lib/packlets/collections/collectors.js +0 -57
  108. package/lib/packlets/collections/collectors.js.map +0 -1
  109. package/lib/packlets/collections/convertingResultMap.d.ts +0 -73
  110. package/lib/packlets/collections/convertingResultMap.d.ts.map +0 -1
  111. package/lib/packlets/collections/convertingResultMap.js +0 -102
  112. package/lib/packlets/collections/convertingResultMap.js.map +0 -1
@@ -0,0 +1,98 @@
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.CollectorValidator = 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 CollectorValidator {
31
+ get map() {
32
+ return this._collector.toReadOnly();
33
+ }
34
+ /**
35
+ * Constructs a new {@link Collections.ConvertingCollectorValidator | ConvertingCollectorValidator}.
36
+ * @param params - Required parameters for constructing the collector validator.
37
+ */
38
+ constructor(params) {
39
+ this._collector = params.collector;
40
+ this.converters = params.converters;
41
+ }
42
+ /**
43
+ * {@inheritdoc Collections.Collector.add}
44
+ */
45
+ add(item) {
46
+ return this._convertValue(item).onSuccess((i) => {
47
+ return this._collector.add(i);
48
+ });
49
+ }
50
+ /**
51
+ * {@inheritdoc Collections.Collector.get}
52
+ */
53
+ get(key) {
54
+ return this.converters.convertKey(key).onSuccess((k) => {
55
+ return this._collector.get(k);
56
+ });
57
+ }
58
+ getOrAdd(keyOrItem, factoryCb) {
59
+ if (factoryCb === undefined) {
60
+ return this._convertValue(keyOrItem).onSuccess((item) => this._collector.getOrAdd(item));
61
+ }
62
+ else {
63
+ return this.converters
64
+ .convertKey(keyOrItem)
65
+ .withDetail('invalid-key', 'success')
66
+ .onSuccess((key) => this._collector.getOrAdd(key, factoryCb));
67
+ }
68
+ }
69
+ /**
70
+ * {@inheritdoc Collections.ResultMap.has}
71
+ */
72
+ has(key) {
73
+ return this._collector.has(key);
74
+ }
75
+ /**
76
+ * {@inheritdoc Collections.Collector.toReadOnly}
77
+ */
78
+ toReadOnly() {
79
+ return this;
80
+ }
81
+ /**
82
+ * Helper to convert a value, returning a {@link DetailedResult | DetailedResult}
83
+ * and formatting the error message.
84
+ * @param value - The value to convert.
85
+ * @returns {@link DetailedSuccess | DetailedSuccess} with the converted value
86
+ * and detail `success` if conversion is successful, or
87
+ * {@link DetailedFailure | DetailedFailure} with the error message and detail `invalid-value`
88
+ * if conversion fails.
89
+ */
90
+ _convertValue(value) {
91
+ return this.converters
92
+ .convertValue(value)
93
+ .withErrorFormat((message) => `invalid item: ${message}`)
94
+ .withDetail('invalid-value', 'success');
95
+ }
96
+ }
97
+ exports.CollectorValidator = CollectorValidator;
98
+ //# sourceMappingURL=collectorValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectorValidator.js","sourceRoot":"","sources":["../../../src/packlets/collections/collectorValidator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAuDH;;;;GAIG;AACH,MAAa,kBAAkB;IAO7B,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IACtC,CAAC;IAID;;;OAGG;IACH,YAAmB,MAA8C;QAC/D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,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;IAgBM,QAAQ,CACb,SAA2B,EAC3B,SAA+D;QAE/D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,UAAU;iBACnB,UAAU,CAAC,SAAS,CAAC;iBACrB,UAAU,CAAwB,aAAa,EAAE,SAAS,CAAC;iBAC3D,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAA4B,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACI,UAAU;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACO,aAAa,CAAC,KAAc;QACpC,OAAO,IAAI,CAAC,UAAU;aACnB,YAAY,CAAC,KAAK,CAAC;aACnB,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,OAAO,EAAE,CAAC;aACxD,UAAU,CAAwB,eAAe,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;CACF;AAjGD,gDAiGC","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 { Collector, CollectorResultDetail } from './collector';\nimport { IReadOnlyResultMapValidator } from './resultMapValidator';\nimport { CollectibleKey, ICollectible } from './collectible';\n\n/**\n * A read-only interface exposing non-mutating methods of a\n * {@link Collections.CollectorValidator | CollectorValidator}.\n * @public\n */\nexport interface IReadOnlyCollectorValidator<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TITEM extends ICollectible<any, any>\n> extends IReadOnlyResultMapValidator<CollectibleKey<TITEM>, TITEM> {\n /**\n * {@inheritdoc Collections.ConvertingCollectorValidator.map}\n */\n readonly map: IReadOnlyResultMap<CollectibleKey<TITEM>, TITEM>;\n\n /**\n * {@inheritdoc Collections.Collector.get}\n */\n get(key: string): DetailedResult<TITEM, ResultMapResultDetail>;\n\n /**\n * {@inheritdoc Collections.ResultMap.has}\n */\n has(key: string): boolean;\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:2)}\n */\n getOrAdd(\n key: string,\n factory: ResultMapValueFactory<CollectibleKey<TITEM>, TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail>;\n}\n\n/**\n * Parameters for constructing a {@link Collections.CollectorValidator | CollectorValidator}.\n * @public\n */\nexport interface ICollectorValidatorCreateParams<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TITEM extends ICollectible<any, any>\n> {\n readonly collector: Collector<TITEM>;\n readonly converters: KeyValueConverters<CollectibleKey<TITEM>, TITEM>;\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 CollectorValidator<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TITEM extends ICollectible<any, any>\n> implements IReadOnlyCollectorValidator<TITEM>\n{\n public readonly converters: KeyValueConverters<CollectibleKey<TITEM>, TITEM>;\n\n public get map(): IReadOnlyResultMap<CollectibleKey<TITEM>, TITEM> {\n return this._collector.toReadOnly();\n }\n\n protected _collector: Collector<TITEM>;\n\n /**\n * Constructs a new {@link Collections.ConvertingCollectorValidator | ConvertingCollectorValidator}.\n * @param params - Required parameters for constructing the collector validator.\n */\n public constructor(params: ICollectorValidatorCreateParams<TITEM>) {\n this._collector = params.collector;\n this.converters = params.converters;\n }\n\n /**\n * {@inheritdoc Collections.Collector.add}\n */\n public add(item: unknown): DetailedResult<TITEM, CollectorResultDetail> {\n return this._convertValue(item).onSuccess((i) => {\n return this._collector.add(i);\n });\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:2)}\n */\n public getOrAdd(\n key: string,\n factory: ResultMapValueFactory<CollectibleKey<TITEM>, TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail>;\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:1)}\n * @param item - The item to add to the collector.\n */\n public getOrAdd(item: unknown): DetailedResult<TITEM, CollectorResultDetail>;\n\n public getOrAdd(\n keyOrItem: string | unknown,\n factoryCb?: ResultMapValueFactory<CollectibleKey<TITEM>, TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail> {\n if (factoryCb === undefined) {\n return this._convertValue(keyOrItem).onSuccess((item) => this._collector.getOrAdd(item));\n } else {\n return this.converters\n .convertKey(keyOrItem)\n .withDetail<CollectorResultDetail>('invalid-key', 'success')\n .onSuccess((key) => this._collector.getOrAdd(key, factoryCb));\n }\n }\n\n /**\n * {@inheritdoc Collections.ResultMap.has}\n */\n public has(key: string): boolean {\n return this._collector.has(key as CollectibleKey<TITEM>);\n }\n\n /**\n * {@inheritdoc Collections.Collector.toReadOnly}\n */\n public toReadOnly(): IReadOnlyCollectorValidator<TITEM> {\n return this;\n }\n\n /**\n * Helper to convert a value, returning a {@link DetailedResult | DetailedResult}\n * and formatting the error message.\n * @param value - The value to convert.\n * @returns {@link DetailedSuccess | DetailedSuccess} with the converted value\n * and detail `success` if conversion is successful, or\n * {@link DetailedFailure | DetailedFailure} with the error message and detail `invalid-value`\n * if conversion fails.\n */\n protected _convertValue(value: unknown): DetailedResult<TITEM, CollectorResultDetail> {\n return this.converters\n .convertValue(value)\n .withErrorFormat((message) => `invalid item: ${message}`)\n .withDetail<CollectorResultDetail>('invalid-value', 'success');\n }\n}\n"]}
@@ -1,67 +1,108 @@
1
1
  import { DetailedResult, Result } from '../base';
2
- import { CollectibleFactory, CollectibleFactoryCallback, ICollectible } from './collectible';
3
- import { Collector } from './collector';
4
- import { CollectorConverter } from './collectorConverter';
2
+ import { ICollectible, CollectibleFactoryCallback, CollectibleFactory, CollectibleKey } from './collectible';
3
+ import { Collector, CollectorResultDetail } from './collector';
5
4
  import { KeyValueEntry } from './common';
6
- import { IReadOnlyConvertingResultMap } from './convertingResultMap';
7
- import { KeyValueConverters } from './keyValueConverters';
8
- import { ResultMapResultDetail } from './readonlyResultMap';
9
5
  /**
10
6
  * Parameters for constructing a {@link Collections.ConvertingCollector | ConvertingCollector}.
11
7
  * @public
12
8
  */
13
- export interface IConvertingCollectorConstructorParams<TKEY extends string = string, TINDEX extends number = number, TITEM extends ICollectible<TKEY, TINDEX> = ICollectible<TKEY, TINDEX>, TSRC = TITEM> {
9
+ export interface IConvertingCollectorConstructorParams<TITEM extends ICollectible<any, any>, TSRC = TITEM> {
14
10
  /**
15
- * {@inheritdoc Collections.ICollectorConstructorParams.factory}
11
+ * The default {@link Collections.CollectibleFactory | factory} to create items.
16
12
  */
17
- factory: CollectibleFactory<TKEY, TINDEX, TITEM, TSRC>;
13
+ factory: CollectibleFactory<TITEM, TSRC>;
18
14
  /**
19
- * {@inheritdoc Collections.ICollectorConverterCreateParams.converters}
15
+ * An optional array of entries to add to the collector.
20
16
  */
21
- converters: KeyValueConverters<TKEY, TSRC>;
22
- /**
23
- * {@inheritdoc Collections.ICollectorConstructorParams.entries}
24
- */
25
- entries?: KeyValueEntry<TKEY, TSRC>[];
17
+ entries?: KeyValueEntry<CollectibleKey<TITEM>, TSRC>[];
26
18
  }
27
19
  /**
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.
20
+ * A {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible} items,
21
+ * optionally converting them from a source representation to the target representation using a factory
22
+ * supplied at default or at the time of collection.
30
23
  * @public
31
24
  */
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> {
25
+ export declare class ConvertingCollector<TITEM extends ICollectible<any, any>, TSRC = TITEM> extends Collector<TITEM> {
26
+ private _factory;
33
27
  /**
34
- * A {@link Collections.CollectorConverter | CollectorConverter} which validates keys and values
35
- * before inserting them into this collector.
28
+ * Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}.
29
+ * @param params - Parameters for constructing the collector.
36
30
  */
37
- readonly converting: CollectorConverter<TKEY, TINDEX, TITEM, TSRC>;
38
- protected readonly _converters: KeyValueConverters<TKEY, TSRC>;
31
+ constructor(params: IConvertingCollectorConstructorParams<TITEM, TSRC>);
39
32
  /**
40
- * Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}
41
- * from the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
33
+ * Creates a new {@link Collections.ConvertingCollector | ConvertingCollector}.
42
34
  * @param params - Required parameters for constructing the collector.
35
+ * @returns Returns {@link Success | Success} with the new collector if it is created, or {@link Failure | Failure}
36
+ * with an error if the collector cannot be created.
43
37
  */
44
- constructor(params: IConvertingCollectorConstructorParams<TKEY, TINDEX, TITEM, TSRC>);
38
+ static createConvertingCollector<TITEM extends ICollectible<any, any>, TSRC = TITEM>(params: IConvertingCollectorConstructorParams<TITEM, TSRC>): Result<ConvertingCollector<TITEM, TSRC>>;
45
39
  /**
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.
40
+ * {@inheritdoc Collections.Collector.add}
41
+ */
42
+ add(item: TITEM): DetailedResult<TITEM, CollectorResultDetail>;
43
+ /**
44
+ * Adds an item to the collector using the default {@link Collections.CollectibleFactory | factory}
45
+ * at a specified key, failing if an item with that key already exists.
46
+ * @param key - The key of the item to add.
47
+ * @param item - The source representation of the item to be added.
48
+ * @returns Returns {@link Success | Success} with the item if it is added, or {@link Failure | Failure} with
49
+ * an error if the item cannot be created and indexed.
50
+ * @public
51
+ */
52
+ add(key: CollectibleKey<TITEM>, item: TSRC): DetailedResult<TITEM, CollectorResultDetail>;
53
+ /**
54
+ * Adds an item to the collector using a supplied {@link Collections.CollectibleFactoryCallback | factory callback}
55
+ * at a specified key, failing if an item with that key already exists or if the created item is invalid.
56
+ * @param key - The key of the item to add.
57
+ * @param callback - The factory callback to create the item.
58
+ * @returns Returns {@link Success | Success} with the item if it is added, or {@link Failure | Failure} with
59
+ * an error if the item cannot be created and indexed.
50
60
  */
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>>;
61
+ add(key: CollectibleKey<TITEM>, cb: CollectibleFactoryCallback<TITEM>): DetailedResult<TITEM, CollectorResultDetail>;
52
62
  /**
53
63
  * {@inheritdoc Collections.Collector.(getOrAdd:1)}
54
64
  */
55
- getOrAdd(key: TKEY, item: TSRC): DetailedResult<TITEM, ResultMapResultDetail>;
65
+ getOrAdd(item: TITEM): DetailedResult<TITEM, CollectorResultDetail>;
56
66
  /**
57
67
  * {@inheritdoc Collections.Collector.(getOrAdd:2)}
58
68
  */
59
- getOrAdd(key: TKEY, cb: CollectibleFactoryCallback<TKEY, TINDEX, TITEM>): DetailedResult<TITEM, ResultMapResultDetail>;
69
+ getOrAdd(key: CollectibleKey<TITEM>, callback: CollectibleFactoryCallback<TITEM>): DetailedResult<TITEM, CollectorResultDetail>;
70
+ /**
71
+ * 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.
72
+ * @param key - The key of the item to retrieve.
73
+ * @param item - The source representation of the item to be added if it does not exist.
74
+ * @returns Returns {@link Success | Success} with the item if it exists or could be created, or {@link Failure | Failure} with an error if the
75
+ * item cannot be created and indexed.
76
+ */
77
+ getOrAdd(key: CollectibleKey<TITEM>, item: TSRC): DetailedResult<TITEM, CollectorResultDetail>;
78
+ /**
79
+ * Helper method for derived classes to determine if a supplied
80
+ * itemOrCb parameter is a factory callback.
81
+ * @param itemOrCb - Overloaded parameter is either `CollectibleKey<TITEM>` or
82
+ * a {@link Collections.CollectibleFactoryCallback | factory callback}.
83
+ * @returns Returns `true` if the parameter is a factory callback, `false` otherwise.
84
+ * @public
85
+ */
86
+ protected _isFactoryCB(itemOrCb: TSRC | CollectibleFactoryCallback<TITEM>): itemOrCb is CollectibleFactoryCallback<TITEM>;
87
+ /**
88
+ * Helper method for derived classes to determine if a supplied
89
+ * keyOrItem parameter is an item.
90
+ * @param keyOrItem - Overloaded parameter is either `CollectibleKey<TITEM>` or `TITEM`.
91
+ * @param itemOrCb - Overloaded parameter is either `TSRC`, a {@link Collections.CollectibleFactoryCallback | factory callback}
92
+ * or `undefined`.
93
+ * @returns Returns `true` if the parameter is an item, `false` otherwise.
94
+ * @public
95
+ */
96
+ protected _overloadIsItem(keyOrItem: CollectibleKey<TITEM> | TITEM, itemOrCb?: TSRC | CollectibleFactoryCallback<TITEM>): keyOrItem is TITEM;
60
97
  /**
61
- * Gets a read-only version of this collector as a
62
- * {@link Collections.IReadOnlyConvertingResultMap | read-only map}.
63
- * @returns
98
+ * Helper method for derived classes to build an item from a key and a source representation using
99
+ * a default or supplied factory.
100
+ * @param key - The key of the item to build.
101
+ * @param itemOrCb - The source representation of the item to build, or a factory callback to create it.
102
+ * @returns Returns {@link Success | Success} with the item if it is built, or {@link Failure | Failure}
103
+ * with an error if the item cannot be built.
104
+ * @public
64
105
  */
65
- toReadOnly(): IReadOnlyConvertingResultMap<TKEY, TITEM>;
106
+ protected _buildItem(key: CollectibleKey<TITEM>, itemOrCb: TSRC | CollectibleFactoryCallback<TITEM>): Result<TITEM>;
66
107
  }
67
108
  //# sourceMappingURL=convertingCollector.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"convertingCollector.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/convertingCollector.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiB,cAAc,EAAkB,MAAM,EAAqB,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,MAAM,WAAW,qCAAqC,CAEpD,KAAK,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EACpC,IAAI,GAAG,KAAK;IAEZ;;OAEG;IACH,OAAO,EAAE,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC;;OAEG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;CACxD;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB,CAE9B,KAAK,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EACpC,IAAI,GAAG,KAAK,CACZ,SAAQ,SAAS,CAAC,KAAK,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAkC;IAElD;;;OAGG;gBACgB,MAAM,EAAE,qCAAqC,CAAC,KAAK,EAAE,IAAI,CAAC;IAQ7E;;;;;OAKG;WAEW,yBAAyB,CAAC,KAAK,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EACxF,MAAM,EAAE,qCAAqC,CAAC,KAAK,EAAE,IAAI,CAAC,GACzD,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAI3C;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAErE;;;;;;;;OAQG;IACI,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAEhG;;;;;;;OAOG;IACI,GAAG,CACR,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,EAC1B,EAAE,EAAE,0BAA0B,CAAC,KAAK,CAAC,GACpC,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAgB/C;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAE1E;;OAEG;IACI,QAAQ,CACb,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,EAC1B,QAAQ,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC1C,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAE/C;;;;;;OAMG;IACI,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IA8BrG;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,IAAI,GAAG,0BAA0B,CAAC,KAAK,CAAC,GACjD,QAAQ,IAAI,0BAA0B,CAAC,KAAK,CAAC;IAIhD;;;;;;;;OAQG;IACH,SAAS,CAAC,eAAe,CACvB,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,EACxC,QAAQ,CAAC,EAAE,IAAI,GAAG,0BAA0B,CAAC,KAAK,CAAC,GAClD,SAAS,IAAI,KAAK;IAIrB;;;;;;;;OAQG;IACH,SAAS,CAAC,UAAU,CAClB,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,EAC1B,QAAQ,EAAE,IAAI,GAAG,0BAA0B,CAAC,KAAK,CAAC,GACjD,MAAM,CAAC,KAAK,CAAC;CAGjB"}
@@ -24,53 +24,98 @@ Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.ConvertingCollector = void 0;
25
25
  const base_1 = require("../base");
26
26
  const collector_1 = require("./collector");
27
- const collectorConverter_1 = require("./collectorConverter");
28
27
  /**
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.
28
+ * A {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible} items,
29
+ * optionally converting them from a source representation to the target representation using a factory
30
+ * supplied at default or at the time of collection.
31
31
  * @public
32
32
  */
33
33
  class ConvertingCollector extends collector_1.Collector {
34
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.
35
+ * Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}.
36
+ * @param params - Parameters for constructing the collector.
38
37
  */
39
38
  constructor(params) {
40
39
  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 : []) {
40
+ super();
41
+ this._factory = params.factory;
42
+ (_a = params.entries) === null || _a === void 0 ? void 0 : _a.forEach((entry) => {
45
43
  this.getOrAdd(entry[0], entry[1]).orThrow();
46
- }
44
+ });
47
45
  }
48
46
  /**
49
- * Creates a new {@link Collections.ConvertingCollector | ConvertingCollector} instance from
50
- * the supplied {@link Collections.IConvertingCollectorConstructorParams | parameters}.
47
+ * Creates a new {@link Collections.ConvertingCollector | ConvertingCollector}.
51
48
  * @param params - Required parameters for constructing the collector.
52
- * @returns {@link Success} with the new collector if successful, {@link Failure} otherwise.
49
+ * @returns Returns {@link Success | Success} with the new collector if it is created, or {@link Failure | Failure}
50
+ * with an error if the collector cannot be created.
53
51
  */
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
53
  static createConvertingCollector(params) {
55
54
  return (0, base_1.captureResult)(() => new ConvertingCollector(params));
56
55
  }
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
- });
56
+ add(keyOrItem, itemOrCb) {
57
+ if (this._overloadIsItem(keyOrItem, itemOrCb)) {
58
+ return super.add(keyOrItem);
59
+ }
60
+ return this._buildItem(keyOrItem, itemOrCb)
61
+ .withFailureDetail('invalid-value')
62
+ .onSuccess((item) => {
63
+ return super.add(item);
64
+ });
65
+ }
66
+ getOrAdd(keyOrItem, itemOrCb) {
67
+ if (this._overloadIsItem(keyOrItem, itemOrCb)) {
68
+ return super.getOrAdd(keyOrItem);
69
+ }
70
+ if (this.has(keyOrItem)) {
71
+ return this.get(keyOrItem);
62
72
  }
63
- return this.converting.converters.convertEntry([key, itemOrCb]).onSuccess(([k, v]) => {
64
- return super.getOrAdd(k, v);
73
+ return this._buildItem(keyOrItem, itemOrCb)
74
+ .withFailureDetail('invalid-value')
75
+ .onSuccess((item) => {
76
+ if (item.key !== keyOrItem) {
77
+ return (0, base_1.failWithDetail)(`${keyOrItem}: key mismatch - item has unexpected key ${item.key}`, 'invalid-key');
78
+ }
79
+ return (0, base_1.succeedWithDetail)(item, 'success');
80
+ })
81
+ .onSuccess((item) => {
82
+ return super.add(item);
65
83
  });
66
84
  }
67
85
  /**
68
- * Gets a read-only version of this collector as a
69
- * {@link Collections.IReadOnlyConvertingResultMap | read-only map}.
70
- * @returns
86
+ * Helper method for derived classes to determine if a supplied
87
+ * itemOrCb parameter is a factory callback.
88
+ * @param itemOrCb - Overloaded parameter is either `CollectibleKey<TITEM>` or
89
+ * a {@link Collections.CollectibleFactoryCallback | factory callback}.
90
+ * @returns Returns `true` if the parameter is a factory callback, `false` otherwise.
91
+ * @public
92
+ */
93
+ _isFactoryCB(itemOrCb) {
94
+ return typeof itemOrCb === 'function';
95
+ }
96
+ /**
97
+ * Helper method for derived classes to determine if a supplied
98
+ * keyOrItem parameter is an item.
99
+ * @param keyOrItem - Overloaded parameter is either `CollectibleKey<TITEM>` or `TITEM`.
100
+ * @param itemOrCb - Overloaded parameter is either `TSRC`, a {@link Collections.CollectibleFactoryCallback | factory callback}
101
+ * or `undefined`.
102
+ * @returns Returns `true` if the parameter is an item, `false` otherwise.
103
+ * @public
104
+ */
105
+ _overloadIsItem(keyOrItem, itemOrCb) {
106
+ return itemOrCb === undefined;
107
+ }
108
+ /**
109
+ * Helper method for derived classes to build an item from a key and a source representation using
110
+ * a default or supplied factory.
111
+ * @param key - The key of the item to build.
112
+ * @param itemOrCb - The source representation of the item to build, or a factory callback to create it.
113
+ * @returns Returns {@link Success | Success} with the item if it is built, or {@link Failure | Failure}
114
+ * with an error if the item cannot be built.
115
+ * @public
71
116
  */
72
- toReadOnly() {
73
- return this;
117
+ _buildItem(key, itemOrCb) {
118
+ return this._isFactoryCB(itemOrCb) ? itemOrCb(key, this.size) : this._factory(key, this.size, itemOrCb);
74
119
  }
75
120
  }
76
121
  exports.ConvertingCollector = ConvertingCollector;
@@ -1 +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"]}
1
+ {"version":3,"file":"convertingCollector.js","sourceRoot":"","sources":["../../../src/packlets/collections/convertingCollector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAEH,kCAAmG;AAEnG,2CAA+D;AAsB/D;;;;;GAKG;AACH,MAAa,mBAIX,SAAQ,qBAAgB;IAGxB;;;OAGG;IACH,YAAmB,MAA0D;;QAC3E,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAA,MAAM,CAAC,OAAO,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,8DAA8D;IACvD,MAAM,CAAC,yBAAyB,CACrC,MAA0D;QAE1D,OAAO,IAAA,oBAAa,EAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IA+BM,GAAG,CACR,SAAwC,EACxC,QAAmD;QAEnD,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAS,CAAC;aACzC,iBAAiB,CAAwB,eAAe,CAAC;aACzD,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAwBM,QAAQ,CACb,SAAwC,EACxC,QAAmD;QAEnD,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAS,CAAC;aACzC,iBAAiB,CAAwB,eAAe,CAAC;aACzD,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,IAAA,qBAAc,EACnB,GAAG,SAAS,4CAA4C,IAAI,CAAC,GAAG,EAAE,EAClE,aAAa,CACd,CAAC;YACJ,CAAC;YACD,OAAO,IAAA,wBAAiB,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;OAOG;IACO,YAAY,CACpB,QAAkD;QAElD,OAAO,OAAO,QAAQ,KAAK,UAAU,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACO,eAAe,CACvB,SAAwC,EACxC,QAAmD;QAEnD,OAAO,QAAQ,KAAK,SAAS,CAAC;IAChC,CAAC;IAED;;;;;;;;OAQG;IACO,UAAU,CAClB,GAA0B,EAC1B,QAAkD;QAElD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1G,CAAC;CACF;AA1KD,kDA0KC","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, failWithDetail, Result, succeedWithDetail } from '../base';\nimport { ICollectible, CollectibleFactoryCallback, CollectibleFactory, CollectibleKey } from './collectible';\nimport { Collector, CollectorResultDetail } from './collector';\nimport { KeyValueEntry } from './common';\n\n/**\n * Parameters for constructing a {@link Collections.ConvertingCollector | ConvertingCollector}.\n * @public\n */\nexport interface IConvertingCollectorConstructorParams<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TITEM extends ICollectible<any, any>,\n TSRC = TITEM\n> {\n /**\n * The default {@link Collections.CollectibleFactory | factory} to create items.\n */\n factory: CollectibleFactory<TITEM, TSRC>;\n /**\n * An optional array of entries to add to the collector.\n */\n entries?: KeyValueEntry<CollectibleKey<TITEM>, TSRC>[];\n}\n\n/**\n * A {@link Collector | collector} that collects {@link Collections.ICollectible | ICollectible} items,\n * optionally converting them from a source representation to the target representation using a factory\n * supplied at default or at the time of collection.\n * @public\n */\nexport class ConvertingCollector<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TITEM extends ICollectible<any, any>,\n TSRC = TITEM\n> extends Collector<TITEM> {\n private _factory: CollectibleFactory<TITEM, TSRC>;\n\n /**\n * Constructs a new {@link Collections.ConvertingCollector | ConvertingCollector}.\n * @param params - Parameters for constructing the collector.\n */\n public constructor(params: IConvertingCollectorConstructorParams<TITEM, TSRC>) {\n super();\n this._factory = params.factory;\n params.entries?.forEach((entry) => {\n this.getOrAdd(entry[0], entry[1]).orThrow();\n });\n }\n\n /**\n * Creates a new {@link Collections.ConvertingCollector | ConvertingCollector}.\n * @param params - Required parameters for constructing the collector.\n * @returns Returns {@link Success | Success} with the new collector if it is created, or {@link Failure | Failure}\n * with an error if the collector cannot be created.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static createConvertingCollector<TITEM extends ICollectible<any, any>, TSRC = TITEM>(\n params: IConvertingCollectorConstructorParams<TITEM, TSRC>\n ): Result<ConvertingCollector<TITEM, TSRC>> {\n return captureResult(() => new ConvertingCollector(params));\n }\n\n /**\n * {@inheritdoc Collections.Collector.add}\n */\n public add(item: TITEM): DetailedResult<TITEM, CollectorResultDetail>;\n\n /**\n * Adds an item to the collector using the default {@link Collections.CollectibleFactory | factory}\n * at a specified key, failing if an item with that key already exists.\n * @param key - The key of the item to add.\n * @param item - The source representation of the item to be added.\n * @returns Returns {@link Success | Success} with the item if it is added, or {@link Failure | Failure} with\n * an error if the item cannot be created and indexed.\n * @public\n */\n public add(key: CollectibleKey<TITEM>, item: TSRC): DetailedResult<TITEM, CollectorResultDetail>;\n\n /**\n * Adds an item to the collector using a supplied {@link Collections.CollectibleFactoryCallback | factory callback}\n * at a specified key, failing if an item with that key already exists or if the created item is invalid.\n * @param key - The key of the item to add.\n * @param callback - The factory callback to create the item.\n * @returns Returns {@link Success | Success} with the item if it is added, or {@link Failure | Failure} with\n * an error if the item cannot be created and indexed.\n */\n public add(\n key: CollectibleKey<TITEM>,\n cb: CollectibleFactoryCallback<TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail>;\n\n public add(\n keyOrItem: CollectibleKey<TITEM> | TITEM,\n itemOrCb?: TSRC | CollectibleFactoryCallback<TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail> {\n if (this._overloadIsItem(keyOrItem, itemOrCb)) {\n return super.add(keyOrItem);\n }\n return this._buildItem(keyOrItem, itemOrCb!)\n .withFailureDetail<CollectorResultDetail>('invalid-value')\n .onSuccess((item) => {\n return super.add(item);\n });\n }\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:1)}\n */\n public getOrAdd(item: TITEM): DetailedResult<TITEM, CollectorResultDetail>;\n\n /**\n * {@inheritdoc Collections.Collector.(getOrAdd:2)}\n */\n public getOrAdd(\n key: CollectibleKey<TITEM>,\n callback: CollectibleFactoryCallback<TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail>;\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 public getOrAdd(key: CollectibleKey<TITEM>, item: TSRC): DetailedResult<TITEM, CollectorResultDetail>;\n\n public getOrAdd(\n keyOrItem: CollectibleKey<TITEM> | TITEM,\n itemOrCb?: TSRC | CollectibleFactoryCallback<TITEM>\n ): DetailedResult<TITEM, CollectorResultDetail> {\n if (this._overloadIsItem(keyOrItem, itemOrCb)) {\n return super.getOrAdd(keyOrItem);\n }\n\n if (this.has(keyOrItem)) {\n return this.get(keyOrItem);\n }\n\n return this._buildItem(keyOrItem, itemOrCb!)\n .withFailureDetail<CollectorResultDetail>('invalid-value')\n .onSuccess((item) => {\n if (item.key !== keyOrItem) {\n return failWithDetail<TITEM, CollectorResultDetail>(\n `${keyOrItem}: key mismatch - item has unexpected key ${item.key}`,\n 'invalid-key'\n );\n }\n return succeedWithDetail(item, 'success');\n })\n .onSuccess((item) => {\n return super.add(item);\n });\n }\n\n /**\n * Helper method for derived classes to determine if a supplied\n * itemOrCb parameter is a factory callback.\n * @param itemOrCb - Overloaded parameter is either `CollectibleKey<TITEM>` or\n * a {@link Collections.CollectibleFactoryCallback | factory callback}.\n * @returns Returns `true` if the parameter is a factory callback, `false` otherwise.\n * @public\n */\n protected _isFactoryCB(\n itemOrCb: TSRC | CollectibleFactoryCallback<TITEM>\n ): itemOrCb is CollectibleFactoryCallback<TITEM> {\n return typeof itemOrCb === 'function';\n }\n\n /**\n * Helper method for derived classes to determine if a supplied\n * keyOrItem parameter is an item.\n * @param keyOrItem - Overloaded parameter is either `CollectibleKey<TITEM>` or `TITEM`.\n * @param itemOrCb - Overloaded parameter is either `TSRC`, a {@link Collections.CollectibleFactoryCallback | factory callback}\n * or `undefined`.\n * @returns Returns `true` if the parameter is an item, `false` otherwise.\n * @public\n */\n protected _overloadIsItem(\n keyOrItem: CollectibleKey<TITEM> | TITEM,\n itemOrCb?: TSRC | CollectibleFactoryCallback<TITEM>\n ): keyOrItem is TITEM {\n return itemOrCb === undefined;\n }\n\n /**\n * Helper method for derived classes to build an item from a key and a source representation using\n * a default or supplied factory.\n * @param key - The key of the item to build.\n * @param itemOrCb - The source representation of the item to build, or a factory callback to create it.\n * @returns Returns {@link Success | Success} with the item if it is built, or {@link Failure | Failure}\n * with an error if the item cannot be built.\n * @public\n */\n protected _buildItem(\n key: CollectibleKey<TITEM>,\n itemOrCb: TSRC | CollectibleFactoryCallback<TITEM>\n ): Result<TITEM> {\n return this._isFactoryCB(itemOrCb) ? itemOrCb(key, this.size) : this._factory(key, this.size, itemOrCb);\n }\n}\n"]}
@@ -0,0 +1,69 @@
1
+ import { DetailedResult } from '../base';
2
+ import { IReadOnlyResultMap, ResultMapResultDetail } from './readonlyResultMap';
3
+ import { ResultMapValueFactory } from './resultMap';
4
+ import { KeyValueConverters } from './keyValueConverters';
5
+ import { CollectibleFactoryCallback, CollectibleKey, ICollectible } from './collectible';
6
+ import { CollectorResultDetail } from './collector';
7
+ import { ConvertingCollector } from './convertingCollector';
8
+ import { IReadOnlyCollectorValidator } from './collectorValidator';
9
+ /**
10
+ * Parameters for constructing a {@link Collections.ConvertingCollectorValidator | ConvertingCollectorValidator}.
11
+ * @public
12
+ */
13
+ export interface IConvertingCollectorValidatorCreateParams<TITEM extends ICollectible<any, any>, TSRC = TITEM> {
14
+ collector: ConvertingCollector<TITEM, TSRC>;
15
+ converters: KeyValueConverters<CollectibleKey<TITEM>, TSRC>;
16
+ }
17
+ /**
18
+ * A {@link Collections.ConvertingCollector | ConvertingCollector} wrapper which validates weakly-typed keys
19
+ * and values before calling the wrapped collector. Unlike the basic {@link Collections.CollectorValidator | CollectorValidator},
20
+ * the converting collector expects the items to be in the source type of the converting collector, not the target type.
21
+ * @public
22
+ */
23
+ export declare class ConvertingCollectorValidator<TITEM extends ICollectible<any, any>, TSRC = TITEM> implements IReadOnlyCollectorValidator<TITEM> {
24
+ readonly converters: KeyValueConverters<CollectibleKey<TITEM>, TSRC>;
25
+ get map(): IReadOnlyResultMap<CollectibleKey<TITEM>, TITEM>;
26
+ protected _collector: ConvertingCollector<TITEM, TSRC>;
27
+ /**
28
+ * Constructs a new {@link Collections.ConvertingCollectorValidator | ConvertingCollectorValidator}.
29
+ * @param params - Required parameters for constructing the collector validator.
30
+ */
31
+ constructor(params: IConvertingCollectorValidatorCreateParams<TITEM, TSRC>);
32
+ /**
33
+ * {@inheritdoc Collections.ConvertingCollector.(add:1)}
34
+ */
35
+ add(key: string, value: unknown): DetailedResult<TITEM, CollectorResultDetail>;
36
+ /**
37
+ * {@inheritdoc Collections.ConvertingCollector.(add:2)}
38
+ */
39
+ add(key: string, factory: ResultMapValueFactory<CollectibleKey<TITEM>, TITEM>): DetailedResult<TITEM, CollectorResultDetail>;
40
+ /**
41
+ * {@inheritdoc Collections.Collector.get}
42
+ */
43
+ get(key: string): DetailedResult<TITEM, ResultMapResultDetail>;
44
+ /**
45
+ * {@inheritdoc Collections.ConvertingCollector.(getOrAdd:3)}
46
+ */
47
+ getOrAdd(key: string, value: unknown): DetailedResult<TITEM, CollectorResultDetail>;
48
+ /**
49
+ * {@inheritdoc Collections.Collector.(getOrAdd:2)}
50
+ */
51
+ getOrAdd(key: string, factory: ResultMapValueFactory<CollectibleKey<TITEM>, TITEM>): DetailedResult<TITEM, CollectorResultDetail>;
52
+ /**
53
+ * {@inheritdoc Collections.ResultMap.has}
54
+ */
55
+ has(key: string): boolean;
56
+ /**
57
+ * {@inheritdoc Collections.Collector.toReadOnly}
58
+ */
59
+ toReadOnly(): IReadOnlyCollectorValidator<TITEM>;
60
+ /**
61
+ * Determines if a value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback}.
62
+ * @param value - The value to check.
63
+ * @returns `true` if the value is a {@link Collections.CollectibleFactoryCallback | CollectibleFactoryCallback},
64
+ * `false` otherwise.
65
+ * @public
66
+ */
67
+ protected _isCollectibleFactoryCallback(value: unknown | CollectibleFactoryCallback<TITEM>): value is CollectibleFactoryCallback<TITEM>;
68
+ }
69
+ //# sourceMappingURL=convertingCollectorValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertingCollectorValidator.d.ts","sourceRoot":"","sources":["../../../src/packlets/collections/convertingCollectorValidator.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,cAAc,EAAkB,MAAM,SAAS,CAAC;AACzD,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,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,yCAAyC,CAExD,KAAK,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EACpC,IAAI,GAAG,KAAK;IAEZ,SAAS,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,UAAU,EAAE,kBAAkB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;CAC7D;AAED;;;;;GAKG;AACH,qBAAa,4BAA4B,CAEvC,KAAK,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EACpC,IAAI,GAAG,KAAK,CACZ,YAAW,2BAA2B,CAAC,KAAK,CAAC;IAE7C,SAAgB,UAAU,EAAE,kBAAkB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAE5E,IAAW,GAAG,IAAI,kBAAkB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAEjE;IAED,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvD;;;OAGG;gBACgB,MAAM,EAAE,yCAAyC,CAAC,KAAK,EAAE,IAAI,CAAC;IAKjF;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAErF;;OAEG;IACI,GAAG,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,qBAAqB,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAC3D,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAW/C;;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,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAC3D,cAAc,CAAC,KAAK,EAAE,qBAAqB,CAAC;IAsB/C;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACI,UAAU,IAAI,2BAA2B,CAAC,KAAK,CAAC;IAIvD;;;;;;OAMG;IACH,SAAS,CAAC,6BAA6B,CACrC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,GACjD,KAAK,IAAI,0BAA0B,CAAC,KAAK,CAAC;CAG9C"}
@@ -21,24 +21,32 @@
21
21
  * SOFTWARE.
22
22
  */
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.CollectorConverter = void 0;
24
+ exports.ConvertingCollectorValidator = void 0;
25
+ const base_1 = require("../base");
25
26
  /**
26
- * A {@link Collections.Collector | Collector} wrapper which validates weakly-typed keys
27
- * and values before calling the wrapped collector.
27
+ * A {@link Collections.ConvertingCollector | ConvertingCollector} wrapper which validates weakly-typed keys
28
+ * and values before calling the wrapped collector. Unlike the basic {@link Collections.CollectorValidator | CollectorValidator},
29
+ * the converting collector expects the items to be in the source type of the converting collector, not the target type.
28
30
  * @public
29
31
  */
30
- class CollectorConverter {
32
+ class ConvertingCollectorValidator {
31
33
  get map() {
32
34
  return this._collector.toReadOnly();
33
35
  }
34
36
  /**
35
- * Constructs a new {@link Collections.CollectorConverter | CollectorConverter}.
36
- * @param params - Required parameters for constructing the collector converter.
37
+ * Constructs a new {@link Collections.ConvertingCollectorValidator | ConvertingCollectorValidator}.
38
+ * @param params - Required parameters for constructing the collector validator.
37
39
  */
38
40
  constructor(params) {
39
41
  this._collector = params.collector;
40
42
  this.converters = params.converters;
41
43
  }
44
+ add(key, valueOrFactory) {
45
+ if (this.has(key)) {
46
+ return (0, base_1.failWithDetail)(`${key}: already exists`, 'exists');
47
+ }
48
+ return this.getOrAdd(key, valueOrFactory);
49
+ }
42
50
  /**
43
51
  * {@inheritdoc Collections.Collector.get}
44
52
  */
@@ -49,18 +57,23 @@ class CollectorConverter {
49
57
  }
50
58
  getOrAdd(key, valueOrFactory) {
51
59
  if (!this._isCollectibleFactoryCallback(valueOrFactory)) {
52
- return this.converters.convertEntry([key, valueOrFactory]).onSuccess(([vk, vs]) => {
53
- return this._collector.getOrAdd(vk, vs);
54
- });
60
+ const converted = this.converters.convertEntry([key, valueOrFactory]);
61
+ if (converted.isFailure()) {
62
+ return (0, base_1.failWithDetail)(converted.message, converted.detail);
63
+ }
64
+ const [vk, vs] = converted.value;
65
+ return this._collector.getOrAdd(vk, vs);
55
66
  }
56
67
  else {
57
- return this.converters.convertKey(key).onSuccess((k) => {
58
- return this._collector.getOrAdd(k, valueOrFactory);
59
- });
68
+ const converted = this.converters.convertKey(key);
69
+ if (converted.isFailure()) {
70
+ return (0, base_1.failWithDetail)(converted.message, converted.detail);
71
+ }
72
+ return this._collector.getOrAdd(converted.value, valueOrFactory);
60
73
  }
61
74
  }
62
75
  /**
63
- * {@inheritdoc Collections.Collector.has}
76
+ * {@inheritdoc Collections.ResultMap.has}
64
77
  */
65
78
  has(key) {
66
79
  return this._collector.has(key);
@@ -82,5 +95,5 @@ class CollectorConverter {
82
95
  return typeof value === 'function';
83
96
  }
84
97
  }
85
- exports.CollectorConverter = CollectorConverter;
86
- //# sourceMappingURL=collectorConverter.js.map
98
+ exports.ConvertingCollectorValidator = ConvertingCollectorValidator;
99
+ //# sourceMappingURL=convertingCollectorValidator.js.map