@monstermann/map 0.1.2 → 0.2.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 (101) hide show
  1. package/README.md +2496 -0
  2. package/dist/Map/clone.d.mts +10 -5
  3. package/dist/Map/clone.mjs +10 -5
  4. package/dist/Map/compact.d.mts +16 -12
  5. package/dist/Map/compact.mjs +12 -5
  6. package/dist/Map/create.d.mts +9 -2
  7. package/dist/Map/create.mjs +9 -2
  8. package/dist/Map/every.d.mts +58 -0
  9. package/dist/Map/every.mjs +55 -0
  10. package/dist/Map/filter.d.mts +25 -16
  11. package/dist/Map/filter.mjs +17 -5
  12. package/dist/Map/find.d.mts +54 -0
  13. package/dist/Map/find.mjs +54 -0
  14. package/dist/Map/findMap.d.mts +67 -0
  15. package/dist/Map/findMap.mjs +71 -0
  16. package/dist/Map/findMapAll.d.mts +67 -0
  17. package/dist/Map/findMapAll.mjs +72 -0
  18. package/dist/Map/findMapOr.d.mts +70 -0
  19. package/dist/Map/findMapOr.mjs +74 -0
  20. package/dist/Map/findMapOrElse.d.mts +70 -0
  21. package/dist/Map/findMapOrElse.mjs +74 -0
  22. package/dist/Map/findMapOrThrow.d.mts +67 -0
  23. package/dist/Map/findMapOrThrow.mjs +71 -0
  24. package/dist/Map/findOr.d.mts +56 -0
  25. package/dist/Map/findOr.mjs +57 -0
  26. package/dist/Map/findOrElse.d.mts +59 -0
  27. package/dist/Map/findOrElse.mjs +60 -0
  28. package/dist/Map/findOrThrow.d.mts +54 -0
  29. package/dist/Map/findOrThrow.mjs +55 -0
  30. package/dist/Map/findRemove.d.mts +54 -0
  31. package/dist/Map/findRemove.mjs +60 -0
  32. package/dist/Map/findRemoveOr.d.mts +56 -0
  33. package/dist/Map/findRemoveOr.mjs +62 -0
  34. package/dist/Map/findRemoveOrElse.d.mts +59 -0
  35. package/dist/Map/findRemoveOrElse.mjs +65 -0
  36. package/dist/Map/findRemoveOrThrow.d.mts +54 -0
  37. package/dist/Map/findRemoveOrThrow.mjs +60 -0
  38. package/dist/Map/findReplace.d.mts +56 -0
  39. package/dist/Map/findReplace.mjs +63 -0
  40. package/dist/Map/findReplaceOr.d.mts +58 -0
  41. package/dist/Map/findReplaceOr.mjs +65 -0
  42. package/dist/Map/findReplaceOrElse.d.mts +62 -0
  43. package/dist/Map/findReplaceOrElse.mjs +69 -0
  44. package/dist/Map/findReplaceOrThrow.d.mts +56 -0
  45. package/dist/Map/findReplaceOrThrow.mjs +63 -0
  46. package/dist/Map/forEach.d.mts +21 -12
  47. package/dist/Map/forEach.mjs +17 -5
  48. package/dist/Map/get.d.mts +15 -7
  49. package/dist/Map/get.mjs +15 -7
  50. package/dist/Map/getOr.d.mts +20 -14
  51. package/dist/Map/getOr.mjs +18 -9
  52. package/dist/Map/getOrElse.d.mts +20 -14
  53. package/dist/Map/getOrElse.mjs +18 -9
  54. package/dist/Map/getOrThrow.d.mts +19 -14
  55. package/dist/Map/getOrThrow.mjs +17 -9
  56. package/dist/Map/has.d.mts +15 -7
  57. package/dist/Map/has.mjs +15 -7
  58. package/dist/Map/hasAll.d.mts +15 -7
  59. package/dist/Map/hasAll.mjs +15 -7
  60. package/dist/Map/hasAny.d.mts +15 -7
  61. package/dist/Map/hasAny.mjs +15 -7
  62. package/dist/Map/hasNone.d.mts +15 -7
  63. package/dist/Map/hasNone.mjs +15 -7
  64. package/dist/Map/index.d.mts +21 -1
  65. package/dist/Map/index.mjs +41 -1
  66. package/dist/Map/is.d.mts +12 -5
  67. package/dist/Map/is.mjs +12 -5
  68. package/dist/Map/isEmpty.d.mts +12 -7
  69. package/dist/Map/isEmpty.mjs +12 -7
  70. package/dist/Map/isShallowEqual.d.mts +19 -11
  71. package/dist/Map/isShallowEqual.mjs +19 -11
  72. package/dist/Map/map.d.mts +25 -14
  73. package/dist/Map/map.mjs +21 -7
  74. package/dist/Map/mapEach.d.mts +21 -12
  75. package/dist/Map/mapEach.mjs +17 -5
  76. package/dist/Map/mapOr.d.mts +25 -14
  77. package/dist/Map/mapOr.mjs +21 -7
  78. package/dist/Map/mapOrElse.d.mts +25 -14
  79. package/dist/Map/mapOrElse.mjs +21 -7
  80. package/dist/Map/mapOrThrow.d.mts +24 -14
  81. package/dist/Map/mapOrThrow.mjs +20 -7
  82. package/dist/Map/none.d.mts +58 -0
  83. package/dist/Map/none.mjs +55 -0
  84. package/dist/Map/reject.d.mts +25 -16
  85. package/dist/Map/reject.mjs +17 -5
  86. package/dist/Map/remove.d.mts +15 -7
  87. package/dist/Map/remove.mjs +15 -7
  88. package/dist/Map/removeAll.d.mts +15 -7
  89. package/dist/Map/removeAll.mjs +15 -7
  90. package/dist/Map/removeOr.d.mts +16 -7
  91. package/dist/Map/removeOr.mjs +16 -7
  92. package/dist/Map/removeOrElse.d.mts +18 -12
  93. package/dist/Map/removeOrElse.mjs +16 -7
  94. package/dist/Map/removeOrThrow.d.mts +15 -7
  95. package/dist/Map/removeOrThrow.mjs +15 -7
  96. package/dist/Map/set.d.mts +16 -7
  97. package/dist/Map/set.mjs +16 -7
  98. package/dist/Map/some.d.mts +52 -0
  99. package/dist/Map/some.mjs +55 -0
  100. package/package.json +2 -2
  101. package/dist/Map/internals/types.d.mts +0 -14
@@ -0,0 +1,65 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findRemoveOrElse.ts
5
+ /**
6
+ * # findRemoveOrElse
7
+ *
8
+ * ```ts
9
+ * function Map.findRemoveOrElse<K, V, O>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * orElse: (target: ReadonlyMap<K, V>) => O,
17
+ * ): ReadonlyMap<K, V> | O
18
+ * ```
19
+ *
20
+ * Finds the first entry in the map that satisfies the provided `predicate` function and removes it, returning a new map without the removed entry, or the result of calling `orElse` with the map if no entry is found.
21
+ *
22
+ * ## Example
23
+ *
24
+ * ```ts [data-first]
25
+ * import { Map } from "@monstermann/map";
26
+ *
27
+ * Map.findRemoveOrElse(
28
+ * new Map([
29
+ * ["a", 1],
30
+ * ["b", 2],
31
+ * ["c", 3],
32
+ * ]),
33
+ * (value) => value > 10,
34
+ * (map) => map.size,
35
+ * ); // 3
36
+ * ```
37
+ *
38
+ * ```ts [data-last]
39
+ * import { Map } from "@monstermann/map";
40
+ *
41
+ * pipe(
42
+ * new Map([
43
+ * ["a", 1],
44
+ * ["b", 2],
45
+ * ["c", 3],
46
+ * ]),
47
+ * Map.findRemoveOrElse(
48
+ * (value) => value > 10,
49
+ * (map) => map.size,
50
+ * ),
51
+ * ); // 3
52
+ * ```
53
+ *
54
+ */
55
+ const findRemoveOrElse = dfdlT((target, predicate, orElse) => {
56
+ for (const [key, value] of target) if (predicate(value, key, target)) {
57
+ const result = cloneMap(target);
58
+ result.delete(key);
59
+ return result;
60
+ }
61
+ return orElse(target);
62
+ }, 3);
63
+
64
+ //#endregion
65
+ export { findRemoveOrElse };
@@ -0,0 +1,54 @@
1
+ //#region src/Map/findRemoveOrThrow.d.ts
2
+ /**
3
+ * # findRemoveOrThrow
4
+ *
5
+ * ```ts
6
+ * function Map.findRemoveOrThrow<K, V>(
7
+ * target: ReadonlyMap<K, V>,
8
+ * predicate: (
9
+ * value: NoInfer<V>,
10
+ * key: NoInfer<K>,
11
+ * target: ReadonlyMap<K, V>,
12
+ * ) => boolean,
13
+ * ): ReadonlyMap<K, V>
14
+ * ```
15
+ *
16
+ * Finds the first entry in the map that satisfies the provided `predicate` function and removes it, returning a new map without the removed entry, or throws an error if no entry is found.
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```ts [data-first]
21
+ * import { Map } from "@monstermann/map";
22
+ *
23
+ * Map.findRemoveOrThrow(
24
+ * new Map([
25
+ * ["a", 1],
26
+ * ["b", 2],
27
+ * ["c", 3],
28
+ * ]),
29
+ * (value) => value > 1,
30
+ * ); // Map(2) { "a" => 1, "c" => 3 }
31
+ * ```
32
+ *
33
+ * ```ts [data-last]
34
+ * import { Map } from "@monstermann/map";
35
+ *
36
+ * pipe(
37
+ * new Map([
38
+ * ["a", 1],
39
+ * ["b", 2],
40
+ * ["c", 3],
41
+ * ]),
42
+ * Map.findRemoveOrThrow((value) => value > 1),
43
+ * ); // Map(2) { "a" => 1, "c" => 3 }
44
+ * ```
45
+ *
46
+ */
47
+ declare const findRemoveOrThrow: {
48
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean): (target: Map<K, V>) => Map<K, V>;
49
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
50
+ <K, V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean): Map<K, V>;
51
+ <K, V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean): ReadonlyMap<K, V>;
52
+ };
53
+ //#endregion
54
+ export { findRemoveOrThrow };
@@ -0,0 +1,60 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findRemoveOrThrow.ts
5
+ /**
6
+ * # findRemoveOrThrow
7
+ *
8
+ * ```ts
9
+ * function Map.findRemoveOrThrow<K, V>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * ): ReadonlyMap<K, V>
17
+ * ```
18
+ *
19
+ * Finds the first entry in the map that satisfies the provided `predicate` function and removes it, returning a new map without the removed entry, or throws an error if no entry is found.
20
+ *
21
+ * ## Example
22
+ *
23
+ * ```ts [data-first]
24
+ * import { Map } from "@monstermann/map";
25
+ *
26
+ * Map.findRemoveOrThrow(
27
+ * new Map([
28
+ * ["a", 1],
29
+ * ["b", 2],
30
+ * ["c", 3],
31
+ * ]),
32
+ * (value) => value > 1,
33
+ * ); // Map(2) { "a" => 1, "c" => 3 }
34
+ * ```
35
+ *
36
+ * ```ts [data-last]
37
+ * import { Map } from "@monstermann/map";
38
+ *
39
+ * pipe(
40
+ * new Map([
41
+ * ["a", 1],
42
+ * ["b", 2],
43
+ * ["c", 3],
44
+ * ]),
45
+ * Map.findRemoveOrThrow((value) => value > 1),
46
+ * ); // Map(2) { "a" => 1, "c" => 3 }
47
+ * ```
48
+ *
49
+ */
50
+ const findRemoveOrThrow = dfdlT((target, predicate) => {
51
+ for (const [key, value] of target) if (predicate(value, key, target)) {
52
+ const result = cloneMap(target);
53
+ result.delete(key);
54
+ return result;
55
+ }
56
+ throw new Error("Map.findRemoveOrThrow: Value not found.");
57
+ }, 2);
58
+
59
+ //#endregion
60
+ export { findRemoveOrThrow };
@@ -0,0 +1,56 @@
1
+ //#region src/Map/findReplace.d.ts
2
+ /**
3
+ * # findReplace
4
+ *
5
+ * ```ts
6
+ * function Map.findReplace<K, V>(
7
+ * target: ReadonlyMap<K, V>,
8
+ * predicate: (
9
+ * value: NoInfer<V>,
10
+ * key: NoInfer<K>,
11
+ * target: ReadonlyMap<K, V>,
12
+ * ) => boolean,
13
+ * replacement: NoInfer<V>,
14
+ * ): ReadonlyMap<K, V>
15
+ * ```
16
+ *
17
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value.
18
+ *
19
+ * ## Example
20
+ *
21
+ * ```ts [data-first]
22
+ * import { Map } from "@monstermann/map";
23
+ *
24
+ * Map.findReplace(
25
+ * new Map([
26
+ * ["a", 1],
27
+ * ["b", 2],
28
+ * ["c", 3],
29
+ * ]),
30
+ * (value) => value > 1,
31
+ * 10,
32
+ * ); // Map(3) { "a" => 1, "b" => 10, "c" => 3 }
33
+ * ```
34
+ *
35
+ * ```ts [data-last]
36
+ * import { Map } from "@monstermann/map";
37
+ *
38
+ * pipe(
39
+ * new Map([
40
+ * ["a", 1],
41
+ * ["b", 2],
42
+ * ["c", 3],
43
+ * ]),
44
+ * Map.findReplace((value) => value > 1, 10),
45
+ * ); // Map(3) { "a" => 1, "b" => 10, "c" => 3 }
46
+ * ```
47
+ *
48
+ */
49
+ declare const findReplace: {
50
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): (target: Map<K, V>) => Map<K, V>;
51
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
52
+ <K, V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): Map<K, V>;
53
+ <K, V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): ReadonlyMap<K, V>;
54
+ };
55
+ //#endregion
56
+ export { findReplace };
@@ -0,0 +1,63 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findReplace.ts
5
+ /**
6
+ * # findReplace
7
+ *
8
+ * ```ts
9
+ * function Map.findReplace<K, V>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * replacement: NoInfer<V>,
17
+ * ): ReadonlyMap<K, V>
18
+ * ```
19
+ *
20
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value.
21
+ *
22
+ * ## Example
23
+ *
24
+ * ```ts [data-first]
25
+ * import { Map } from "@monstermann/map";
26
+ *
27
+ * Map.findReplace(
28
+ * new Map([
29
+ * ["a", 1],
30
+ * ["b", 2],
31
+ * ["c", 3],
32
+ * ]),
33
+ * (value) => value > 1,
34
+ * 10,
35
+ * ); // Map(3) { "a" => 1, "b" => 10, "c" => 3 }
36
+ * ```
37
+ *
38
+ * ```ts [data-last]
39
+ * import { Map } from "@monstermann/map";
40
+ *
41
+ * pipe(
42
+ * new Map([
43
+ * ["a", 1],
44
+ * ["b", 2],
45
+ * ["c", 3],
46
+ * ]),
47
+ * Map.findReplace((value) => value > 1, 10),
48
+ * ); // Map(3) { "a" => 1, "b" => 10, "c" => 3 }
49
+ * ```
50
+ *
51
+ */
52
+ const findReplace = dfdlT((target, predicate, replacement) => {
53
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
54
+ if (prev === replacement) return target;
55
+ const result = cloneMap(target);
56
+ result.set(key, replacement);
57
+ return result;
58
+ }
59
+ return target;
60
+ }, 3);
61
+
62
+ //#endregion
63
+ export { findReplace };
@@ -0,0 +1,58 @@
1
+ //#region src/Map/findReplaceOr.d.ts
2
+ /**
3
+ * # findReplaceOr
4
+ *
5
+ * ```ts
6
+ * function Map.findReplaceOr<K, V, O>(
7
+ * target: ReadonlyMap<K, V>,
8
+ * predicate: (
9
+ * value: NoInfer<V>,
10
+ * key: NoInfer<K>,
11
+ * target: ReadonlyMap<K, V>,
12
+ * ) => boolean,
13
+ * replacement: NoInfer<V>,
14
+ * or: O,
15
+ * ): ReadonlyMap<K, V> | O
16
+ * ```
17
+ *
18
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or `or` if no entry is found.
19
+ *
20
+ * ## Example
21
+ *
22
+ * ```ts [data-first]
23
+ * import { Map } from "@monstermann/map";
24
+ *
25
+ * Map.findReplaceOr(
26
+ * new Map([
27
+ * ["a", 1],
28
+ * ["b", 2],
29
+ * ["c", 3],
30
+ * ]),
31
+ * (value) => value > 10,
32
+ * 99,
33
+ * new Map(),
34
+ * ); // Map(0) {}
35
+ * ```
36
+ *
37
+ * ```ts [data-last]
38
+ * import { Map } from "@monstermann/map";
39
+ *
40
+ * pipe(
41
+ * new Map([
42
+ * ["a", 1],
43
+ * ["b", 2],
44
+ * ["c", 3],
45
+ * ]),
46
+ * Map.findReplaceOr((value) => value > 10, 99, new Map()),
47
+ * ); // Map(0) {}
48
+ * ```
49
+ *
50
+ */
51
+ declare const findReplaceOr: {
52
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, or: O): (target: Map<K, V>) => Map<K, V> | O;
53
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, or: O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
54
+ <K, V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, or: O): Map<K, V> | O;
55
+ <K, V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, or: O): ReadonlyMap<K, V> | O;
56
+ };
57
+ //#endregion
58
+ export { findReplaceOr };
@@ -0,0 +1,65 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findReplaceOr.ts
5
+ /**
6
+ * # findReplaceOr
7
+ *
8
+ * ```ts
9
+ * function Map.findReplaceOr<K, V, O>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * replacement: NoInfer<V>,
17
+ * or: O,
18
+ * ): ReadonlyMap<K, V> | O
19
+ * ```
20
+ *
21
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or `or` if no entry is found.
22
+ *
23
+ * ## Example
24
+ *
25
+ * ```ts [data-first]
26
+ * import { Map } from "@monstermann/map";
27
+ *
28
+ * Map.findReplaceOr(
29
+ * new Map([
30
+ * ["a", 1],
31
+ * ["b", 2],
32
+ * ["c", 3],
33
+ * ]),
34
+ * (value) => value > 10,
35
+ * 99,
36
+ * new Map(),
37
+ * ); // Map(0) {}
38
+ * ```
39
+ *
40
+ * ```ts [data-last]
41
+ * import { Map } from "@monstermann/map";
42
+ *
43
+ * pipe(
44
+ * new Map([
45
+ * ["a", 1],
46
+ * ["b", 2],
47
+ * ["c", 3],
48
+ * ]),
49
+ * Map.findReplaceOr((value) => value > 10, 99, new Map()),
50
+ * ); // Map(0) {}
51
+ * ```
52
+ *
53
+ */
54
+ const findReplaceOr = dfdlT((target, predicate, replacement, or) => {
55
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
56
+ if (prev === replacement) return target;
57
+ const result = cloneMap(target);
58
+ result.set(key, replacement);
59
+ return result;
60
+ }
61
+ return or;
62
+ }, 4);
63
+
64
+ //#endregion
65
+ export { findReplaceOr };
@@ -0,0 +1,62 @@
1
+ //#region src/Map/findReplaceOrElse.d.ts
2
+ /**
3
+ * # findReplaceOrElse
4
+ *
5
+ * ```ts
6
+ * function Map.findReplaceOrElse<K, V, O>(
7
+ * target: ReadonlyMap<K, V>,
8
+ * predicate: (
9
+ * value: NoInfer<V>,
10
+ * key: NoInfer<K>,
11
+ * target: ReadonlyMap<K, V>,
12
+ * ) => boolean,
13
+ * replacement: NoInfer<V>,
14
+ * orElse: (target: ReadonlyMap<K, V>) => O,
15
+ * ): ReadonlyMap<K, V> | O
16
+ * ```
17
+ *
18
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or the result of calling `orElse` with the map if no entry is found.
19
+ *
20
+ * ## Example
21
+ *
22
+ * ```ts [data-first]
23
+ * import { Map } from "@monstermann/map";
24
+ *
25
+ * Map.findReplaceOrElse(
26
+ * new Map([
27
+ * ["a", 1],
28
+ * ["b", 2],
29
+ * ["c", 3],
30
+ * ]),
31
+ * (value) => value > 10,
32
+ * 99,
33
+ * (map) => map.size,
34
+ * ); // 3
35
+ * ```
36
+ *
37
+ * ```ts [data-last]
38
+ * import { Map } from "@monstermann/map";
39
+ *
40
+ * pipe(
41
+ * new Map([
42
+ * ["a", 1],
43
+ * ["b", 2],
44
+ * ["c", 3],
45
+ * ]),
46
+ * Map.findReplaceOrElse(
47
+ * (value) => value > 10,
48
+ * 99,
49
+ * (map) => map.size,
50
+ * ),
51
+ * ); // 3
52
+ * ```
53
+ *
54
+ */
55
+ declare const findReplaceOrElse: {
56
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, orElse: (target: ReadonlyMap<K, V>) => O): (target: Map<K, V>) => Map<K, V> | O;
57
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, orElse: (target: ReadonlyMap<K, V>) => O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
58
+ <K, V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, orElse: (target: ReadonlyMap<K, V>) => O): Map<K, V> | O;
59
+ <K, V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>, orElse: (target: ReadonlyMap<K, V>) => O): ReadonlyMap<K, V> | O;
60
+ };
61
+ //#endregion
62
+ export { findReplaceOrElse };
@@ -0,0 +1,69 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findReplaceOrElse.ts
5
+ /**
6
+ * # findReplaceOrElse
7
+ *
8
+ * ```ts
9
+ * function Map.findReplaceOrElse<K, V, O>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * replacement: NoInfer<V>,
17
+ * orElse: (target: ReadonlyMap<K, V>) => O,
18
+ * ): ReadonlyMap<K, V> | O
19
+ * ```
20
+ *
21
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or the result of calling `orElse` with the map if no entry is found.
22
+ *
23
+ * ## Example
24
+ *
25
+ * ```ts [data-first]
26
+ * import { Map } from "@monstermann/map";
27
+ *
28
+ * Map.findReplaceOrElse(
29
+ * new Map([
30
+ * ["a", 1],
31
+ * ["b", 2],
32
+ * ["c", 3],
33
+ * ]),
34
+ * (value) => value > 10,
35
+ * 99,
36
+ * (map) => map.size,
37
+ * ); // 3
38
+ * ```
39
+ *
40
+ * ```ts [data-last]
41
+ * import { Map } from "@monstermann/map";
42
+ *
43
+ * pipe(
44
+ * new Map([
45
+ * ["a", 1],
46
+ * ["b", 2],
47
+ * ["c", 3],
48
+ * ]),
49
+ * Map.findReplaceOrElse(
50
+ * (value) => value > 10,
51
+ * 99,
52
+ * (map) => map.size,
53
+ * ),
54
+ * ); // 3
55
+ * ```
56
+ *
57
+ */
58
+ const findReplaceOrElse = dfdlT((target, predicate, replacement, orElse) => {
59
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
60
+ if (prev === replacement) return target;
61
+ const result = cloneMap(target);
62
+ result.set(key, replacement);
63
+ return result;
64
+ }
65
+ return orElse(target);
66
+ }, 4);
67
+
68
+ //#endregion
69
+ export { findReplaceOrElse };
@@ -0,0 +1,56 @@
1
+ //#region src/Map/findReplaceOrThrow.d.ts
2
+ /**
3
+ * # findReplaceOrThrow
4
+ *
5
+ * ```ts
6
+ * function Map.findReplaceOrThrow<K, V>(
7
+ * target: ReadonlyMap<K, V>,
8
+ * predicate: (
9
+ * value: NoInfer<V>,
10
+ * key: NoInfer<K>,
11
+ * target: ReadonlyMap<K, V>,
12
+ * ) => boolean,
13
+ * replacement: NoInfer<V>,
14
+ * ): ReadonlyMap<K, V>
15
+ * ```
16
+ *
17
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or throws an error if no entry is found.
18
+ *
19
+ * ## Example
20
+ *
21
+ * ```ts [data-first]
22
+ * import { Map } from "@monstermann/map";
23
+ *
24
+ * Map.findReplaceOrThrow(
25
+ * new Map([
26
+ * ["a", 1],
27
+ * ["b", 2],
28
+ * ["c", 3],
29
+ * ]),
30
+ * (value) => value > 1,
31
+ * 99,
32
+ * ); // Map(3) { "a" => 1, "b" => 99, "c" => 3 }
33
+ * ```
34
+ *
35
+ * ```ts [data-last]
36
+ * import { Map } from "@monstermann/map";
37
+ *
38
+ * pipe(
39
+ * new Map([
40
+ * ["a", 1],
41
+ * ["b", 2],
42
+ * ["c", 3],
43
+ * ]),
44
+ * Map.findReplaceOrThrow((value) => value > 1, 99),
45
+ * ); // Map(3) { "a" => 1, "b" => 99, "c" => 3 }
46
+ * ```
47
+ *
48
+ */
49
+ declare const findReplaceOrThrow: {
50
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): (target: Map<K, V>) => Map<K, V>;
51
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
52
+ <K, V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): Map<K, V>;
53
+ <K, V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, replacement: NoInfer<V>): ReadonlyMap<K, V>;
54
+ };
55
+ //#endregion
56
+ export { findReplaceOrThrow };
@@ -0,0 +1,63 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findReplaceOrThrow.ts
5
+ /**
6
+ * # findReplaceOrThrow
7
+ *
8
+ * ```ts
9
+ * function Map.findReplaceOrThrow<K, V>(
10
+ * target: ReadonlyMap<K, V>,
11
+ * predicate: (
12
+ * value: NoInfer<V>,
13
+ * key: NoInfer<K>,
14
+ * target: ReadonlyMap<K, V>,
15
+ * ) => boolean,
16
+ * replacement: NoInfer<V>,
17
+ * ): ReadonlyMap<K, V>
18
+ * ```
19
+ *
20
+ * Finds the first entry in the map that satisfies the provided `predicate` function and replaces its value with `replacement`, returning a new map with the replaced value, or throws an error if no entry is found.
21
+ *
22
+ * ## Example
23
+ *
24
+ * ```ts [data-first]
25
+ * import { Map } from "@monstermann/map";
26
+ *
27
+ * Map.findReplaceOrThrow(
28
+ * new Map([
29
+ * ["a", 1],
30
+ * ["b", 2],
31
+ * ["c", 3],
32
+ * ]),
33
+ * (value) => value > 1,
34
+ * 99,
35
+ * ); // Map(3) { "a" => 1, "b" => 99, "c" => 3 }
36
+ * ```
37
+ *
38
+ * ```ts [data-last]
39
+ * import { Map } from "@monstermann/map";
40
+ *
41
+ * pipe(
42
+ * new Map([
43
+ * ["a", 1],
44
+ * ["b", 2],
45
+ * ["c", 3],
46
+ * ]),
47
+ * Map.findReplaceOrThrow((value) => value > 1, 99),
48
+ * ); // Map(3) { "a" => 1, "b" => 99, "c" => 3 }
49
+ * ```
50
+ *
51
+ */
52
+ const findReplaceOrThrow = dfdlT((target, predicate, replacement) => {
53
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
54
+ if (prev === replacement) return target;
55
+ const result = cloneMap(target);
56
+ result.set(key, replacement);
57
+ return result;
58
+ }
59
+ throw new Error("Map.findReplaceOrThrow: Value not found.");
60
+ }, 3);
61
+
62
+ //#endregion
63
+ export { findReplaceOrThrow };