@satoshibits/functional 1.0.3 → 1.1.2

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 (134) hide show
  1. package/README.md +28 -145
  2. package/dist/array-utils.d.mts +13 -0
  3. package/dist/array-utils.d.mts.map +1 -1
  4. package/dist/array-utils.mjs +19 -3
  5. package/dist/array-utils.mjs.map +1 -1
  6. package/dist/array-utils.test.d.ts +2 -0
  7. package/dist/array-utils.test.d.ts.map +1 -0
  8. package/dist/array-utils.test.js +256 -0
  9. package/dist/array-utils.test.js.map +1 -0
  10. package/dist/composition.d.mts +53 -6
  11. package/dist/composition.d.mts.map +1 -1
  12. package/dist/composition.mjs +111 -22
  13. package/dist/composition.mjs.map +1 -1
  14. package/dist/composition.test.d.ts +2 -0
  15. package/dist/composition.test.d.ts.map +1 -0
  16. package/dist/composition.test.js +409 -0
  17. package/dist/composition.test.js.map +1 -0
  18. package/dist/index.d.mts +10 -5
  19. package/dist/index.d.mts.map +1 -1
  20. package/dist/index.mjs +10 -5
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/integration.test.d.mts +2 -0
  23. package/dist/integration.test.d.mts.map +1 -0
  24. package/dist/integration.test.mjs +486 -0
  25. package/dist/integration.test.mjs.map +1 -0
  26. package/dist/io.d.mts +338 -0
  27. package/dist/io.d.mts.map +1 -0
  28. package/dist/io.mjs +389 -0
  29. package/dist/io.mjs.map +1 -0
  30. package/dist/io.test.d.mts +2 -0
  31. package/dist/io.test.d.mts.map +1 -0
  32. package/dist/io.test.mjs +373 -0
  33. package/dist/io.test.mjs.map +1 -0
  34. package/dist/laws.test.d.mts +2 -0
  35. package/dist/laws.test.d.mts.map +1 -0
  36. package/dist/laws.test.mjs +614 -0
  37. package/dist/laws.test.mjs.map +1 -0
  38. package/dist/object-utils.d.mts +11 -0
  39. package/dist/object-utils.d.mts.map +1 -1
  40. package/dist/object-utils.mjs +11 -0
  41. package/dist/object-utils.mjs.map +1 -1
  42. package/dist/object-utils.test.d.ts +2 -0
  43. package/dist/object-utils.test.d.ts.map +1 -0
  44. package/dist/object-utils.test.js +286 -0
  45. package/dist/object-utils.test.js.map +1 -0
  46. package/dist/option-additions.test.d.mts +2 -0
  47. package/dist/option-additions.test.d.mts.map +1 -0
  48. package/dist/option-additions.test.mjs +325 -0
  49. package/dist/option-additions.test.mjs.map +1 -0
  50. package/dist/option.d.mts +202 -58
  51. package/dist/option.d.mts.map +1 -1
  52. package/dist/option.mjs +271 -63
  53. package/dist/option.mjs.map +1 -1
  54. package/dist/option.test.d.ts +6 -0
  55. package/dist/option.test.d.ts.map +1 -0
  56. package/dist/option.test.js +606 -0
  57. package/dist/option.test.js.map +1 -0
  58. package/dist/performance.d.mts +27 -10
  59. package/dist/performance.d.mts.map +1 -1
  60. package/dist/performance.mjs +42 -20
  61. package/dist/performance.mjs.map +1 -1
  62. package/dist/performance.test.d.ts +2 -0
  63. package/dist/performance.test.d.ts.map +1 -0
  64. package/dist/performance.test.js +424 -0
  65. package/dist/performance.test.js.map +1 -0
  66. package/dist/pipeline.d.mts +12 -0
  67. package/dist/pipeline.d.mts.map +1 -1
  68. package/dist/pipeline.mjs +12 -0
  69. package/dist/pipeline.mjs.map +1 -1
  70. package/dist/pipeline.test.d.ts +2 -0
  71. package/dist/pipeline.test.d.ts.map +1 -0
  72. package/dist/pipeline.test.js +445 -0
  73. package/dist/pipeline.test.js.map +1 -0
  74. package/dist/predicates.d.mts +12 -0
  75. package/dist/predicates.d.mts.map +1 -1
  76. package/dist/predicates.mjs +12 -0
  77. package/dist/predicates.mjs.map +1 -1
  78. package/dist/predicates.test.d.ts +2 -0
  79. package/dist/predicates.test.d.ts.map +1 -0
  80. package/dist/predicates.test.js +375 -0
  81. package/dist/predicates.test.js.map +1 -0
  82. package/dist/reader-result.d.mts +37 -16
  83. package/dist/reader-result.d.mts.map +1 -1
  84. package/dist/reader-result.mjs +37 -16
  85. package/dist/reader-result.mjs.map +1 -1
  86. package/dist/reader-result.test.d.ts +2 -0
  87. package/dist/reader-result.test.d.ts.map +1 -0
  88. package/dist/reader-result.test.js +1259 -0
  89. package/dist/reader-result.test.js.map +1 -0
  90. package/dist/reader.d.mts +443 -0
  91. package/dist/reader.d.mts.map +1 -0
  92. package/dist/reader.mjs +456 -0
  93. package/dist/reader.mjs.map +1 -0
  94. package/dist/reader.test.d.mts +2 -0
  95. package/dist/reader.test.d.mts.map +1 -0
  96. package/dist/reader.test.mjs +288 -0
  97. package/dist/reader.test.mjs.map +1 -0
  98. package/dist/result-additions.test.d.mts +2 -0
  99. package/dist/result-additions.test.d.mts.map +1 -0
  100. package/dist/result-additions.test.mjs +325 -0
  101. package/dist/result-additions.test.mjs.map +1 -0
  102. package/dist/result.d.mts +208 -0
  103. package/dist/result.d.mts.map +1 -1
  104. package/dist/result.mjs +287 -0
  105. package/dist/result.mjs.map +1 -1
  106. package/dist/result.test.d.ts +2 -0
  107. package/dist/result.test.d.ts.map +1 -0
  108. package/dist/result.test.js +453 -0
  109. package/dist/result.test.js.map +1 -0
  110. package/dist/task.d.mts +374 -0
  111. package/dist/task.d.mts.map +1 -0
  112. package/dist/task.mjs +386 -0
  113. package/dist/task.mjs.map +1 -0
  114. package/dist/task.test.d.mts +2 -0
  115. package/dist/task.test.d.mts.map +1 -0
  116. package/dist/task.test.mjs +1006 -0
  117. package/dist/task.test.mjs.map +1 -0
  118. package/dist/types.d.mts +12 -0
  119. package/dist/types.d.mts.map +1 -1
  120. package/dist/types.mjs +12 -0
  121. package/dist/types.mjs.map +1 -1
  122. package/dist/types.test.d.ts +6 -0
  123. package/dist/types.test.d.ts.map +1 -0
  124. package/dist/types.test.js +447 -0
  125. package/dist/types.test.js.map +1 -0
  126. package/dist/validation.d.mts +12 -0
  127. package/dist/validation.d.mts.map +1 -1
  128. package/dist/validation.mjs +22 -4
  129. package/dist/validation.mjs.map +1 -1
  130. package/dist/validation.test.d.ts +2 -0
  131. package/dist/validation.test.d.ts.map +1 -0
  132. package/dist/validation.test.js +518 -0
  133. package/dist/validation.test.js.map +1 -0
  134. package/package.json +77 -13
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ import { describe, expect, it } from "vitest";
3
+ import { Reader } from "./reader.mjs";
4
+ describe("Reader", function () {
5
+ var testConfig = {
6
+ apiUrl: "https://test.api",
7
+ timeout: 5000,
8
+ debug: true,
9
+ };
10
+ describe("of", function () {
11
+ it("should create a Reader that returns the value ignoring environment", function () {
12
+ var reader = Reader.of(42);
13
+ expect(Reader.run(testConfig)(reader)).toBe(42);
14
+ });
15
+ it("should work with any environment", function () {
16
+ var reader = Reader.of("constant");
17
+ var config1 = { apiUrl: "url1", timeout: 1000, debug: false };
18
+ var config2 = { apiUrl: "url2", timeout: 2000, debug: true };
19
+ expect(Reader.run(config1)(reader)).toBe("constant");
20
+ expect(Reader.run(config2)(reader)).toBe("constant");
21
+ });
22
+ });
23
+ describe("ask", function () {
24
+ it("should provide the full environment", function () {
25
+ var reader = Reader.ask();
26
+ expect(Reader.run(testConfig)(reader)).toEqual(testConfig);
27
+ });
28
+ it("should return different environments when run with different configs", function () {
29
+ var reader = Reader.ask();
30
+ var config1 = { apiUrl: "url1", timeout: 1000, debug: false };
31
+ var config2 = { apiUrl: "url2", timeout: 2000, debug: true };
32
+ expect(Reader.run(config1)(reader)).toEqual(config1);
33
+ expect(Reader.run(config2)(reader)).toEqual(config2);
34
+ });
35
+ });
36
+ describe("asks", function () {
37
+ it("should select a part of the environment", function () {
38
+ var getApiUrl = Reader.asks(function (c) { return c.apiUrl; });
39
+ expect(Reader.run(testConfig)(getApiUrl)).toBe("https://test.api");
40
+ });
41
+ it("should work with nested selections", function () {
42
+ var appConfig = {
43
+ region: "us-east",
44
+ service: {
45
+ config: testConfig,
46
+ },
47
+ };
48
+ var getTimeout = Reader.asks(function (ac) { return ac.service.config.timeout; });
49
+ expect(Reader.run(appConfig)(getTimeout)).toBe(5000);
50
+ });
51
+ });
52
+ describe("map", function () {
53
+ it("should transform the value", function () {
54
+ var getTimeout = Reader.asks(function (c) { return c.timeout; });
55
+ var inSeconds = Reader.map(function (ms) { return ms / 1000; });
56
+ var reader = inSeconds(getTimeout);
57
+ expect(Reader.run(testConfig)(reader)).toBe(5);
58
+ });
59
+ it("should chain transformations", function () {
60
+ var getDebug = Reader.asks(function (c) { return c.debug; });
61
+ var reader = Reader.map(function (s) { return s.length; })(Reader.map(function (b) { return b.toString(); })(getDebug));
62
+ expect(Reader.run(testConfig)(reader)).toBe(4); // "true".length
63
+ });
64
+ });
65
+ describe("chain / flatMap", function () {
66
+ it("should sequence dependent computations", function () {
67
+ var getUrl = Reader.asks(function (c) { return c.apiUrl; });
68
+ var createRequest = function (url) {
69
+ return Reader.asks(function (c) { return ({
70
+ url: url,
71
+ timeout: c.timeout,
72
+ }); });
73
+ };
74
+ var program = Reader.chain(createRequest)(getUrl);
75
+ var result = Reader.run(testConfig)(program);
76
+ expect(result).toEqual({
77
+ url: "https://test.api",
78
+ timeout: 5000,
79
+ });
80
+ });
81
+ it("flatMap should be an alias for chain", function () {
82
+ var reader1 = Reader.of(5);
83
+ var reader2 = function (n) { return Reader.of(n * 2); };
84
+ var chained = Reader.chain(reader2)(reader1);
85
+ var flatMapped = Reader.flatMap(reader2)(reader1);
86
+ expect(Reader.run(testConfig)(chained)).toBe(10);
87
+ expect(Reader.run(testConfig)(flatMapped)).toBe(10);
88
+ });
89
+ });
90
+ describe("ap", function () {
91
+ it("should apply a Reader of a function to a Reader of a value", function () {
92
+ var add = function (a) { return function (b) { return a + b; }; };
93
+ var getTimeout = Reader.asks(function (c) { return c.timeout; });
94
+ var readerAdd = Reader.map(add)(getTimeout);
95
+ var readerValue = Reader.of(1000);
96
+ var result = Reader.ap(readerValue)(readerAdd);
97
+ expect(Reader.run(testConfig)(result)).toBe(6000);
98
+ });
99
+ it("should work with multiple dependencies", function () {
100
+ var config2 = { x: 5, y: 3 };
101
+ var add = function (a) { return function (b) { return a + b; }; };
102
+ var getX = Reader.asks(function (c) { return c.x; });
103
+ var getY = Reader.asks(function (c) { return c.y; });
104
+ var sum = Reader.ap(getY)(Reader.map(add)(getX));
105
+ expect(Reader.run(config2)(sum)).toBe(8);
106
+ });
107
+ });
108
+ describe("local", function () {
109
+ it("should modify the environment for a sub-computation", function () {
110
+ var appConfig = {
111
+ region: "us-east",
112
+ service: {
113
+ config: testConfig,
114
+ },
115
+ };
116
+ var getTimeout = Reader.asks(function (c) { return c.timeout; });
117
+ var program = Reader.local(function (ac) { return ac.service.config; })(getTimeout);
118
+ expect(Reader.run(appConfig)(program)).toBe(5000);
119
+ });
120
+ it("should work with nested local transformations", function () {
121
+ var globalConfig = {
122
+ regions: {
123
+ "us-east": {
124
+ region: "us-east",
125
+ service: { config: testConfig },
126
+ },
127
+ },
128
+ activeRegion: "us-east",
129
+ };
130
+ var getApiUrl = Reader.asks(function (c) { return c.apiUrl; });
131
+ var program = Reader.local(function (gc) { return gc.regions[gc.activeRegion]; })(Reader.local(function (ac) { return ac.service.config; })(getApiUrl));
132
+ expect(Reader.run(globalConfig)(program)).toBe("https://test.api");
133
+ });
134
+ });
135
+ describe("sequence", function () {
136
+ it("should convert array of Readers to Reader of array", function () {
137
+ var readers = [
138
+ Reader.asks(function (c) { return c.apiUrl; }),
139
+ Reader.asks(function (c) { return c.timeout.toString(); }),
140
+ Reader.asks(function (c) { return c.debug.toString(); }),
141
+ ];
142
+ var sequenced = Reader.sequence(readers);
143
+ var result = Reader.run(testConfig)(sequenced);
144
+ expect(result).toEqual(["https://test.api", "5000", "true"]);
145
+ });
146
+ it("should handle empty array", function () {
147
+ var sequenced = Reader.sequence([]);
148
+ expect(Reader.run(testConfig)(sequenced)).toEqual([]);
149
+ });
150
+ });
151
+ describe("traverse", function () {
152
+ it("should map and sequence", function () {
153
+ var keys = ["apiUrl", "timeout", "debug"];
154
+ var fn = function (key) {
155
+ return Reader.asks(function (c) { return String(c[key]); });
156
+ };
157
+ var traverse = Reader.traverse(fn);
158
+ var result = Reader.run(testConfig)(traverse(keys));
159
+ expect(result).toEqual(["https://test.api", "5000", "true"]);
160
+ });
161
+ it("should handle empty array", function () {
162
+ var fn = function (n) { return Reader.of(n * 2); };
163
+ var traverse = Reader.traverse(fn);
164
+ var result = Reader.run(testConfig)(traverse([]));
165
+ expect(result).toEqual([]);
166
+ });
167
+ });
168
+ describe("sequenceT", function () {
169
+ it("should combine tuple of Readers", function () {
170
+ var r1 = Reader.asks(function (c) { return c.apiUrl; });
171
+ var r2 = Reader.asks(function (c) { return c.timeout; });
172
+ var r3 = Reader.asks(function (c) { return c.debug; });
173
+ var combined = Reader.sequenceT(r1, r2, r3);
174
+ var result = Reader.run(testConfig)(combined);
175
+ expect(result).toEqual(["https://test.api", 5000, true]);
176
+ });
177
+ it("should handle empty tuple", function () {
178
+ var result = Reader.run(testConfig)(Reader.sequenceT());
179
+ expect(result).toEqual([]);
180
+ });
181
+ });
182
+ describe("sequenceS", function () {
183
+ it("should combine record of Readers", function () {
184
+ var readers = {
185
+ url: Reader.asks(function (c) { return c.apiUrl; }),
186
+ timeout: Reader.asks(function (c) { return c.timeout; }),
187
+ isDebug: Reader.asks(function (c) { return c.debug; }),
188
+ };
189
+ var combined = Reader.sequenceS(readers);
190
+ var result = Reader.run(testConfig)(combined);
191
+ expect(result).toEqual({
192
+ url: "https://test.api",
193
+ timeout: 5000,
194
+ isDebug: true,
195
+ });
196
+ });
197
+ it("should handle empty record", function () {
198
+ var result = Reader.run(testConfig)(Reader.sequenceS({}));
199
+ expect(result).toEqual({});
200
+ });
201
+ });
202
+ describe("chainFirst", function () {
203
+ it("should execute side effect but return original value", function () {
204
+ var log = [];
205
+ var logReader = function (msg) {
206
+ return function () {
207
+ log.push(msg);
208
+ };
209
+ };
210
+ var getApiUrl = Reader.asks(function (c) { return c.apiUrl; });
211
+ var withLogging = Reader.chainFirst(function (url) {
212
+ return logReader("Got URL: ".concat(url));
213
+ })(getApiUrl);
214
+ expect(log).toEqual([]);
215
+ var result = Reader.run(testConfig)(withLogging);
216
+ expect(log).toEqual(["Got URL: https://test.api"]);
217
+ expect(result).toBe("https://test.api");
218
+ });
219
+ });
220
+ describe("Reader laws", function () {
221
+ it("should satisfy ask law: run(env)(ask) ≅ env", function () {
222
+ var reader = Reader.ask();
223
+ expect(Reader.run(testConfig)(reader)).toEqual(testConfig);
224
+ });
225
+ it("should satisfy asks law: run(env)(asks(f)) ≅ f(env)", function () {
226
+ var f = function (c) { return c.apiUrl + ":" + c.timeout; };
227
+ var reader = Reader.asks(f);
228
+ expect(Reader.run(testConfig)(reader)).toBe(f(testConfig));
229
+ });
230
+ it("should satisfy local law: run(env)(local(f)(r)) ≅ run(f(env))(r)", function () {
231
+ var appConfig = {
232
+ region: "us-east",
233
+ service: { config: testConfig },
234
+ };
235
+ var getTimeout = Reader.asks(function (c) { return c.timeout; });
236
+ var f = function (ac) { return ac.service.config; };
237
+ var localReader = Reader.local(f)(getTimeout);
238
+ var result1 = Reader.run(appConfig)(localReader);
239
+ var result2 = Reader.run(f(appConfig))(getTimeout);
240
+ expect(result1).toEqual(result2);
241
+ });
242
+ });
243
+ describe("Functor laws", function () {
244
+ it("should satisfy identity law: map(id) ≅ id", function () {
245
+ var reader = Reader.asks(function (c) { return c.apiUrl; });
246
+ var id = function (x) { return x; };
247
+ var mapped = Reader.map(id)(reader);
248
+ expect(Reader.run(testConfig)(reader)).toEqual(Reader.run(testConfig)(mapped));
249
+ });
250
+ it("should satisfy composition law: map(g∘f) ≅ map(g)∘map(f)", function () {
251
+ var reader = Reader.asks(function (c) { return c.timeout; });
252
+ var f = function (n) { return n / 1000; };
253
+ var g = function (n) { return n.toString(); };
254
+ var composed1 = Reader.map(function (x) { return g(f(x)); })(reader);
255
+ var composed2 = Reader.map(g)(Reader.map(f)(reader));
256
+ expect(Reader.run(testConfig)(composed1)).toEqual(Reader.run(testConfig)(composed2));
257
+ });
258
+ });
259
+ describe("Monad laws", function () {
260
+ it("should satisfy left identity: chain(f)(of(x)) ≅ f(x)", function () {
261
+ var x = 42;
262
+ var f = function (n) {
263
+ return Reader.asks(function (c) { return "".concat(c.apiUrl, "/").concat(n); });
264
+ };
265
+ var result1 = Reader.run(testConfig)(Reader.chain(f)(Reader.of(x)));
266
+ var result2 = Reader.run(testConfig)(f(x));
267
+ expect(result1).toEqual(result2);
268
+ });
269
+ it("should satisfy right identity: chain(of)(m) ≅ m", function () {
270
+ var reader = Reader.asks(function (c) { return c.apiUrl; });
271
+ var chained = Reader.chain(Reader.of)(reader);
272
+ expect(Reader.run(testConfig)(reader)).toEqual(Reader.run(testConfig)(chained));
273
+ });
274
+ it("should satisfy associativity", function () {
275
+ var reader = Reader.asks(function (c) { return c.timeout; });
276
+ var f = function (n) {
277
+ return Reader.asks(function (c) { return (c.debug ? n * 2 : n); });
278
+ };
279
+ var g = function (n) {
280
+ return Reader.asks(function (c) { return "".concat(c.apiUrl, "/").concat(n); });
281
+ };
282
+ var left = Reader.chain(g)(Reader.chain(f)(reader));
283
+ var right = Reader.chain(function (x) { return Reader.chain(g)(f(x)); })(reader);
284
+ expect(Reader.run(testConfig)(left)).toEqual(Reader.run(testConfig)(right));
285
+ });
286
+ });
287
+ });
288
+ //# sourceMappingURL=reader.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.test.mjs","sourceRoot":"","sources":["../src/reader.test.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=result-additions.test.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-additions.test.d.mts","sourceRoot":"","sources":["../src/result-additions.test.mts"],"names":[],"mappings":""}
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { Result } from "./result.mjs";
4
+ describe("Result additions", function () {
5
+ describe("traverse", function () {
6
+ it("should map and sequence, returning all values on success", function () {
7
+ var fn = function (n) {
8
+ return n > 0 ? Result.ok(n * 2) : Result.err("negative");
9
+ };
10
+ var traverseFn = Result.traverse(fn);
11
+ expect(traverseFn([1, 2, 3])).toEqual(Result.ok([2, 4, 6]));
12
+ });
13
+ it("should return first error on failure", function () {
14
+ var fn = function (n) {
15
+ return n > 0 ? Result.ok(n * 2) : Result.err("negative: ".concat(n));
16
+ };
17
+ var traverseFn = Result.traverse(fn);
18
+ expect(traverseFn([1, -2, 3, -4])).toEqual(Result.err("negative: -2"));
19
+ });
20
+ it("should handle empty array", function () {
21
+ var fn = function (n) { return Result.ok(n * 2); };
22
+ var traverseFn = Result.traverse(fn);
23
+ expect(traverseFn([])).toEqual(Result.ok([]));
24
+ });
25
+ it("should short-circuit on first error", function () {
26
+ var calls = [];
27
+ var fn = function (n) {
28
+ calls.push(n);
29
+ return n === 2 ? Result.err("stop") : Result.ok(n);
30
+ };
31
+ var traverseFn = Result.traverse(fn);
32
+ var result = traverseFn([1, 2, 3, 4]);
33
+ expect(result).toEqual(Result.err("stop"));
34
+ expect(calls).toEqual([1, 2]); // should not call fn for 3 and 4
35
+ });
36
+ });
37
+ describe("ap", function () {
38
+ it("should apply ok function to ok value", function () {
39
+ var add = function (a) { return function (b) { return a + b; }; };
40
+ var resultFn = Result.ok(add(5));
41
+ var resultValue = Result.ok(3);
42
+ var result = Result.ap(resultValue)(resultFn);
43
+ expect(result).toEqual(Result.ok(8));
44
+ });
45
+ it("should propagate error from function", function () {
46
+ var resultFn = Result.err("fn error");
47
+ var resultValue = Result.ok(3);
48
+ var result = Result.ap(resultValue)(resultFn);
49
+ expect(result).toEqual(Result.err("fn error"));
50
+ });
51
+ it("should propagate error from value", function () {
52
+ var resultFn = Result.ok(function (n) { return n * 2; });
53
+ var resultValue = Result.err("value error");
54
+ var result = Result.ap(resultValue)(resultFn);
55
+ expect(result).toEqual(Result.err("value error"));
56
+ });
57
+ it("should return first error when both are errors", function () {
58
+ var resultFn = Result.err("fn error");
59
+ var resultValue = Result.err("value error");
60
+ var result = Result.ap(resultValue)(resultFn);
61
+ expect(result).toEqual(Result.err("fn error"));
62
+ });
63
+ });
64
+ describe("bimap", function () {
65
+ it("should transform success value", function () {
66
+ var transform = Result.bimap(function (n) { return "ok: ".concat(n); }, function (s) { return "err: ".concat(s); });
67
+ expect(transform(Result.ok(10))).toEqual(Result.ok("ok: 10"));
68
+ });
69
+ it("should transform error value", function () {
70
+ var transform = Result.bimap(function (n) { return "ok: ".concat(n); }, function (s) { return "err: ".concat(s); });
71
+ expect(transform(Result.err("bad"))).toEqual(Result.err("err: bad"));
72
+ });
73
+ it("should work with different types", function () {
74
+ var transform = Result.bimap(function (n) { return n > 0; }, function (e) { return e.message; });
75
+ expect(transform(Result.ok(10))).toEqual(Result.ok(true));
76
+ expect(transform(Result.err(new Error("fail")))).toEqual(Result.err("fail"));
77
+ });
78
+ });
79
+ describe("chainFirst", function () {
80
+ it("should execute side effect and return original value on success", function () {
81
+ var sideEffect = vi.fn(function (n) { return Result.ok("logged: ".concat(n)); });
82
+ var result = Result.chainFirst(sideEffect)(Result.ok(42));
83
+ expect(result).toEqual(Result.ok(42));
84
+ expect(sideEffect).toHaveBeenCalledWith(42);
85
+ });
86
+ it("should not execute side effect on error", function () {
87
+ var sideEffect = vi.fn(function (n) { return Result.ok("logged: ".concat(n)); });
88
+ var result = Result.chainFirst(sideEffect)(Result.err("initial error"));
89
+ expect(result).toEqual(Result.err("initial error"));
90
+ expect(sideEffect).not.toHaveBeenCalled();
91
+ });
92
+ it("should propagate error from side effect", function () {
93
+ var sideEffect = function (_n) {
94
+ return Result.err("side effect error");
95
+ };
96
+ var result = Result.chainFirst(sideEffect)(Result.ok(42));
97
+ expect(result).toEqual(Result.err("side effect error"));
98
+ });
99
+ });
100
+ describe("sequenceT", function () {
101
+ it("should combine tuple of successful Results", function () {
102
+ var r1 = Result.ok(1);
103
+ var r2 = Result.ok("hello");
104
+ var r3 = Result.ok(true);
105
+ var combined = Result.sequenceT(r1, r2, r3);
106
+ expect(combined).toEqual(Result.ok([1, "hello", true]));
107
+ });
108
+ it("should return first error", function () {
109
+ var r1 = Result.ok(1);
110
+ var r2 = Result.err("error2");
111
+ var r3 = Result.err("error3");
112
+ var combined = Result.sequenceT(r1, r2, r3);
113
+ expect(combined).toEqual(Result.err("error2"));
114
+ });
115
+ it("should handle empty tuple", function () {
116
+ var combined = Result.sequenceT();
117
+ expect(combined).toEqual(Result.ok([]));
118
+ });
119
+ it("should short-circuit on error", function () {
120
+ var createResult = vi.fn(function (val, isOk) {
121
+ return isOk ? Result.ok(val) : Result.err("error");
122
+ });
123
+ var r1 = createResult(1, true);
124
+ var r2 = createResult(2, false);
125
+ var r3 = createResult(3, true); // This shouldn't be evaluated in sequenceT
126
+ var combined = Result.sequenceT(r1, r2, r3);
127
+ expect(combined).toEqual(Result.err("error"));
128
+ expect(createResult).toHaveBeenCalledTimes(3); // All created upfront
129
+ });
130
+ });
131
+ describe("sequenceS", function () {
132
+ it("should combine record of successful Results", function () {
133
+ var results = {
134
+ user: Result.ok({ name: "Alice" }),
135
+ count: Result.ok(42),
136
+ enabled: Result.ok(true),
137
+ };
138
+ var combined = Result.sequenceS(results);
139
+ expect(combined).toEqual(Result.ok({
140
+ user: { name: "Alice" },
141
+ count: 42,
142
+ enabled: true,
143
+ }));
144
+ });
145
+ it("should return first error", function () {
146
+ var results = {
147
+ a: Result.ok(1),
148
+ b: Result.err("error b"),
149
+ c: Result.err("error c"),
150
+ };
151
+ var combined = Result.sequenceS(results);
152
+ expect(combined).toEqual(Result.err("error b"));
153
+ });
154
+ it("should handle empty record", function () {
155
+ var combined = Result.sequenceS({});
156
+ expect(combined).toEqual(Result.ok({}));
157
+ });
158
+ it("should preserve key order", function () {
159
+ var results = {
160
+ z: Result.ok(1),
161
+ a: Result.ok(2),
162
+ m: Result.ok(3),
163
+ };
164
+ var combined = Result.sequenceS(results);
165
+ expect(combined).toEqual(Result.ok({ z: 1, a: 2, m: 3 }));
166
+ if (combined.success) {
167
+ expect(Object.keys(combined.data)).toEqual(["z", "a", "m"]);
168
+ }
169
+ });
170
+ });
171
+ describe("Do notation", function () {
172
+ it("should chain successful computations", function () {
173
+ var result = Result.Do()
174
+ .bind("x", Result.ok(5))
175
+ .bind("y", Result.ok(3))
176
+ .map(function (_a) {
177
+ var x = _a.x, y = _a.y;
178
+ return x + y;
179
+ });
180
+ expect(result).toEqual(Result.ok(8));
181
+ });
182
+ it("should handle dependent bindings", function () {
183
+ var result = Result.Do()
184
+ .bind("x", Result.ok(10))
185
+ .bind("y", function (_a) {
186
+ var x = _a.x;
187
+ return Result.ok(x * 2);
188
+ })
189
+ .bind("z", function (_a) {
190
+ var y = _a.y;
191
+ return Result.ok(y + 1);
192
+ })
193
+ .map(function (_a) {
194
+ var x = _a.x, y = _a.y, z = _a.z;
195
+ return ({ original: x, doubled: y, final: z });
196
+ });
197
+ expect(result).toEqual(Result.ok({ original: 10, doubled: 20, final: 21 }));
198
+ });
199
+ it("should short-circuit on first error", function () {
200
+ var fn1 = vi.fn(function () { return Result.ok(5); });
201
+ var fn2 = vi.fn(function () { return Result.err("error at y"); });
202
+ var fn3 = vi.fn(function () { return Result.ok(100); });
203
+ var result = Result.Do()
204
+ .bind("x", fn1())
205
+ .bind("y", fn2())
206
+ .bind("z", fn3()) // This binding happens but the function result is ignored
207
+ .map(function (_a) {
208
+ var x = _a.x, y = _a.y, z = _a.z;
209
+ return x + y + z;
210
+ });
211
+ expect(result).toEqual(Result.err("error at y"));
212
+ expect(fn1).toHaveBeenCalledTimes(1);
213
+ expect(fn2).toHaveBeenCalledTimes(1);
214
+ expect(fn3).toHaveBeenCalledTimes(1); // Created but not used in chain
215
+ });
216
+ it("should short-circuit on error at 2nd step with dependent bindings", function () {
217
+ var fn1 = vi.fn(function () { return Result.ok(10); });
218
+ var fn2 = vi.fn(function (_a) {
219
+ var x = _a.x;
220
+ return x < 20
221
+ ? Result.err("value too small")
222
+ : Result.ok(x * 2);
223
+ });
224
+ var fn3 = vi.fn(function (_a) {
225
+ var y = _a.y;
226
+ return Result.ok(y + 5);
227
+ });
228
+ var result = Result.Do()
229
+ .bind("x", fn1())
230
+ .bind("y", fn2)
231
+ .bind("z", fn3)
232
+ .map(function (_a) {
233
+ var x = _a.x, y = _a.y, z = _a.z;
234
+ return ({ first: x, second: y, third: z });
235
+ });
236
+ expect(result).toEqual(Result.err("value too small"));
237
+ expect(fn1).toHaveBeenCalledTimes(1);
238
+ expect(fn2).toHaveBeenCalledTimes(1);
239
+ expect(fn3).toHaveBeenCalledTimes(0); // should not be called due to short-circuit
240
+ });
241
+ it("should short-circuit on error at 3rd step with dependent bindings", function () {
242
+ var fn1 = vi.fn(function () { return Result.ok(60); });
243
+ var fn2 = vi.fn(function (_a) {
244
+ var x = _a.x;
245
+ return Result.ok(x * 2);
246
+ });
247
+ var fn3 = vi.fn(function (_a) {
248
+ var x = _a.x, y = _a.y;
249
+ return y > 100
250
+ ? Result.err("result too large")
251
+ : Result.ok(x + y);
252
+ });
253
+ var result = Result.Do()
254
+ .bind("x", fn1())
255
+ .bind("y", fn2)
256
+ .bind("z", fn3)
257
+ .map(function (_a) {
258
+ var x = _a.x, y = _a.y, z = _a.z;
259
+ return ({ first: x, second: y, third: z });
260
+ });
261
+ expect(result).toEqual(Result.err("result too large"));
262
+ expect(fn1).toHaveBeenCalledTimes(1);
263
+ expect(fn2).toHaveBeenCalledTimes(1);
264
+ expect(fn3).toHaveBeenCalledTimes(1);
265
+ });
266
+ it("should work with flatMap for Result-returning operations", function () {
267
+ var safeDivide = function (a, b) {
268
+ return b === 0 ? Result.err("division by zero") : Result.ok(a / b);
269
+ };
270
+ var result = Result.Do()
271
+ .bind("x", Result.ok(10))
272
+ .bind("y", Result.ok(2))
273
+ .flatMap(function (_a) {
274
+ var x = _a.x, y = _a.y;
275
+ return safeDivide(x, y);
276
+ });
277
+ expect(result).toEqual(Result.ok(5));
278
+ var errorResult = Result.Do()
279
+ .bind("x", Result.ok(10))
280
+ .bind("y", Result.ok(0))
281
+ .flatMap(function (_a) {
282
+ var x = _a.x, y = _a.y;
283
+ return safeDivide(x, y);
284
+ });
285
+ expect(errorResult).toEqual(Result.err("division by zero"));
286
+ });
287
+ it("should provide value() to get the current context", function () {
288
+ var builder = Result.Do()
289
+ .bind("x", Result.ok(5))
290
+ .bind("y", Result.ok(3));
291
+ var contextResult = builder.value();
292
+ expect(contextResult).toEqual(Result.ok({ x: 5, y: 3 }));
293
+ });
294
+ it("should handle errors in dependent bindings", function () {
295
+ var result = Result.Do()
296
+ .bind("x", Result.ok(5))
297
+ .bind("y", function (_a) {
298
+ var x = _a.x;
299
+ return x > 10 ? Result.ok(x * 2) : Result.err("x too small");
300
+ })
301
+ .map(function (_a) {
302
+ var x = _a.x, y = _a.y;
303
+ return x + y;
304
+ });
305
+ expect(result).toEqual(Result.err("x too small"));
306
+ });
307
+ });
308
+ describe("edge cases", function () {
309
+ it("should handle complex error types", function () {
310
+ var error = { code: 404, message: "Not Found" };
311
+ var result = Result.err(error);
312
+ var transformed = Result.bimap(function (n) { return n.toString(); }, function (e) { return "".concat(e.code, ": ").concat(e.message); })(result);
313
+ expect(transformed).toEqual(Result.err("404: Not Found"));
314
+ });
315
+ it("should handle nested Results", function () {
316
+ var nestedOk = Result.ok(Result.ok(42));
317
+ var flattened = Result.flatMap(function (r) { return r; })(nestedOk);
318
+ expect(flattened).toEqual(Result.ok(42));
319
+ var nestedErr = Result.ok(Result.err("inner error"));
320
+ var flattenedErr = Result.flatMap(function (r) { return r; })(nestedErr);
321
+ expect(flattenedErr).toEqual(Result.err("inner error"));
322
+ });
323
+ });
324
+ });
325
+ //# sourceMappingURL=result-additions.test.mjs.map