@nlozgachev/pipekit 0.1.6

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 (100) hide show
  1. package/README.md +182 -0
  2. package/esm/mod.js +3 -0
  3. package/esm/package.json +3 -0
  4. package/esm/src/Composition/compose.js +3 -0
  5. package/esm/src/Composition/curry.js +42 -0
  6. package/esm/src/Composition/flip.js +20 -0
  7. package/esm/src/Composition/flow.js +8 -0
  8. package/esm/src/Composition/fn.js +85 -0
  9. package/esm/src/Composition/index.js +10 -0
  10. package/esm/src/Composition/memoize.js +66 -0
  11. package/esm/src/Composition/not.js +25 -0
  12. package/esm/src/Composition/pipe.js +3 -0
  13. package/esm/src/Composition/tap.js +33 -0
  14. package/esm/src/Composition/uncurry.js +32 -0
  15. package/esm/src/Core/Arr.js +461 -0
  16. package/esm/src/Core/InternalTypes.js +1 -0
  17. package/esm/src/Core/Option.js +195 -0
  18. package/esm/src/Core/Rec.js +167 -0
  19. package/esm/src/Core/RemoteData.js +210 -0
  20. package/esm/src/Core/Result.js +173 -0
  21. package/esm/src/Core/Task.js +108 -0
  22. package/esm/src/Core/TaskResult.js +63 -0
  23. package/esm/src/Core/Validation.js +215 -0
  24. package/esm/src/Core/index.js +8 -0
  25. package/esm/src/Types/NonEmptyList.js +14 -0
  26. package/esm/src/Types/index.js +1 -0
  27. package/package.json +60 -0
  28. package/script/mod.js +19 -0
  29. package/script/package.json +3 -0
  30. package/script/src/Composition/compose.js +6 -0
  31. package/script/src/Composition/curry.js +48 -0
  32. package/script/src/Composition/flip.js +24 -0
  33. package/script/src/Composition/flow.js +11 -0
  34. package/script/src/Composition/fn.js +98 -0
  35. package/script/src/Composition/index.js +26 -0
  36. package/script/src/Composition/memoize.js +71 -0
  37. package/script/src/Composition/not.js +29 -0
  38. package/script/src/Composition/pipe.js +6 -0
  39. package/script/src/Composition/tap.js +37 -0
  40. package/script/src/Composition/uncurry.js +38 -0
  41. package/script/src/Core/Arr.js +464 -0
  42. package/script/src/Core/InternalTypes.js +2 -0
  43. package/script/src/Core/Option.js +198 -0
  44. package/script/src/Core/Rec.js +170 -0
  45. package/script/src/Core/RemoteData.js +213 -0
  46. package/script/src/Core/Result.js +176 -0
  47. package/script/src/Core/Task.js +111 -0
  48. package/script/src/Core/TaskResult.js +66 -0
  49. package/script/src/Core/Validation.js +218 -0
  50. package/script/src/Core/index.js +24 -0
  51. package/script/src/Types/NonEmptyList.js +18 -0
  52. package/script/src/Types/index.js +17 -0
  53. package/types/mod.d.ts +4 -0
  54. package/types/mod.d.ts.map +1 -0
  55. package/types/src/Composition/compose.d.ts +33 -0
  56. package/types/src/Composition/compose.d.ts.map +1 -0
  57. package/types/src/Composition/curry.d.ts +43 -0
  58. package/types/src/Composition/curry.d.ts.map +1 -0
  59. package/types/src/Composition/flip.d.ts +21 -0
  60. package/types/src/Composition/flip.d.ts.map +1 -0
  61. package/types/src/Composition/flow.d.ts +56 -0
  62. package/types/src/Composition/flow.d.ts.map +1 -0
  63. package/types/src/Composition/fn.d.ts +76 -0
  64. package/types/src/Composition/fn.d.ts.map +1 -0
  65. package/types/src/Composition/index.d.ts +11 -0
  66. package/types/src/Composition/index.d.ts.map +1 -0
  67. package/types/src/Composition/memoize.d.ts +46 -0
  68. package/types/src/Composition/memoize.d.ts.map +1 -0
  69. package/types/src/Composition/not.d.ts +26 -0
  70. package/types/src/Composition/not.d.ts.map +1 -0
  71. package/types/src/Composition/pipe.d.ts +56 -0
  72. package/types/src/Composition/pipe.d.ts.map +1 -0
  73. package/types/src/Composition/tap.d.ts +31 -0
  74. package/types/src/Composition/tap.d.ts.map +1 -0
  75. package/types/src/Composition/uncurry.d.ts +54 -0
  76. package/types/src/Composition/uncurry.d.ts.map +1 -0
  77. package/types/src/Core/Arr.d.ts +355 -0
  78. package/types/src/Core/Arr.d.ts.map +1 -0
  79. package/types/src/Core/InternalTypes.d.ts +14 -0
  80. package/types/src/Core/InternalTypes.d.ts.map +1 -0
  81. package/types/src/Core/Option.d.ts +214 -0
  82. package/types/src/Core/Option.d.ts.map +1 -0
  83. package/types/src/Core/Rec.d.ts +121 -0
  84. package/types/src/Core/Rec.d.ts.map +1 -0
  85. package/types/src/Core/RemoteData.d.ts +196 -0
  86. package/types/src/Core/RemoteData.d.ts.map +1 -0
  87. package/types/src/Core/Result.d.ts +185 -0
  88. package/types/src/Core/Result.d.ts.map +1 -0
  89. package/types/src/Core/Task.d.ts +125 -0
  90. package/types/src/Core/Task.d.ts.map +1 -0
  91. package/types/src/Core/TaskResult.d.ts +78 -0
  92. package/types/src/Core/TaskResult.d.ts.map +1 -0
  93. package/types/src/Core/Validation.d.ts +217 -0
  94. package/types/src/Core/Validation.d.ts.map +1 -0
  95. package/types/src/Core/index.d.ts +9 -0
  96. package/types/src/Core/index.d.ts.map +1 -0
  97. package/types/src/Types/NonEmptyList.d.ts +29 -0
  98. package/types/src/Types/NonEmptyList.d.ts.map +1 -0
  99. package/types/src/Types/index.d.ts +2 -0
  100. package/types/src/Types/index.d.ts.map +1 -0
@@ -0,0 +1,355 @@
1
+ import { Option } from "./Option.js";
2
+ import { Result } from "./Result.js";
3
+ import { Task } from "./Task.js";
4
+ import { NonEmptyList } from "../Types/NonEmptyList.js";
5
+ /**
6
+ * Functional array utilities that compose well with pipe.
7
+ * All functions are data-last and curried where applicable.
8
+ * Safe access functions return Option instead of throwing or returning undefined.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * pipe(
13
+ * [1, 2, 3, 4, 5],
14
+ * Arr.filter(n => n > 2),
15
+ * Arr.map(n => n * 10),
16
+ * Arr.head
17
+ * ); // Some(30)
18
+ * ```
19
+ */
20
+ export declare namespace Arr {
21
+ /**
22
+ * Returns the first element of an array, or None if the array is empty.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * Arr.head([1, 2, 3]); // Some(1)
27
+ * Arr.head([]); // None
28
+ * ```
29
+ */
30
+ const head: <A>(data: readonly A[]) => Option<A>;
31
+ /**
32
+ * Returns the last element of an array, or None if the array is empty.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * Arr.last([1, 2, 3]); // Some(3)
37
+ * Arr.last([]); // None
38
+ * ```
39
+ */
40
+ const last: <A>(data: readonly A[]) => Option<A>;
41
+ /**
42
+ * Returns all elements except the first, or None if the array is empty.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * Arr.tail([1, 2, 3]); // Some([2, 3])
47
+ * Arr.tail([]); // None
48
+ * ```
49
+ */
50
+ const tail: <A>(data: readonly A[]) => Option<readonly A[]>;
51
+ /**
52
+ * Returns all elements except the last, or None if the array is empty.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * Arr.init([1, 2, 3]); // Some([1, 2])
57
+ * Arr.init([]); // None
58
+ * ```
59
+ */
60
+ const init: <A>(data: readonly A[]) => Option<readonly A[]>;
61
+ /**
62
+ * Returns the first element matching the predicate, or None.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * pipe([1, 2, 3, 4], Arr.findFirst(n => n > 2)); // Some(3)
67
+ * ```
68
+ */
69
+ const findFirst: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => Option<A>;
70
+ /**
71
+ * Returns the last element matching the predicate, or None.
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * pipe([1, 2, 3, 4], Arr.findLast(n => n > 2)); // Some(4)
76
+ * ```
77
+ */
78
+ const findLast: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => Option<A>;
79
+ /**
80
+ * Returns the index of the first element matching the predicate, or None.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * pipe([1, 2, 3, 4], Arr.findIndex(n => n > 2)); // Some(2)
85
+ * ```
86
+ */
87
+ const findIndex: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => Option<number>;
88
+ /**
89
+ * Transforms each element of an array.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * pipe([1, 2, 3], Arr.map(n => n * 2)); // [2, 4, 6]
94
+ * ```
95
+ */
96
+ const map: <A, B>(f: (a: A) => B) => (data: readonly A[]) => readonly B[];
97
+ /**
98
+ * Filters elements that satisfy the predicate.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * pipe([1, 2, 3, 4], Arr.filter(n => n % 2 === 0)); // [2, 4]
103
+ * ```
104
+ */
105
+ const filter: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => readonly A[];
106
+ /**
107
+ * Splits an array into two groups based on a predicate.
108
+ * First group contains elements that satisfy the predicate,
109
+ * second group contains the rest.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * pipe([1, 2, 3, 4], Arr.partition(n => n % 2 === 0)); // [[2, 4], [1, 3]]
114
+ * ```
115
+ */
116
+ const partition: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => readonly [readonly A[], readonly A[]];
117
+ /**
118
+ * Groups elements by a key function.
119
+ *
120
+ * @example
121
+ * ```ts
122
+ * pipe(
123
+ * ["apple", "avocado", "banana"],
124
+ * Arr.groupBy(s => s[0])
125
+ * ); // { a: ["apple", "avocado"], b: ["banana"] }
126
+ * ```
127
+ */
128
+ const groupBy: <A>(f: (a: A) => string) => (data: readonly A[]) => Record<string, NonEmptyList<A>>;
129
+ /**
130
+ * Removes duplicate elements using strict equality.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * Arr.uniq([1, 2, 2, 3, 1]); // [1, 2, 3]
135
+ * ```
136
+ */
137
+ const uniq: <A>(data: readonly A[]) => readonly A[];
138
+ /**
139
+ * Removes duplicate elements by comparing the result of a key function.
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * pipe(
144
+ * [{id: 1, name: "a"}, {id: 1, name: "b"}, {id: 2, name: "c"}],
145
+ * Arr.uniqBy(x => x.id)
146
+ * ); // [{id: 1, name: "a"}, {id: 2, name: "c"}]
147
+ * ```
148
+ */
149
+ const uniqBy: <A, B>(f: (a: A) => B) => (data: readonly A[]) => readonly A[];
150
+ /**
151
+ * Sorts an array using a comparison function. Returns a new array.
152
+ *
153
+ * @example
154
+ * ```ts
155
+ * pipe([3, 1, 2], Arr.sortBy((a, b) => a - b)); // [1, 2, 3]
156
+ * ```
157
+ */
158
+ const sortBy: <A>(compare: (a: A, b: A) => number) => (data: readonly A[]) => readonly A[];
159
+ /**
160
+ * Pairs up elements from two arrays. Stops at the shorter array.
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * pipe([1, 2, 3], Arr.zip(["a", "b"])); // [[1, "a"], [2, "b"]]
165
+ * ```
166
+ */
167
+ const zip: <B>(other: readonly B[]) => <A>(data: readonly A[]) => readonly (readonly [A, B])[];
168
+ /**
169
+ * Combines elements from two arrays using a function. Stops at the shorter array.
170
+ *
171
+ * @example
172
+ * ```ts
173
+ * pipe([1, 2], Arr.zipWith((a, b) => a + b, ["a", "b"])); // ["1a", "2b"]
174
+ * ```
175
+ */
176
+ const zipWith: <A, B, C>(f: (a: A, b: B) => C, other: readonly B[]) => (data: readonly A[]) => readonly C[];
177
+ /**
178
+ * Inserts a separator between every element.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * pipe([1, 2, 3], Arr.intersperse(0)); // [1, 0, 2, 0, 3]
183
+ * ```
184
+ */
185
+ const intersperse: <A>(sep: A) => (data: readonly A[]) => readonly A[];
186
+ /**
187
+ * Splits an array into chunks of the given size.
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * pipe([1, 2, 3, 4, 5], Arr.chunksOf(2)); // [[1, 2], [3, 4], [5]]
192
+ * ```
193
+ */
194
+ const chunksOf: (n: number) => <A>(data: readonly A[]) => readonly (readonly A[])[];
195
+ /**
196
+ * Flattens a nested array by one level.
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * Arr.flatten([[1, 2], [3], [4, 5]]); // [1, 2, 3, 4, 5]
201
+ * ```
202
+ */
203
+ const flatten: <A>(data: readonly (readonly A[])[]) => readonly A[];
204
+ /**
205
+ * Maps each element to an array and flattens the result.
206
+ *
207
+ * @example
208
+ * ```ts
209
+ * pipe([1, 2, 3], Arr.flatMap(n => [n, n * 10])); // [1, 10, 2, 20, 3, 30]
210
+ * ```
211
+ */
212
+ const flatMap: <A, B>(f: (a: A) => readonly B[]) => (data: readonly A[]) => readonly B[];
213
+ /**
214
+ * Reduces an array from the left.
215
+ *
216
+ * @example
217
+ * ```ts
218
+ * pipe([1, 2, 3], Arr.reduce(0, (acc, n) => acc + n)); // 6
219
+ * ```
220
+ */
221
+ const reduce: <A, B>(initial: B, f: (acc: B, a: A) => B) => (data: readonly A[]) => B;
222
+ /**
223
+ * Maps each element to an Option and collects the results.
224
+ * Returns None if any mapping returns None.
225
+ *
226
+ * @example
227
+ * ```ts
228
+ * const parseNum = (s: string): Option<number> => {
229
+ * const n = Number(s);
230
+ * return isNaN(n) ? Option.toNone() : Option.of(n);
231
+ * };
232
+ *
233
+ * pipe(["1", "2", "3"], Arr.traverse(parseNum)); // Some([1, 2, 3])
234
+ * pipe(["1", "x", "3"], Arr.traverse(parseNum)); // None
235
+ * ```
236
+ */
237
+ const traverse: <A, B>(f: (a: A) => Option<B>) => (data: readonly A[]) => Option<readonly B[]>;
238
+ /**
239
+ * Maps each element to a Result and collects the results.
240
+ * Returns the first Err if any mapping fails.
241
+ *
242
+ * @example
243
+ * ```ts
244
+ * pipe(
245
+ * [1, 2, 3],
246
+ * Arr.traverseResult(n => n > 0 ? Result.toOk(n) : Result.toErr("negative"))
247
+ * ); // Ok([1, 2, 3])
248
+ * ```
249
+ */
250
+ const traverseResult: <E, A, B>(f: (a: A) => Result<E, B>) => (data: readonly A[]) => Result<E, readonly B[]>;
251
+ /**
252
+ * Maps each element to a Task and runs all in parallel.
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * pipe(
257
+ * [1, 2, 3],
258
+ * Arr.traverseTask(n => Task.of(n * 2))
259
+ * )(); // Promise<[2, 4, 6]>
260
+ * ```
261
+ */
262
+ const traverseTask: <A, B>(f: (a: A) => Task<B>) => (data: readonly A[]) => Task<readonly B[]>;
263
+ /**
264
+ * Collects an array of Options into an Option of array.
265
+ * Returns None if any element is None.
266
+ *
267
+ * @example
268
+ * ```ts
269
+ * Arr.sequence([Option.of(1), Option.of(2)]); // Some([1, 2])
270
+ * Arr.sequence([Option.of(1), Option.toNone()]); // None
271
+ * ```
272
+ */
273
+ const sequence: <A>(data: readonly Option<A>[]) => Option<readonly A[]>;
274
+ /**
275
+ * Collects an array of Results into a Result of array.
276
+ * Returns the first Err if any element is Err.
277
+ */
278
+ const sequenceResult: <E, A>(data: readonly Result<E, A>[]) => Result<E, readonly A[]>;
279
+ /**
280
+ * Collects an array of Tasks into a Task of array. Runs in parallel.
281
+ */
282
+ const sequenceTask: <A>(data: readonly Task<A>[]) => Task<readonly A[]>;
283
+ /**
284
+ * Returns true if the array is non-empty (type guard).
285
+ */
286
+ const isNonEmpty: <A>(data: readonly A[]) => data is NonEmptyList<A>;
287
+ /**
288
+ * Returns the length of an array.
289
+ */
290
+ const size: <A>(data: readonly A[]) => number;
291
+ /**
292
+ * Returns true if any element satisfies the predicate.
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * pipe([1, 2, 3], Arr.some(n => n > 2)); // true
297
+ * ```
298
+ */
299
+ const some: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => boolean;
300
+ /**
301
+ * Returns true if all elements satisfy the predicate.
302
+ *
303
+ * @example
304
+ * ```ts
305
+ * pipe([1, 2, 3], Arr.every(n => n > 0)); // true
306
+ * ```
307
+ */
308
+ const every: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => boolean;
309
+ /**
310
+ * Reverses an array. Returns a new array.
311
+ *
312
+ * @example
313
+ * ```ts
314
+ * Arr.reverse([1, 2, 3]); // [3, 2, 1]
315
+ * ```
316
+ */
317
+ const reverse: <A>(data: readonly A[]) => readonly A[];
318
+ /**
319
+ * Takes the first n elements from an array.
320
+ *
321
+ * @example
322
+ * ```ts
323
+ * pipe([1, 2, 3, 4], Arr.take(2)); // [1, 2]
324
+ * ```
325
+ */
326
+ const take: (n: number) => <A>(data: readonly A[]) => readonly A[];
327
+ /**
328
+ * Drops the first n elements from an array.
329
+ *
330
+ * @example
331
+ * ```ts
332
+ * pipe([1, 2, 3, 4], Arr.drop(2)); // [3, 4]
333
+ * ```
334
+ */
335
+ const drop: (n: number) => <A>(data: readonly A[]) => readonly A[];
336
+ /**
337
+ * Takes elements from the start while the predicate holds.
338
+ *
339
+ * @example
340
+ * ```ts
341
+ * pipe([1, 2, 3, 1], Arr.takeWhile(n => n < 3)); // [1, 2]
342
+ * ```
343
+ */
344
+ const takeWhile: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => readonly A[];
345
+ /**
346
+ * Drops elements from the start while the predicate holds.
347
+ *
348
+ * @example
349
+ * ```ts
350
+ * pipe([1, 2, 3, 1], Arr.dropWhile(n => n < 3)); // [3, 1]
351
+ * ```
352
+ */
353
+ const dropWhile: <A>(predicate: (a: A) => boolean) => (data: readonly A[]) => readonly A[];
354
+ }
355
+ //# sourceMappingURL=Arr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Arr.d.ts","sourceRoot":"","sources":["../../../src/src/Core/Arr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { NonEmptyList } from "../Types/NonEmptyList.js";
2
+ export type WithKind<K extends string> = {
3
+ readonly kind: K;
4
+ };
5
+ export type WithValue<T> = {
6
+ readonly value: T;
7
+ };
8
+ export type WithError<T> = {
9
+ readonly error: T;
10
+ };
11
+ export type WithErrors<T> = {
12
+ readonly errors: NonEmptyList<T>;
13
+ };
14
+ //# sourceMappingURL=InternalTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalTypes.d.ts","sourceRoot":"","sources":["../../../src/src/Core/InternalTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI;IAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC"}
@@ -0,0 +1,214 @@
1
+ import { WithKind, WithValue } from "./InternalTypes.js";
2
+ import { Result } from "./Result.js";
3
+ /**
4
+ * Option represents an optional value: every Option is either Some (contains a value) or None (empty).
5
+ * Use Option instead of null/undefined to make optionality explicit and composable.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const findUser = (id: string): Option<User> =>
10
+ * users.has(id) ? Option.of(users.get(id)!) : Option.toNone();
11
+ *
12
+ * pipe(
13
+ * findUser("123"),
14
+ * Option.map(user => user.name),
15
+ * Option.getOrElse("Unknown")
16
+ * );
17
+ * ```
18
+ */
19
+ export type Option<T> = Some<T> | None;
20
+ export type Some<A> = WithKind<"Some"> & WithValue<A>;
21
+ export type None = WithKind<"None">;
22
+ export declare namespace Option {
23
+ /**
24
+ * Wraps a value in a Some.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * Option.of(42); // Some(42)
29
+ * ```
30
+ */
31
+ const of: <A>(value: A) => Option<A>;
32
+ /**
33
+ * Creates a Some containing the given value.
34
+ */
35
+ const toSome: <A>(value: A) => Some<A>;
36
+ /**
37
+ * Type guard that checks if a Option is Some.
38
+ */
39
+ const isSome: <A>(data: Option<A>) => data is Some<A>;
40
+ /**
41
+ * Creates a None (empty Option).
42
+ */
43
+ const toNone: () => None;
44
+ /**
45
+ * Type guard that checks if a Option is None.
46
+ */
47
+ const isNone: <A>(data: Option<A>) => data is None;
48
+ /**
49
+ * Creates a Option from a nullable value.
50
+ * Returns None if the value is null or undefined, Some otherwise.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * Option.fromNullable(null); // None
55
+ * Option.fromNullable(42); // Some(42)
56
+ * ```
57
+ */
58
+ const fromNullable: <A>(value: A | null | undefined) => Option<A>;
59
+ /**
60
+ * Extracts the value from a Option, returning null if None.
61
+ */
62
+ const toNullable: <A>(data: Option<A>) => A | null;
63
+ /**
64
+ * Extracts the value from a Option, returning undefined if None.
65
+ */
66
+ const toUndefined: <A>(data: Option<A>) => A | undefined;
67
+ /**
68
+ * Creates a Option from a possibly undefined value.
69
+ * Returns None if undefined, Some otherwise.
70
+ */
71
+ const fromUndefined: <A>(value: A | undefined) => Option<A>;
72
+ /**
73
+ * Converts an Option to a Result.
74
+ * Some becomes Ok, None becomes Err with the provided error.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * pipe(
79
+ * Option.of(42),
80
+ * Option.toResult(() => "Value was missing")
81
+ * ); // Ok(42)
82
+ *
83
+ * pipe(
84
+ * Option.toNone(),
85
+ * Option.toResult(() => "Value was missing")
86
+ * ); // Err("Value was missing")
87
+ * ```
88
+ */
89
+ const toResult: <E>(onNone: () => E) => <A>(data: Option<A>) => Result<E, A>;
90
+ /**
91
+ * Creates an Option from a Result.
92
+ * Ok becomes Some, Err becomes None (the error is discarded).
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * Option.fromResult(Result.toOk(42)); // Some(42)
97
+ * Option.fromResult(Result.toErr("oops")); // None
98
+ * ```
99
+ */
100
+ const fromResult: <E, A>(data: Result<E, A>) => Option<A>;
101
+ /**
102
+ * Transforms the value inside a Option if it exists.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * pipe(Option.of(5), Option.map(n => n * 2)); // Some(10)
107
+ * pipe(Option.toNone(), Option.map(n => n * 2)); // None
108
+ * ```
109
+ */
110
+ const map: <A, B>(f: (a: A) => B) => (data: Option<A>) => Option<B>;
111
+ /**
112
+ * Chains Option computations. If the first is Some, passes the value to f.
113
+ * If the first is None, propagates None.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * const parseNumber = (s: string): Option<number> => {
118
+ * const n = parseInt(s, 10);
119
+ * return isNaN(n) ? Option.toNone() : Option.of(n);
120
+ * };
121
+ *
122
+ * pipe(Option.of("42"), Option.chain(parseNumber)); // Some(42)
123
+ * pipe(Option.of("abc"), Option.chain(parseNumber)); // None
124
+ * ```
125
+ */
126
+ const chain: <A, B>(f: (a: A) => Option<B>) => (data: Option<A>) => Option<B>;
127
+ /**
128
+ * Extracts the value from a Option by providing handlers for both cases.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * pipe(
133
+ * Option.of(5),
134
+ * Option.fold(
135
+ * () => "No value",
136
+ * n => `Value: ${n}`
137
+ * )
138
+ * ); // "Value: 5"
139
+ * ```
140
+ */
141
+ const fold: <A, B>(onNone: () => B, onSome: (a: A) => B) => (data: Option<A>) => B;
142
+ /**
143
+ * Pattern matches on a Option, returning the result of the matching case.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * pipe(
148
+ * optionUser,
149
+ * Option.match({
150
+ * some: user => `Hello, ${user.name}`,
151
+ * none: () => "Hello, stranger"
152
+ * })
153
+ * );
154
+ * ```
155
+ */
156
+ const match: <A, B>(cases: {
157
+ none: () => B;
158
+ some: (a: A) => B;
159
+ }) => (data: Option<A>) => B;
160
+ /**
161
+ * Returns the value inside a Option, or a default value if None.
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * pipe(Option.of(5), Option.getOrElse(0)); // 5
166
+ * pipe(Option.toNone(), Option.getOrElse(0)); // 0
167
+ * ```
168
+ */
169
+ const getOrElse: <A>(defaultValue: A) => (data: Option<A>) => A;
170
+ /**
171
+ * Executes a side effect on the value without changing the Option.
172
+ * Useful for logging or debugging.
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * pipe(
177
+ * Option.of(5),
178
+ * Option.tap(n => console.log("Value:", n)),
179
+ * Option.map(n => n * 2)
180
+ * );
181
+ * ```
182
+ */
183
+ const tap: <A>(f: (a: A) => void) => (data: Option<A>) => Option<A>;
184
+ /**
185
+ * Filters a Option based on a predicate.
186
+ * Returns None if the predicate returns false or if the Option is already None.
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * pipe(Option.of(5), Option.filter(n => n > 3)); // Some(5)
191
+ * pipe(Option.of(2), Option.filter(n => n > 3)); // None
192
+ * ```
193
+ */
194
+ const filter: <A>(predicate: (a: A) => boolean) => (data: Option<A>) => Option<A>;
195
+ /**
196
+ * Recovers from a None by providing a fallback Option.
197
+ */
198
+ const recover: <A>(fallback: () => Option<A>) => (data: Option<A>) => Option<A>;
199
+ /**
200
+ * Applies a function wrapped in a Option to a value wrapped in a Option.
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * const add = (a: number) => (b: number) => a + b;
205
+ * pipe(
206
+ * Option.of(add),
207
+ * Option.ap(Option.of(5)),
208
+ * Option.ap(Option.of(3))
209
+ * ); // Some(8)
210
+ * ```
211
+ */
212
+ const ap: <A>(arg: Option<A>) => <B>(data: Option<(a: A) => B>) => Option<B>;
213
+ }
214
+ //# sourceMappingURL=Option.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../../../src/src/Core/Option.ts"],"names":[],"mappings":"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"}