@nlozgachev/pipelined 0.11.0 → 0.13.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 (193) hide show
  1. package/LICENCE +28 -0
  2. package/README.md +1 -1
  3. package/{types/src/Types/NonEmptyList.d.ts → dist/NonEmptyList-BlGFjor5.d.mts} +4 -3
  4. package/dist/NonEmptyList-BlGFjor5.d.ts +30 -0
  5. package/dist/Task-BB8Wmc1J.d.ts +677 -0
  6. package/dist/Task-ChKyH0pF.d.mts +677 -0
  7. package/dist/chunk-DBIC62UV.mjs +6 -0
  8. package/dist/chunk-QPTGO5AS.mjs +150 -0
  9. package/dist/composition.d.mts +495 -0
  10. package/dist/composition.d.ts +495 -0
  11. package/dist/composition.js +188 -0
  12. package/dist/composition.mjs +135 -0
  13. package/dist/core.d.mts +2170 -0
  14. package/dist/core.d.ts +2170 -0
  15. package/dist/core.js +698 -0
  16. package/dist/core.mjs +517 -0
  17. package/dist/types.d.mts +54 -0
  18. package/{types/src/Types/Brand.d.ts → dist/types.d.ts} +6 -4
  19. package/dist/types.js +41 -0
  20. package/dist/types.mjs +14 -0
  21. package/dist/utils.d.mts +1285 -0
  22. package/dist/utils.d.ts +1285 -0
  23. package/dist/utils.js +722 -0
  24. package/dist/utils.mjs +553 -0
  25. package/package.json +63 -69
  26. package/esm/mod.js +0 -3
  27. package/esm/package.json +0 -3
  28. package/esm/src/Composition/compose.js +0 -3
  29. package/esm/src/Composition/converge.js +0 -3
  30. package/esm/src/Composition/curry.js +0 -42
  31. package/esm/src/Composition/flip.js +0 -20
  32. package/esm/src/Composition/flow.js +0 -8
  33. package/esm/src/Composition/fn.js +0 -85
  34. package/esm/src/Composition/index.js +0 -13
  35. package/esm/src/Composition/juxt.js +0 -3
  36. package/esm/src/Composition/memoize.js +0 -66
  37. package/esm/src/Composition/not.js +0 -25
  38. package/esm/src/Composition/on.js +0 -12
  39. package/esm/src/Composition/pipe.js +0 -3
  40. package/esm/src/Composition/tap.js +0 -33
  41. package/esm/src/Composition/uncurry.js +0 -32
  42. package/esm/src/Core/Deferred.js +0 -30
  43. package/esm/src/Core/InternalTypes.js +0 -1
  44. package/esm/src/Core/Lens.js +0 -98
  45. package/esm/src/Core/Logged.js +0 -111
  46. package/esm/src/Core/Option.js +0 -191
  47. package/esm/src/Core/Optional.js +0 -160
  48. package/esm/src/Core/Predicate.js +0 -133
  49. package/esm/src/Core/Reader.js +0 -134
  50. package/esm/src/Core/Refinement.js +0 -115
  51. package/esm/src/Core/RemoteData.js +0 -211
  52. package/esm/src/Core/Result.js +0 -170
  53. package/esm/src/Core/State.js +0 -181
  54. package/esm/src/Core/Task.js +0 -223
  55. package/esm/src/Core/TaskOption.js +0 -106
  56. package/esm/src/Core/TaskResult.js +0 -127
  57. package/esm/src/Core/TaskValidation.js +0 -128
  58. package/esm/src/Core/These.js +0 -245
  59. package/esm/src/Core/Validation.js +0 -212
  60. package/esm/src/Core/index.js +0 -17
  61. package/esm/src/Types/Brand.js +0 -28
  62. package/esm/src/Types/NonEmptyList.js +0 -14
  63. package/esm/src/Types/index.js +0 -2
  64. package/esm/src/Utils/Arr.js +0 -570
  65. package/esm/src/Utils/Num.js +0 -124
  66. package/esm/src/Utils/Rec.js +0 -215
  67. package/esm/src/Utils/Str.js +0 -134
  68. package/esm/src/Utils/index.js +0 -4
  69. package/script/mod.js +0 -19
  70. package/script/package.json +0 -3
  71. package/script/src/Composition/compose.js +0 -6
  72. package/script/src/Composition/converge.js +0 -6
  73. package/script/src/Composition/curry.js +0 -48
  74. package/script/src/Composition/flip.js +0 -24
  75. package/script/src/Composition/flow.js +0 -11
  76. package/script/src/Composition/fn.js +0 -98
  77. package/script/src/Composition/index.js +0 -29
  78. package/script/src/Composition/juxt.js +0 -6
  79. package/script/src/Composition/memoize.js +0 -71
  80. package/script/src/Composition/not.js +0 -29
  81. package/script/src/Composition/on.js +0 -16
  82. package/script/src/Composition/pipe.js +0 -6
  83. package/script/src/Composition/tap.js +0 -37
  84. package/script/src/Composition/uncurry.js +0 -38
  85. package/script/src/Core/Deferred.js +0 -33
  86. package/script/src/Core/InternalTypes.js +0 -2
  87. package/script/src/Core/Lens.js +0 -101
  88. package/script/src/Core/Logged.js +0 -114
  89. package/script/src/Core/Option.js +0 -194
  90. package/script/src/Core/Optional.js +0 -163
  91. package/script/src/Core/Predicate.js +0 -136
  92. package/script/src/Core/Reader.js +0 -137
  93. package/script/src/Core/Refinement.js +0 -118
  94. package/script/src/Core/RemoteData.js +0 -214
  95. package/script/src/Core/Result.js +0 -173
  96. package/script/src/Core/State.js +0 -184
  97. package/script/src/Core/Task.js +0 -226
  98. package/script/src/Core/TaskOption.js +0 -109
  99. package/script/src/Core/TaskResult.js +0 -130
  100. package/script/src/Core/TaskValidation.js +0 -131
  101. package/script/src/Core/These.js +0 -248
  102. package/script/src/Core/Validation.js +0 -215
  103. package/script/src/Core/index.js +0 -33
  104. package/script/src/Types/Brand.js +0 -31
  105. package/script/src/Types/NonEmptyList.js +0 -18
  106. package/script/src/Types/index.js +0 -18
  107. package/script/src/Utils/Arr.js +0 -573
  108. package/script/src/Utils/Num.js +0 -127
  109. package/script/src/Utils/Rec.js +0 -218
  110. package/script/src/Utils/Str.js +0 -137
  111. package/script/src/Utils/index.js +0 -20
  112. package/types/mod.d.ts +0 -4
  113. package/types/mod.d.ts.map +0 -1
  114. package/types/src/Composition/compose.d.ts +0 -33
  115. package/types/src/Composition/compose.d.ts.map +0 -1
  116. package/types/src/Composition/converge.d.ts +0 -21
  117. package/types/src/Composition/converge.d.ts.map +0 -1
  118. package/types/src/Composition/curry.d.ts +0 -43
  119. package/types/src/Composition/curry.d.ts.map +0 -1
  120. package/types/src/Composition/flip.d.ts +0 -21
  121. package/types/src/Composition/flip.d.ts.map +0 -1
  122. package/types/src/Composition/flow.d.ts +0 -56
  123. package/types/src/Composition/flow.d.ts.map +0 -1
  124. package/types/src/Composition/fn.d.ts +0 -76
  125. package/types/src/Composition/fn.d.ts.map +0 -1
  126. package/types/src/Composition/index.d.ts +0 -14
  127. package/types/src/Composition/index.d.ts.map +0 -1
  128. package/types/src/Composition/juxt.d.ts +0 -18
  129. package/types/src/Composition/juxt.d.ts.map +0 -1
  130. package/types/src/Composition/memoize.d.ts +0 -46
  131. package/types/src/Composition/memoize.d.ts.map +0 -1
  132. package/types/src/Composition/not.d.ts +0 -26
  133. package/types/src/Composition/not.d.ts.map +0 -1
  134. package/types/src/Composition/on.d.ts +0 -13
  135. package/types/src/Composition/on.d.ts.map +0 -1
  136. package/types/src/Composition/pipe.d.ts +0 -56
  137. package/types/src/Composition/pipe.d.ts.map +0 -1
  138. package/types/src/Composition/tap.d.ts +0 -31
  139. package/types/src/Composition/tap.d.ts.map +0 -1
  140. package/types/src/Composition/uncurry.d.ts +0 -54
  141. package/types/src/Composition/uncurry.d.ts.map +0 -1
  142. package/types/src/Core/Deferred.d.ts +0 -49
  143. package/types/src/Core/Deferred.d.ts.map +0 -1
  144. package/types/src/Core/InternalTypes.d.ts +0 -23
  145. package/types/src/Core/InternalTypes.d.ts.map +0 -1
  146. package/types/src/Core/Lens.d.ts +0 -118
  147. package/types/src/Core/Lens.d.ts.map +0 -1
  148. package/types/src/Core/Logged.d.ts +0 -126
  149. package/types/src/Core/Logged.d.ts.map +0 -1
  150. package/types/src/Core/Option.d.ts +0 -209
  151. package/types/src/Core/Option.d.ts.map +0 -1
  152. package/types/src/Core/Optional.d.ts +0 -158
  153. package/types/src/Core/Optional.d.ts.map +0 -1
  154. package/types/src/Core/Predicate.d.ts +0 -161
  155. package/types/src/Core/Predicate.d.ts.map +0 -1
  156. package/types/src/Core/Reader.d.ts +0 -156
  157. package/types/src/Core/Reader.d.ts.map +0 -1
  158. package/types/src/Core/Refinement.d.ts +0 -138
  159. package/types/src/Core/Refinement.d.ts.map +0 -1
  160. package/types/src/Core/RemoteData.d.ts +0 -197
  161. package/types/src/Core/RemoteData.d.ts.map +0 -1
  162. package/types/src/Core/Result.d.ts +0 -182
  163. package/types/src/Core/Result.d.ts.map +0 -1
  164. package/types/src/Core/State.d.ts +0 -192
  165. package/types/src/Core/State.d.ts.map +0 -1
  166. package/types/src/Core/Task.d.ts +0 -219
  167. package/types/src/Core/Task.d.ts.map +0 -1
  168. package/types/src/Core/TaskOption.d.ts +0 -121
  169. package/types/src/Core/TaskOption.d.ts.map +0 -1
  170. package/types/src/Core/TaskResult.d.ts +0 -119
  171. package/types/src/Core/TaskResult.d.ts.map +0 -1
  172. package/types/src/Core/TaskValidation.d.ts +0 -144
  173. package/types/src/Core/TaskValidation.d.ts.map +0 -1
  174. package/types/src/Core/These.d.ts +0 -225
  175. package/types/src/Core/These.d.ts.map +0 -1
  176. package/types/src/Core/Validation.d.ts +0 -203
  177. package/types/src/Core/Validation.d.ts.map +0 -1
  178. package/types/src/Core/index.d.ts +0 -18
  179. package/types/src/Core/index.d.ts.map +0 -1
  180. package/types/src/Types/Brand.d.ts.map +0 -1
  181. package/types/src/Types/NonEmptyList.d.ts.map +0 -1
  182. package/types/src/Types/index.d.ts +0 -3
  183. package/types/src/Types/index.d.ts.map +0 -1
  184. package/types/src/Utils/Arr.d.ts +0 -403
  185. package/types/src/Utils/Arr.d.ts.map +0 -1
  186. package/types/src/Utils/Num.d.ts +0 -110
  187. package/types/src/Utils/Num.d.ts.map +0 -1
  188. package/types/src/Utils/Rec.d.ts +0 -143
  189. package/types/src/Utils/Rec.d.ts.map +0 -1
  190. package/types/src/Utils/Str.d.ts +0 -128
  191. package/types/src/Utils/Str.d.ts.map +0 -1
  192. package/types/src/Utils/index.d.ts +0 -5
  193. package/types/src/Utils/index.d.ts.map +0 -1
@@ -1,573 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Arr = void 0;
4
- const Deferred_js_1 = require("../Core/Deferred.js");
5
- const Option_js_1 = require("../Core/Option.js");
6
- const Result_js_1 = require("../Core/Result.js");
7
- const Task_js_1 = require("../Core/Task.js");
8
- const NonEmptyList_js_1 = require("../Types/NonEmptyList.js");
9
- /**
10
- * Functional array utilities that compose well with pipe.
11
- * All functions are data-last and curried where applicable.
12
- * Safe access functions return Option instead of throwing or returning undefined.
13
- *
14
- * @example
15
- * ```ts
16
- * pipe(
17
- * [1, 2, 3, 4, 5],
18
- * Arr.filter(n => n > 2),
19
- * Arr.map(n => n * 10),
20
- * Arr.head
21
- * ); // Some(30)
22
- * ```
23
- */
24
- var Arr;
25
- (function (Arr) {
26
- // --- Safe access ---
27
- /**
28
- * Returns the first element of an array, or None if the array is empty.
29
- *
30
- * @example
31
- * ```ts
32
- * Arr.head([1, 2, 3]); // Some(1)
33
- * Arr.head([]); // None
34
- * ```
35
- */
36
- Arr.head = (data) => data.length > 0 ? Option_js_1.Option.some(data[0]) : Option_js_1.Option.none();
37
- /**
38
- * Returns the last element of an array, or None if the array is empty.
39
- *
40
- * @example
41
- * ```ts
42
- * Arr.last([1, 2, 3]); // Some(3)
43
- * Arr.last([]); // None
44
- * ```
45
- */
46
- Arr.last = (data) => data.length > 0 ? Option_js_1.Option.some(data[data.length - 1]) : Option_js_1.Option.none();
47
- /**
48
- * Returns all elements except the first, or None if the array is empty.
49
- *
50
- * @example
51
- * ```ts
52
- * Arr.tail([1, 2, 3]); // Some([2, 3])
53
- * Arr.tail([]); // None
54
- * ```
55
- */
56
- Arr.tail = (data) => data.length > 0 ? Option_js_1.Option.some(data.slice(1)) : Option_js_1.Option.none();
57
- /**
58
- * Returns all elements except the last, or None if the array is empty.
59
- *
60
- * @example
61
- * ```ts
62
- * Arr.init([1, 2, 3]); // Some([1, 2])
63
- * Arr.init([]); // None
64
- * ```
65
- */
66
- Arr.init = (data) => data.length > 0 ? Option_js_1.Option.some(data.slice(0, -1)) : Option_js_1.Option.none();
67
- // --- Search ---
68
- /**
69
- * Returns the first element matching the predicate, or None.
70
- *
71
- * @example
72
- * ```ts
73
- * pipe([1, 2, 3, 4], Arr.findFirst(n => n > 2)); // Some(3)
74
- * ```
75
- */
76
- Arr.findFirst = (predicate) => (data) => {
77
- const idx = data.findIndex(predicate);
78
- return idx >= 0 ? Option_js_1.Option.some(data[idx]) : Option_js_1.Option.none();
79
- };
80
- /**
81
- * Returns the last element matching the predicate, or None.
82
- *
83
- * @example
84
- * ```ts
85
- * pipe([1, 2, 3, 4], Arr.findLast(n => n > 2)); // Some(4)
86
- * ```
87
- */
88
- Arr.findLast = (predicate) => (data) => {
89
- for (let i = data.length - 1; i >= 0; i--) {
90
- if (predicate(data[i]))
91
- return Option_js_1.Option.some(data[i]);
92
- }
93
- return Option_js_1.Option.none();
94
- };
95
- /**
96
- * Returns the index of the first element matching the predicate, or None.
97
- *
98
- * @example
99
- * ```ts
100
- * pipe([1, 2, 3, 4], Arr.findIndex(n => n > 2)); // Some(2)
101
- * ```
102
- */
103
- Arr.findIndex = (predicate) => (data) => {
104
- const idx = data.findIndex(predicate);
105
- return idx >= 0 ? Option_js_1.Option.some(idx) : Option_js_1.Option.none();
106
- };
107
- // --- Transform ---
108
- /**
109
- * Transforms each element of an array.
110
- *
111
- * @example
112
- * ```ts
113
- * pipe([1, 2, 3], Arr.map(n => n * 2)); // [2, 4, 6]
114
- * ```
115
- */
116
- Arr.map = (f) => (data) => {
117
- const n = data.length;
118
- const result = new Array(n);
119
- for (let i = 0; i < n; i++)
120
- result[i] = f(data[i]);
121
- return result;
122
- };
123
- /**
124
- * Filters elements that satisfy the predicate.
125
- *
126
- * @example
127
- * ```ts
128
- * pipe([1, 2, 3, 4], Arr.filter(n => n % 2 === 0)); // [2, 4]
129
- * ```
130
- */
131
- Arr.filter = (predicate) => (data) => {
132
- const n = data.length;
133
- const result = [];
134
- for (let i = 0; i < n; i++) {
135
- if (predicate(data[i]))
136
- result.push(data[i]);
137
- }
138
- return result;
139
- };
140
- /**
141
- * Splits an array into two groups based on a predicate.
142
- * First group contains elements that satisfy the predicate,
143
- * second group contains the rest.
144
- *
145
- * @example
146
- * ```ts
147
- * pipe([1, 2, 3, 4], Arr.partition(n => n % 2 === 0)); // [[2, 4], [1, 3]]
148
- * ```
149
- */
150
- Arr.partition = (predicate) => (data) => {
151
- const pass = [];
152
- const fail = [];
153
- for (const a of data) {
154
- (predicate(a) ? pass : fail).push(a);
155
- }
156
- return [pass, fail];
157
- };
158
- /**
159
- * Groups elements by a key function.
160
- *
161
- * @example
162
- * ```ts
163
- * pipe(
164
- * ["apple", "avocado", "banana"],
165
- * Arr.groupBy(s => s[0])
166
- * ); // { a: ["apple", "avocado"], b: ["banana"] }
167
- * ```
168
- */
169
- Arr.groupBy = (f) => (data) => {
170
- const result = {};
171
- for (const a of data) {
172
- const key = f(a);
173
- if (!result[key])
174
- result[key] = [];
175
- result[key].push(a);
176
- }
177
- return result;
178
- };
179
- /**
180
- * Removes duplicate elements using strict equality.
181
- *
182
- * @example
183
- * ```ts
184
- * Arr.uniq([1, 2, 2, 3, 1]); // [1, 2, 3]
185
- * ```
186
- */
187
- Arr.uniq = (data) => [
188
- ...new Set(data),
189
- ];
190
- /**
191
- * Removes duplicate elements by comparing the result of a key function.
192
- *
193
- * @example
194
- * ```ts
195
- * pipe(
196
- * [{id: 1, name: "a"}, {id: 1, name: "b"}, {id: 2, name: "c"}],
197
- * Arr.uniqBy(x => x.id)
198
- * ); // [{id: 1, name: "a"}, {id: 2, name: "c"}]
199
- * ```
200
- */
201
- Arr.uniqBy = (f) => (data) => {
202
- const seen = new Set();
203
- const result = [];
204
- for (const a of data) {
205
- const key = f(a);
206
- if (!seen.has(key)) {
207
- seen.add(key);
208
- result.push(a);
209
- }
210
- }
211
- return result;
212
- };
213
- /**
214
- * Sorts an array using a comparison function. Returns a new array.
215
- *
216
- * @example
217
- * ```ts
218
- * pipe([3, 1, 2], Arr.sortBy((a, b) => a - b)); // [1, 2, 3]
219
- * ```
220
- */
221
- Arr.sortBy = (compare) => (data) => [...data].sort(compare);
222
- // --- Combine ---
223
- /**
224
- * Pairs up elements from two arrays. Stops at the shorter array.
225
- *
226
- * @example
227
- * ```ts
228
- * pipe([1, 2, 3], Arr.zip(["a", "b"])); // [[1, "a"], [2, "b"]]
229
- * ```
230
- */
231
- Arr.zip = (other) => (data) => {
232
- const len = Math.min(data.length, other.length);
233
- const result = new Array(len);
234
- for (let i = 0; i < len; i++) {
235
- result[i] = [data[i], other[i]];
236
- }
237
- return result;
238
- };
239
- /**
240
- * Combines elements from two arrays using a function. Stops at the shorter array.
241
- *
242
- * @example
243
- * ```ts
244
- * pipe([1, 2], Arr.zipWith((a, b) => a + b, ["a", "b"])); // ["1a", "2b"]
245
- * ```
246
- */
247
- Arr.zipWith = (f) => (other) => (data) => {
248
- const len = Math.min(data.length, other.length);
249
- const result = new Array(len);
250
- for (let i = 0; i < len; i++) {
251
- result[i] = f(data[i], other[i]);
252
- }
253
- return result;
254
- };
255
- /**
256
- * Inserts a separator between every element.
257
- *
258
- * @example
259
- * ```ts
260
- * pipe([1, 2, 3], Arr.intersperse(0)); // [1, 0, 2, 0, 3]
261
- * ```
262
- */
263
- Arr.intersperse = (sep) => (data) => {
264
- if (data.length <= 1)
265
- return data;
266
- const result = [data[0]];
267
- for (let i = 1; i < data.length; i++) {
268
- result.push(sep, data[i]);
269
- }
270
- return result;
271
- };
272
- /**
273
- * Splits an array into chunks of the given size.
274
- *
275
- * @example
276
- * ```ts
277
- * pipe([1, 2, 3, 4, 5], Arr.chunksOf(2)); // [[1, 2], [3, 4], [5]]
278
- * ```
279
- */
280
- Arr.chunksOf = (n) => (data) => {
281
- if (n <= 0)
282
- return [];
283
- const result = [];
284
- for (let i = 0; i < data.length; i += n) {
285
- result.push(data.slice(i, i + n));
286
- }
287
- return result;
288
- };
289
- /**
290
- * Flattens a nested array by one level.
291
- *
292
- * @example
293
- * ```ts
294
- * Arr.flatten([[1, 2], [3], [4, 5]]); // [1, 2, 3, 4, 5]
295
- * ```
296
- */
297
- Arr.flatten = (data) => [].concat(...data);
298
- /**
299
- * Maps each element to an array and flattens the result.
300
- *
301
- * @example
302
- * ```ts
303
- * pipe([1, 2, 3], Arr.flatMap(n => [n, n * 10])); // [1, 10, 2, 20, 3, 30]
304
- * ```
305
- */
306
- Arr.flatMap = (f) => (data) => {
307
- const n = data.length;
308
- const result = [];
309
- for (let i = 0; i < n; i++) {
310
- const chunk = f(data[i]);
311
- const m = chunk.length;
312
- for (let j = 0; j < m; j++)
313
- result.push(chunk[j]);
314
- }
315
- return result;
316
- };
317
- /**
318
- * Reduces an array from the left.
319
- *
320
- * @example
321
- * ```ts
322
- * pipe([1, 2, 3], Arr.reduce(0, (acc, n) => acc + n)); // 6
323
- * ```
324
- */
325
- Arr.reduce = (initial, f) => (data) => data.reduce(f, initial);
326
- // --- Traverse / Sequence ---
327
- /**
328
- * Maps each element to an Option and collects the results.
329
- * Returns None if any mapping returns None.
330
- *
331
- * @example
332
- * ```ts
333
- * const parseNum = (s: string): Option<number> => {
334
- * const n = Number(s);
335
- * return isNaN(n) ? Option.none() : Option.some(n);
336
- * };
337
- *
338
- * pipe(["1", "2", "3"], Arr.traverse(parseNum)); // Some([1, 2, 3])
339
- * pipe(["1", "x", "3"], Arr.traverse(parseNum)); // None
340
- * ```
341
- */
342
- Arr.traverse = (f) => (data) => {
343
- const n = data.length;
344
- const result = new Array(n);
345
- for (let i = 0; i < n; i++) {
346
- const mapped = f(data[i]);
347
- if (mapped.kind === "None")
348
- return Option_js_1.Option.none();
349
- result[i] = mapped.value;
350
- }
351
- return Option_js_1.Option.some(result);
352
- };
353
- /**
354
- * Maps each element to a Result and collects the results.
355
- * Returns the first Err if any mapping fails.
356
- *
357
- * @example
358
- * ```ts
359
- * pipe(
360
- * [1, 2, 3],
361
- * Arr.traverseResult(n => n > 0 ? Result.ok(n) : Result.err("negative"))
362
- * ); // Ok([1, 2, 3])
363
- * ```
364
- */
365
- Arr.traverseResult = (f) => (data) => {
366
- const n = data.length;
367
- const result = new Array(n);
368
- for (let i = 0; i < n; i++) {
369
- const mapped = f(data[i]);
370
- if (mapped.kind === "Error")
371
- return mapped;
372
- result[i] = mapped.value;
373
- }
374
- return Result_js_1.Result.ok(result);
375
- };
376
- /**
377
- * Maps each element to a Task and runs all in parallel.
378
- *
379
- * @example
380
- * ```ts
381
- * pipe(
382
- * [1, 2, 3],
383
- * Arr.traverseTask(n => Task.resolve(n * 2))
384
- * )(); // Promise<[2, 4, 6]>
385
- * ```
386
- */
387
- Arr.traverseTask = (f) => (data) => Task_js_1.Task.from(() => Promise.all(data.map((a) => Deferred_js_1.Deferred.toPromise(f(a)()))));
388
- /**
389
- * Collects an array of Options into an Option of array.
390
- * Returns None if any element is None.
391
- *
392
- * @example
393
- * ```ts
394
- * Arr.sequence([Option.some(1), Option.some(2)]); // Some([1, 2])
395
- * Arr.sequence([Option.some(1), Option.none()]); // None
396
- * ```
397
- */
398
- Arr.sequence = (data) => Arr.traverse((a) => a)(data);
399
- /**
400
- * Collects an array of Results into a Result of array.
401
- * Returns the first Err if any element is Err.
402
- */
403
- Arr.sequenceResult = (data) => Arr.traverseResult((a) => a)(data);
404
- /**
405
- * Collects an array of Tasks into a Task of array. Runs in parallel.
406
- */
407
- Arr.sequenceTask = (data) => Arr.traverseTask((a) => a)(data);
408
- /**
409
- * Maps each element to a TaskResult and runs them sequentially.
410
- * Returns the first Err encountered, or Ok of all results if all succeed.
411
- *
412
- * @example
413
- * ```ts
414
- * const validate = (n: number): TaskResult<string, number> =>
415
- * n > 0 ? TaskResult.ok(n) : TaskResult.err("non-positive");
416
- *
417
- * pipe(
418
- * [1, 2, 3],
419
- * Arr.traverseTaskResult(validate)
420
- * )(); // Deferred<Ok([1, 2, 3])>
421
- *
422
- * pipe(
423
- * [1, -1, 3],
424
- * Arr.traverseTaskResult(validate)
425
- * )(); // Deferred<Err("non-positive")>
426
- * ```
427
- */
428
- Arr.traverseTaskResult = (f) => (data) => Task_js_1.Task.from(async () => {
429
- const result = [];
430
- for (const a of data) {
431
- const r = await Deferred_js_1.Deferred.toPromise(f(a)());
432
- if (Result_js_1.Result.isErr(r))
433
- return r;
434
- result.push(r.value);
435
- }
436
- return Result_js_1.Result.ok(result);
437
- });
438
- /**
439
- * Collects an array of TaskResults into a TaskResult of array.
440
- * Returns the first Err if any element is Err, runs sequentially.
441
- */
442
- Arr.sequenceTaskResult = (data) => Arr.traverseTaskResult((a) => a)(data);
443
- /**
444
- * Returns true if the array is non-empty (type guard).
445
- */
446
- Arr.isNonEmpty = (data) => (0, NonEmptyList_js_1.isNonEmptyList)(data);
447
- /**
448
- * Returns the length of an array.
449
- */
450
- Arr.size = (data) => data.length;
451
- /**
452
- * Returns true if any element satisfies the predicate.
453
- *
454
- * @example
455
- * ```ts
456
- * pipe([1, 2, 3], Arr.some(n => n > 2)); // true
457
- * ```
458
- */
459
- Arr.some = (predicate) => (data) => {
460
- const n = data.length;
461
- for (let i = 0; i < n; i++)
462
- if (predicate(data[i]))
463
- return true;
464
- return false;
465
- };
466
- /**
467
- * Returns true if all elements satisfy the predicate.
468
- *
469
- * @example
470
- * ```ts
471
- * pipe([1, 2, 3], Arr.every(n => n > 0)); // true
472
- * ```
473
- */
474
- Arr.every = (predicate) => (data) => {
475
- const n = data.length;
476
- for (let i = 0; i < n; i++)
477
- if (!predicate(data[i]))
478
- return false;
479
- return true;
480
- };
481
- /**
482
- * Reverses an array. Returns a new array.
483
- *
484
- * @example
485
- * ```ts
486
- * Arr.reverse([1, 2, 3]); // [3, 2, 1]
487
- * ```
488
- */
489
- Arr.reverse = (data) => [...data].reverse();
490
- /**
491
- * Takes the first n elements from an array.
492
- *
493
- * @example
494
- * ```ts
495
- * pipe([1, 2, 3, 4], Arr.take(2)); // [1, 2]
496
- * ```
497
- */
498
- Arr.take = (n) => (data) => n <= 0 ? [] : data.slice(0, n);
499
- /**
500
- * Drops the first n elements from an array.
501
- *
502
- * @example
503
- * ```ts
504
- * pipe([1, 2, 3, 4], Arr.drop(2)); // [3, 4]
505
- * ```
506
- */
507
- Arr.drop = (n) => (data) => data.slice(n);
508
- /**
509
- * Takes elements from the start while the predicate holds.
510
- *
511
- * @example
512
- * ```ts
513
- * pipe([1, 2, 3, 1], Arr.takeWhile(n => n < 3)); // [1, 2]
514
- * ```
515
- */
516
- Arr.takeWhile = (predicate) => (data) => {
517
- const result = [];
518
- for (const a of data) {
519
- if (!predicate(a))
520
- break;
521
- result.push(a);
522
- }
523
- return result;
524
- };
525
- /**
526
- * Drops elements from the start while the predicate holds.
527
- *
528
- * @example
529
- * ```ts
530
- * pipe([1, 2, 3, 1], Arr.dropWhile(n => n < 3)); // [3, 1]
531
- * ```
532
- */
533
- Arr.dropWhile = (predicate) => (data) => {
534
- let i = 0;
535
- while (i < data.length && predicate(data[i]))
536
- i++;
537
- return data.slice(i);
538
- };
539
- /**
540
- * Like `reduce`, but returns every intermediate accumulator as an array.
541
- * The initial value is not included — the output has the same length as the input.
542
- *
543
- * @example
544
- * ```ts
545
- * pipe([1, 2, 3], Arr.scan(0, (acc, n) => acc + n)); // [1, 3, 6]
546
- * ```
547
- */
548
- Arr.scan = (initial, f) => (data) => {
549
- const n = data.length;
550
- const result = new Array(n);
551
- let acc = initial;
552
- for (let i = 0; i < n; i++) {
553
- acc = f(acc, data[i]);
554
- result[i] = acc;
555
- }
556
- return result;
557
- };
558
- /**
559
- * Splits an array at an index into a `[before, after]` tuple.
560
- * Negative indices clamp to 0; indices beyond the array length clamp to the end.
561
- *
562
- * @example
563
- * ```ts
564
- * pipe([1, 2, 3, 4], Arr.splitAt(2)); // [[1, 2], [3, 4]]
565
- * pipe([1, 2, 3], Arr.splitAt(0)); // [[], [1, 2, 3]]
566
- * pipe([1, 2, 3], Arr.splitAt(10)); // [[1, 2, 3], []]
567
- * ```
568
- */
569
- Arr.splitAt = (index) => (data) => {
570
- const i = Math.max(0, index);
571
- return [data.slice(0, i), data.slice(i)];
572
- };
573
- })(Arr || (exports.Arr = Arr = {}));
@@ -1,127 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Num = void 0;
4
- const Option_js_1 = require("../Core/Option.js");
5
- /**
6
- * Number utilities for common operations. All transformation functions are data-last
7
- * and curried so they compose naturally with `pipe` and `Arr.map`.
8
- *
9
- * @example
10
- * ```ts
11
- * import { Num } from "@nlozgachev/pipelined/utils";
12
- * import { pipe } from "@nlozgachev/pipelined/composition";
13
- *
14
- * pipe(
15
- * Num.range(1, 6),
16
- * Arr.map(Num.multiply(2)),
17
- * Arr.filter(Num.between(4, 8))
18
- * ); // [4, 6, 8]
19
- * ```
20
- */
21
- var Num;
22
- (function (Num) {
23
- /**
24
- * Generates an array of numbers from `from` to `to` (both inclusive),
25
- * stepping by `step` (default `1`). If `step` is negative or zero, or `from > to`,
26
- * returns an empty array. When `step` does not land exactly on `to`, the last value
27
- * is the largest reachable value that does not exceed `to`.
28
- *
29
- * @example
30
- * ```ts
31
- * Num.range(0, 5); // [0, 1, 2, 3, 4, 5]
32
- * Num.range(0, 10, 2); // [0, 2, 4, 6, 8, 10]
33
- * Num.range(0, 9, 2); // [0, 2, 4, 6, 8]
34
- * Num.range(5, 0); // []
35
- * Num.range(3, 3); // [3]
36
- * ```
37
- */
38
- Num.range = (from, to, step = 1) => {
39
- if (step <= 0 || from > to)
40
- return [];
41
- const count = Math.floor((to - from) / step) + 1;
42
- const result = new Array(count);
43
- for (let i = 0; i < count; i++) {
44
- result[i] = from + i * step;
45
- }
46
- return result;
47
- };
48
- /**
49
- * Clamps a number between `min` and `max` (both inclusive).
50
- *
51
- * @example
52
- * ```ts
53
- * pipe(150, Num.clamp(0, 100)); // 100
54
- * pipe(-5, Num.clamp(0, 100)); // 0
55
- * pipe(42, Num.clamp(0, 100)); // 42
56
- * ```
57
- */
58
- Num.clamp = (min, max) => (n) => Math.min(Math.max(n, min), max);
59
- /**
60
- * Returns `true` when the number is between `min` and `max` (both inclusive).
61
- *
62
- * @example
63
- * ```ts
64
- * pipe(5, Num.between(1, 10)); // true
65
- * pipe(0, Num.between(1, 10)); // false
66
- * pipe(10, Num.between(1, 10)); // true
67
- * ```
68
- */
69
- Num.between = (min, max) => (n) => n >= min && n <= max;
70
- /**
71
- * Parses a string as a number. Returns `None` when the result is `NaN`.
72
- *
73
- * @example
74
- * ```ts
75
- * Num.parse("42"); // Some(42)
76
- * Num.parse("3.14"); // Some(3.14)
77
- * Num.parse("abc"); // None
78
- * Num.parse(""); // None
79
- * ```
80
- */
81
- Num.parse = (s) => {
82
- if (s.trim() === "")
83
- return Option_js_1.Option.none();
84
- const n = Number(s);
85
- return isNaN(n) ? Option_js_1.Option.none() : Option_js_1.Option.some(n);
86
- };
87
- /**
88
- * Adds `b` to a number. Data-last: use in `pipe` or `Arr.map`.
89
- *
90
- * @example
91
- * ```ts
92
- * pipe(5, Num.add(3)); // 8
93
- * pipe([1, 2, 3], Arr.map(Num.add(10))); // [11, 12, 13]
94
- * ```
95
- */
96
- Num.add = (b) => (a) => a + b;
97
- /**
98
- * Subtracts `b` from a number. Data-last: `subtract(b)(a)` = `a - b`.
99
- *
100
- * @example
101
- * ```ts
102
- * pipe(10, Num.subtract(3)); // 7
103
- * pipe([5, 10, 15], Arr.map(Num.subtract(2))); // [3, 8, 13]
104
- * ```
105
- */
106
- Num.subtract = (b) => (a) => a - b;
107
- /**
108
- * Multiplies a number by `b`. Data-last: use in `pipe` or `Arr.map`.
109
- *
110
- * @example
111
- * ```ts
112
- * pipe(6, Num.multiply(7)); // 42
113
- * pipe([1, 2, 3], Arr.map(Num.multiply(100))); // [100, 200, 300]
114
- * ```
115
- */
116
- Num.multiply = (b) => (a) => a * b;
117
- /**
118
- * Divides a number by `b`. Data-last: `divide(b)(a)` = `a / b`.
119
- *
120
- * @example
121
- * ```ts
122
- * pipe(20, Num.divide(4)); // 5
123
- * pipe([10, 20, 30], Arr.map(Num.divide(10))); // [1, 2, 3]
124
- * ```
125
- */
126
- Num.divide = (b) => (a) => a / b;
127
- })(Num || (exports.Num = Num = {}));