@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,71 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findMap.ts
5
+ /**
6
+ * # findMap
7
+ *
8
+ * ```ts
9
+ * function Map.findMap<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
+ * mapper: (
17
+ * value: NoInfer<V>,
18
+ * key: NoInfer<K>,
19
+ * target: ReadonlyMap<K, V>,
20
+ * ) => V,
21
+ * ): ReadonlyMap<K, V>
22
+ * ```
23
+ *
24
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value.
25
+ *
26
+ * ## Example
27
+ *
28
+ * ```ts [data-first]
29
+ * import { Map } from "@monstermann/map";
30
+ *
31
+ * Map.findMap(
32
+ * new Map([
33
+ * ["a", 1],
34
+ * ["b", 2],
35
+ * ["c", 3],
36
+ * ]),
37
+ * (value) => value > 1,
38
+ * (value) => value * 10,
39
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
40
+ * ```
41
+ *
42
+ * ```ts [data-last]
43
+ * import { Map } from "@monstermann/map";
44
+ *
45
+ * pipe(
46
+ * new Map([
47
+ * ["a", 1],
48
+ * ["b", 2],
49
+ * ["c", 3],
50
+ * ]),
51
+ * Map.findMap(
52
+ * (value) => value > 1,
53
+ * (value) => value * 10,
54
+ * ),
55
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
56
+ * ```
57
+ *
58
+ */
59
+ const findMap = dfdlT((target, predicate, mapper) => {
60
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
61
+ const next = mapper(prev, key, target);
62
+ if (prev === next) return target;
63
+ const result = cloneMap(target);
64
+ result.set(key, next);
65
+ return result;
66
+ }
67
+ return target;
68
+ }, 3);
69
+
70
+ //#endregion
71
+ export { findMap };
@@ -0,0 +1,67 @@
1
+ //#region src/Map/findMapAll.d.ts
2
+ /**
3
+ * # findMapAll
4
+ *
5
+ * ```ts
6
+ * function Map.findMapAll<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
+ * mapper: (
14
+ * value: NoInfer<V>,
15
+ * key: NoInfer<K>,
16
+ * target: ReadonlyMap<K, V>,
17
+ * ) => V,
18
+ * ): ReadonlyMap<K, V>
19
+ * ```
20
+ *
21
+ * Finds all entries in the map that satisfy the provided `predicate` function and applies the `mapper` function to each of them, returning a new map with the mapped values.
22
+ *
23
+ * ## Example
24
+ *
25
+ * ```ts [data-first]
26
+ * import { Map } from "@monstermann/map";
27
+ *
28
+ * Map.findMapAll(
29
+ * new Map([
30
+ * ["a", 1],
31
+ * ["b", 2],
32
+ * ["c", 3],
33
+ * ]),
34
+ * (value) => value > 1,
35
+ * (value) => value * 10,
36
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 30 }
37
+ * ```
38
+ *
39
+ * ```ts [data-last]
40
+ * import { Map } from "@monstermann/map";
41
+ *
42
+ * pipe(
43
+ * new Map([
44
+ * ["a", 1],
45
+ * ["b", 2],
46
+ * ["c", 3],
47
+ * ]),
48
+ * Map.findMapAll(
49
+ * (value) => value > 1,
50
+ * (value) => value * 10,
51
+ * ),
52
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 30 }
53
+ * ```
54
+ *
55
+ */
56
+ declare const findMapAll: {
57
+ <K, V, U extends V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: Map<K, V>) => Map<K, V>;
58
+ <K, V, U extends V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
59
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: Map<K, V>) => Map<K, V>;
60
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
61
+ <K, V, U extends V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): Map<K, V>;
62
+ <K, V, U extends V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): ReadonlyMap<K, V>;
63
+ <K, V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): Map<K, V>;
64
+ <K, V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): ReadonlyMap<K, V>;
65
+ };
66
+ //#endregion
67
+ export { findMapAll };
@@ -0,0 +1,72 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findMapAll.ts
5
+ /**
6
+ * # findMapAll
7
+ *
8
+ * ```ts
9
+ * function Map.findMapAll<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
+ * mapper: (
17
+ * value: NoInfer<V>,
18
+ * key: NoInfer<K>,
19
+ * target: ReadonlyMap<K, V>,
20
+ * ) => V,
21
+ * ): ReadonlyMap<K, V>
22
+ * ```
23
+ *
24
+ * Finds all entries in the map that satisfy the provided `predicate` function and applies the `mapper` function to each of them, returning a new map with the mapped values.
25
+ *
26
+ * ## Example
27
+ *
28
+ * ```ts [data-first]
29
+ * import { Map } from "@monstermann/map";
30
+ *
31
+ * Map.findMapAll(
32
+ * new Map([
33
+ * ["a", 1],
34
+ * ["b", 2],
35
+ * ["c", 3],
36
+ * ]),
37
+ * (value) => value > 1,
38
+ * (value) => value * 10,
39
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 30 }
40
+ * ```
41
+ *
42
+ * ```ts [data-last]
43
+ * import { Map } from "@monstermann/map";
44
+ *
45
+ * pipe(
46
+ * new Map([
47
+ * ["a", 1],
48
+ * ["b", 2],
49
+ * ["c", 3],
50
+ * ]),
51
+ * Map.findMapAll(
52
+ * (value) => value > 1,
53
+ * (value) => value * 10,
54
+ * ),
55
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 30 }
56
+ * ```
57
+ *
58
+ */
59
+ const findMapAll = dfdlT((target, predicate, mapper) => {
60
+ let result;
61
+ for (const [key, prev] of target) {
62
+ if (!predicate(prev, key, target)) continue;
63
+ const next = mapper(prev, key, target);
64
+ if (prev === next) continue;
65
+ result ??= cloneMap(target);
66
+ result.set(key, next);
67
+ }
68
+ return result ?? target;
69
+ }, 3);
70
+
71
+ //#endregion
72
+ export { findMapAll };
@@ -0,0 +1,70 @@
1
+ //#region src/Map/findMapOr.d.ts
2
+ /**
3
+ * # findMapOr
4
+ *
5
+ * ```ts
6
+ * function Map.findMapOr<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
+ * mapper: (
14
+ * value: NoInfer<V>,
15
+ * key: NoInfer<K>,
16
+ * target: ReadonlyMap<K, V>,
17
+ * ) => V,
18
+ * or: O,
19
+ * ): ReadonlyMap<K, V> | O
20
+ * ```
21
+ *
22
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or `or` if no entry is found.
23
+ *
24
+ * ## Example
25
+ *
26
+ * ```ts [data-first]
27
+ * import { Map } from "@monstermann/map";
28
+ *
29
+ * Map.findMapOr(
30
+ * new Map([
31
+ * ["a", 1],
32
+ * ["b", 2],
33
+ * ["c", 3],
34
+ * ]),
35
+ * (value) => value > 10,
36
+ * (value) => value * 10,
37
+ * new Map(),
38
+ * ); // Map(0) {}
39
+ * ```
40
+ *
41
+ * ```ts [data-last]
42
+ * import { Map } from "@monstermann/map";
43
+ *
44
+ * pipe(
45
+ * new Map([
46
+ * ["a", 1],
47
+ * ["b", 2],
48
+ * ["c", 3],
49
+ * ]),
50
+ * Map.findMapOr(
51
+ * (value) => value > 10,
52
+ * (value) => value * 10,
53
+ * new Map(),
54
+ * ),
55
+ * ); // Map(0) {}
56
+ * ```
57
+ *
58
+ */
59
+ declare const findMapOr: {
60
+ <K, V, U extends V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): (target: Map<K, V>) => Map<K, V> | O;
61
+ <K, V, U extends V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
62
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): (target: Map<K, V>) => Map<K, V> | O;
63
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
64
+ <K, V, U extends V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): Map<K, V> | O;
65
+ <K, V, U extends V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): ReadonlyMap<K, V> | O;
66
+ <K, V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): Map<K, V> | O;
67
+ <K, V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, or: O): ReadonlyMap<K, V> | O;
68
+ };
69
+ //#endregion
70
+ export { findMapOr };
@@ -0,0 +1,74 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findMapOr.ts
5
+ /**
6
+ * # findMapOr
7
+ *
8
+ * ```ts
9
+ * function Map.findMapOr<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
+ * mapper: (
17
+ * value: NoInfer<V>,
18
+ * key: NoInfer<K>,
19
+ * target: ReadonlyMap<K, V>,
20
+ * ) => V,
21
+ * or: O,
22
+ * ): ReadonlyMap<K, V> | O
23
+ * ```
24
+ *
25
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or `or` if no entry is found.
26
+ *
27
+ * ## Example
28
+ *
29
+ * ```ts [data-first]
30
+ * import { Map } from "@monstermann/map";
31
+ *
32
+ * Map.findMapOr(
33
+ * new Map([
34
+ * ["a", 1],
35
+ * ["b", 2],
36
+ * ["c", 3],
37
+ * ]),
38
+ * (value) => value > 10,
39
+ * (value) => value * 10,
40
+ * new Map(),
41
+ * ); // Map(0) {}
42
+ * ```
43
+ *
44
+ * ```ts [data-last]
45
+ * import { Map } from "@monstermann/map";
46
+ *
47
+ * pipe(
48
+ * new Map([
49
+ * ["a", 1],
50
+ * ["b", 2],
51
+ * ["c", 3],
52
+ * ]),
53
+ * Map.findMapOr(
54
+ * (value) => value > 10,
55
+ * (value) => value * 10,
56
+ * new Map(),
57
+ * ),
58
+ * ); // Map(0) {}
59
+ * ```
60
+ *
61
+ */
62
+ const findMapOr = dfdlT((target, predicate, mapper, or) => {
63
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
64
+ const next = mapper(prev, key, target);
65
+ if (prev === next) return target;
66
+ const result = cloneMap(target);
67
+ result.set(key, next);
68
+ return result;
69
+ }
70
+ return or;
71
+ }, 4);
72
+
73
+ //#endregion
74
+ export { findMapOr };
@@ -0,0 +1,70 @@
1
+ //#region src/Map/findMapOrElse.d.ts
2
+ /**
3
+ * # findMapOrElse
4
+ *
5
+ * ```ts
6
+ * function Map.findMapOrElse<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
+ * mapper: (
14
+ * value: NoInfer<V>,
15
+ * key: NoInfer<K>,
16
+ * target: ReadonlyMap<K, V>,
17
+ * ) => V,
18
+ * orElse: (target: ReadonlyMap<K, V>) => O,
19
+ * ): ReadonlyMap<K, V> | O
20
+ * ```
21
+ *
22
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or the result of calling `orElse` with the map if no entry is found.
23
+ *
24
+ * ## Example
25
+ *
26
+ * ```ts [data-first]
27
+ * import { Map } from "@monstermann/map";
28
+ *
29
+ * Map.findMapOrElse(
30
+ * new Map([
31
+ * ["a", 1],
32
+ * ["b", 2],
33
+ * ["c", 3],
34
+ * ]),
35
+ * (value) => value > 10,
36
+ * (value) => value * 10,
37
+ * (map) => map.size,
38
+ * ); // 3
39
+ * ```
40
+ *
41
+ * ```ts [data-last]
42
+ * import { Map } from "@monstermann/map";
43
+ *
44
+ * pipe(
45
+ * new Map([
46
+ * ["a", 1],
47
+ * ["b", 2],
48
+ * ["c", 3],
49
+ * ]),
50
+ * Map.findMapOrElse(
51
+ * (value) => value > 10,
52
+ * (value) => value * 10,
53
+ * (map) => map.size,
54
+ * ),
55
+ * ); // 3
56
+ * ```
57
+ *
58
+ */
59
+ declare const findMapOrElse: {
60
+ <K, V, U extends V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): (target: Map<K, V>) => Map<K, V> | O;
61
+ <K, V, U extends V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
62
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): (target: Map<K, V>) => Map<K, V> | O;
63
+ <K, V, O>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V> | O;
64
+ <K, V, U extends V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): Map<K, V> | O;
65
+ <K, V, U extends V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): ReadonlyMap<K, V> | O;
66
+ <K, V, O>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): Map<K, V> | O;
67
+ <K, V, O>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V, orElse: (target: ReadonlyMap<K, V>) => O): ReadonlyMap<K, V> | O;
68
+ };
69
+ //#endregion
70
+ export { findMapOrElse };
@@ -0,0 +1,74 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findMapOrElse.ts
5
+ /**
6
+ * # findMapOrElse
7
+ *
8
+ * ```ts
9
+ * function Map.findMapOrElse<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
+ * mapper: (
17
+ * value: NoInfer<V>,
18
+ * key: NoInfer<K>,
19
+ * target: ReadonlyMap<K, V>,
20
+ * ) => V,
21
+ * orElse: (target: ReadonlyMap<K, V>) => O,
22
+ * ): ReadonlyMap<K, V> | O
23
+ * ```
24
+ *
25
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or the result of calling `orElse` with the map if no entry is found.
26
+ *
27
+ * ## Example
28
+ *
29
+ * ```ts [data-first]
30
+ * import { Map } from "@monstermann/map";
31
+ *
32
+ * Map.findMapOrElse(
33
+ * new Map([
34
+ * ["a", 1],
35
+ * ["b", 2],
36
+ * ["c", 3],
37
+ * ]),
38
+ * (value) => value > 10,
39
+ * (value) => value * 10,
40
+ * (map) => map.size,
41
+ * ); // 3
42
+ * ```
43
+ *
44
+ * ```ts [data-last]
45
+ * import { Map } from "@monstermann/map";
46
+ *
47
+ * pipe(
48
+ * new Map([
49
+ * ["a", 1],
50
+ * ["b", 2],
51
+ * ["c", 3],
52
+ * ]),
53
+ * Map.findMapOrElse(
54
+ * (value) => value > 10,
55
+ * (value) => value * 10,
56
+ * (map) => map.size,
57
+ * ),
58
+ * ); // 3
59
+ * ```
60
+ *
61
+ */
62
+ const findMapOrElse = dfdlT((target, predicate, mapper, orElse) => {
63
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
64
+ const next = mapper(prev, key, target);
65
+ if (prev === next) return target;
66
+ const result = cloneMap(target);
67
+ result.set(key, next);
68
+ return result;
69
+ }
70
+ return orElse(target);
71
+ }, 4);
72
+
73
+ //#endregion
74
+ export { findMapOrElse };
@@ -0,0 +1,67 @@
1
+ //#region src/Map/findMapOrThrow.d.ts
2
+ /**
3
+ * # findMapOrThrow
4
+ *
5
+ * ```ts
6
+ * function Map.findMapOrThrow<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
+ * mapper: (
14
+ * value: NoInfer<V>,
15
+ * key: NoInfer<K>,
16
+ * target: ReadonlyMap<K, V>,
17
+ * ) => V,
18
+ * ): ReadonlyMap<K, V>
19
+ * ```
20
+ *
21
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or throws an error if no entry is found.
22
+ *
23
+ * ## Example
24
+ *
25
+ * ```ts [data-first]
26
+ * import { Map } from "@monstermann/map";
27
+ *
28
+ * Map.findMapOrThrow(
29
+ * new Map([
30
+ * ["a", 1],
31
+ * ["b", 2],
32
+ * ["c", 3],
33
+ * ]),
34
+ * (value) => value > 1,
35
+ * (value) => value * 10,
36
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
37
+ * ```
38
+ *
39
+ * ```ts [data-last]
40
+ * import { Map } from "@monstermann/map";
41
+ *
42
+ * pipe(
43
+ * new Map([
44
+ * ["a", 1],
45
+ * ["b", 2],
46
+ * ["c", 3],
47
+ * ]),
48
+ * Map.findMapOrThrow(
49
+ * (value) => value > 1,
50
+ * (value) => value * 10,
51
+ * ),
52
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
53
+ * ```
54
+ *
55
+ */
56
+ declare const findMapOrThrow: {
57
+ <K, V, U extends V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: Map<K, V>) => Map<K, V>;
58
+ <K, V, U extends V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
59
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: Map<K, V>) => Map<K, V>;
60
+ <K, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): (target: ReadonlyMap<K, V>) => ReadonlyMap<K, V>;
61
+ <K, V, U extends V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): Map<K, V>;
62
+ <K, V, U extends V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => value is U, mapper: (value: U, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): ReadonlyMap<K, V>;
63
+ <K, V>(target: Map<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): Map<K, V>;
64
+ <K, V>(target: ReadonlyMap<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => boolean, mapper: (value: NoInfer<V>, key: NoInfer<K>, target: ReadonlyMap<K, V>) => V): ReadonlyMap<K, V>;
65
+ };
66
+ //#endregion
67
+ export { findMapOrThrow };
@@ -0,0 +1,71 @@
1
+ import { dfdlT } from "@monstermann/dfdl";
2
+ import { cloneMap } from "@monstermann/remmi";
3
+
4
+ //#region src/Map/findMapOrThrow.ts
5
+ /**
6
+ * # findMapOrThrow
7
+ *
8
+ * ```ts
9
+ * function Map.findMapOrThrow<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
+ * mapper: (
17
+ * value: NoInfer<V>,
18
+ * key: NoInfer<K>,
19
+ * target: ReadonlyMap<K, V>,
20
+ * ) => V,
21
+ * ): ReadonlyMap<K, V>
22
+ * ```
23
+ *
24
+ * Finds the first entry in the map that satisfies the provided `predicate` function and applies the `mapper` function to it, returning a new map with the mapped value, or throws an error if no entry is found.
25
+ *
26
+ * ## Example
27
+ *
28
+ * ```ts [data-first]
29
+ * import { Map } from "@monstermann/map";
30
+ *
31
+ * Map.findMapOrThrow(
32
+ * new Map([
33
+ * ["a", 1],
34
+ * ["b", 2],
35
+ * ["c", 3],
36
+ * ]),
37
+ * (value) => value > 1,
38
+ * (value) => value * 10,
39
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
40
+ * ```
41
+ *
42
+ * ```ts [data-last]
43
+ * import { Map } from "@monstermann/map";
44
+ *
45
+ * pipe(
46
+ * new Map([
47
+ * ["a", 1],
48
+ * ["b", 2],
49
+ * ["c", 3],
50
+ * ]),
51
+ * Map.findMapOrThrow(
52
+ * (value) => value > 1,
53
+ * (value) => value * 10,
54
+ * ),
55
+ * ); // Map(3) { "a" => 1, "b" => 20, "c" => 3 }
56
+ * ```
57
+ *
58
+ */
59
+ const findMapOrThrow = dfdlT((target, predicate, mapper) => {
60
+ for (const [key, prev] of target) if (predicate(prev, key, target)) {
61
+ const next = mapper(prev, key, target);
62
+ if (prev === next) return target;
63
+ const result = cloneMap(target);
64
+ result.set(key, next);
65
+ return result;
66
+ }
67
+ throw new Error("Map.findMapOrThrow: Value not found.");
68
+ }, 3);
69
+
70
+ //#endregion
71
+ export { findMapOrThrow };