@satoshibits/functional 1.1.0 → 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 (130) 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 +13 -0
  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 +13 -0
  11. package/dist/composition.d.mts.map +1 -1
  12. package/dist/composition.mjs +13 -0
  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/integration.test.d.mts +2 -0
  19. package/dist/integration.test.d.mts.map +1 -0
  20. package/dist/integration.test.mjs +486 -0
  21. package/dist/integration.test.mjs.map +1 -0
  22. package/dist/io.d.mts +12 -0
  23. package/dist/io.d.mts.map +1 -1
  24. package/dist/io.mjs +12 -0
  25. package/dist/io.mjs.map +1 -1
  26. package/dist/io.test.d.mts +2 -0
  27. package/dist/io.test.d.mts.map +1 -0
  28. package/dist/io.test.mjs +373 -0
  29. package/dist/io.test.mjs.map +1 -0
  30. package/dist/laws.test.d.mts +2 -0
  31. package/dist/laws.test.d.mts.map +1 -0
  32. package/dist/laws.test.mjs +614 -0
  33. package/dist/laws.test.mjs.map +1 -0
  34. package/dist/object-utils.d.mts +11 -0
  35. package/dist/object-utils.d.mts.map +1 -1
  36. package/dist/object-utils.mjs +11 -0
  37. package/dist/object-utils.mjs.map +1 -1
  38. package/dist/object-utils.test.d.ts +2 -0
  39. package/dist/object-utils.test.d.ts.map +1 -0
  40. package/dist/object-utils.test.js +286 -0
  41. package/dist/object-utils.test.js.map +1 -0
  42. package/dist/option-additions.test.d.mts +2 -0
  43. package/dist/option-additions.test.d.mts.map +1 -0
  44. package/dist/option-additions.test.mjs +325 -0
  45. package/dist/option-additions.test.mjs.map +1 -0
  46. package/dist/option.d.mts +20 -3
  47. package/dist/option.d.mts.map +1 -1
  48. package/dist/option.mjs +20 -3
  49. package/dist/option.mjs.map +1 -1
  50. package/dist/option.test.d.ts +6 -0
  51. package/dist/option.test.d.ts.map +1 -0
  52. package/dist/option.test.js +606 -0
  53. package/dist/option.test.js.map +1 -0
  54. package/dist/performance.d.mts +26 -9
  55. package/dist/performance.d.mts.map +1 -1
  56. package/dist/performance.mjs +26 -9
  57. package/dist/performance.mjs.map +1 -1
  58. package/dist/performance.test.d.ts +2 -0
  59. package/dist/performance.test.d.ts.map +1 -0
  60. package/dist/performance.test.js +424 -0
  61. package/dist/performance.test.js.map +1 -0
  62. package/dist/pipeline.d.mts +12 -0
  63. package/dist/pipeline.d.mts.map +1 -1
  64. package/dist/pipeline.mjs +12 -0
  65. package/dist/pipeline.mjs.map +1 -1
  66. package/dist/pipeline.test.d.ts +2 -0
  67. package/dist/pipeline.test.d.ts.map +1 -0
  68. package/dist/pipeline.test.js +445 -0
  69. package/dist/pipeline.test.js.map +1 -0
  70. package/dist/predicates.d.mts +12 -0
  71. package/dist/predicates.d.mts.map +1 -1
  72. package/dist/predicates.mjs +12 -0
  73. package/dist/predicates.mjs.map +1 -1
  74. package/dist/predicates.test.d.ts +2 -0
  75. package/dist/predicates.test.d.ts.map +1 -0
  76. package/dist/predicates.test.js +375 -0
  77. package/dist/predicates.test.js.map +1 -0
  78. package/dist/reader-result.d.mts +37 -16
  79. package/dist/reader-result.d.mts.map +1 -1
  80. package/dist/reader-result.mjs +37 -16
  81. package/dist/reader-result.mjs.map +1 -1
  82. package/dist/reader-result.test.d.ts +2 -0
  83. package/dist/reader-result.test.d.ts.map +1 -0
  84. package/dist/reader-result.test.js +1259 -0
  85. package/dist/reader-result.test.js.map +1 -0
  86. package/dist/reader.d.mts +12 -0
  87. package/dist/reader.d.mts.map +1 -1
  88. package/dist/reader.mjs +12 -0
  89. package/dist/reader.mjs.map +1 -1
  90. package/dist/reader.test.d.mts +2 -0
  91. package/dist/reader.test.d.mts.map +1 -0
  92. package/dist/reader.test.mjs +288 -0
  93. package/dist/reader.test.mjs.map +1 -0
  94. package/dist/result-additions.test.d.mts +2 -0
  95. package/dist/result-additions.test.d.mts.map +1 -0
  96. package/dist/result-additions.test.mjs +325 -0
  97. package/dist/result-additions.test.mjs.map +1 -0
  98. package/dist/result.d.mts +12 -0
  99. package/dist/result.d.mts.map +1 -1
  100. package/dist/result.mjs +12 -0
  101. package/dist/result.mjs.map +1 -1
  102. package/dist/result.test.d.ts +2 -0
  103. package/dist/result.test.d.ts.map +1 -0
  104. package/dist/result.test.js +453 -0
  105. package/dist/result.test.js.map +1 -0
  106. package/dist/task.d.mts +13 -0
  107. package/dist/task.d.mts.map +1 -1
  108. package/dist/task.mjs +13 -0
  109. package/dist/task.mjs.map +1 -1
  110. package/dist/task.test.d.mts +2 -0
  111. package/dist/task.test.d.mts.map +1 -0
  112. package/dist/task.test.mjs +1006 -0
  113. package/dist/task.test.mjs.map +1 -0
  114. package/dist/types.d.mts +12 -0
  115. package/dist/types.d.mts.map +1 -1
  116. package/dist/types.mjs +12 -0
  117. package/dist/types.mjs.map +1 -1
  118. package/dist/types.test.d.ts +6 -0
  119. package/dist/types.test.d.ts.map +1 -0
  120. package/dist/types.test.js +447 -0
  121. package/dist/types.test.js.map +1 -0
  122. package/dist/validation.d.mts +12 -0
  123. package/dist/validation.d.mts.map +1 -1
  124. package/dist/validation.mjs +12 -0
  125. package/dist/validation.mjs.map +1 -1
  126. package/dist/validation.test.d.ts +2 -0
  127. package/dist/validation.test.d.ts.map +1 -0
  128. package/dist/validation.test.js +518 -0
  129. package/dist/validation.test.js.map +1 -0
  130. package/package.json +77 -13
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ /**
3
+ * @module option.test
4
+ * Tests for Option/Maybe type implementation
5
+ */
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ var __generator = (this && this.__generator) || function (thisArg, body) {
16
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
17
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
18
+ function verb(n) { return function (v) { return step([n, v]); }; }
19
+ function step(op) {
20
+ if (f) throw new TypeError("Generator is already executing.");
21
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
22
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
23
+ if (y = 0, t) op = [op[0] & 2, t.value];
24
+ switch (op[0]) {
25
+ case 0: case 1: t = op; break;
26
+ case 4: _.label++; return { value: op[1], done: false };
27
+ case 5: _.label++; y = op[1]; op = [0]; continue;
28
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
29
+ default:
30
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
31
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
32
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
33
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
34
+ if (t[2]) _.ops.pop();
35
+ _.trys.pop(); continue;
36
+ }
37
+ op = body.call(thisArg, _);
38
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
39
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
40
+ }
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ var vitest_1 = require("vitest");
44
+ var option_mjs_1 = require("./option.mjs");
45
+ (0, vitest_1.describe)('Option Type', function () {
46
+ (0, vitest_1.describe)('Constructors', function () {
47
+ (0, vitest_1.describe)('some', function () {
48
+ (0, vitest_1.it)('should create a Some variant with the provided value', function () {
49
+ var result = (0, option_mjs_1.some)(42);
50
+ (0, vitest_1.expect)(result._tag).toBe('Some');
51
+ if ((0, option_mjs_1.isSome)(result)) {
52
+ (0, vitest_1.expect)(result.value).toBe(42);
53
+ }
54
+ });
55
+ (0, vitest_1.it)('should work with any type of value', function () {
56
+ var obj = { name: 'Alice' };
57
+ var result = (0, option_mjs_1.some)(obj);
58
+ (0, vitest_1.expect)(result._tag).toBe('Some');
59
+ if ((0, option_mjs_1.isSome)(result)) {
60
+ (0, vitest_1.expect)(result.value).toBe(obj);
61
+ }
62
+ });
63
+ (0, vitest_1.it)('should work with null or undefined as explicit values', function () {
64
+ var nullResult = (0, option_mjs_1.some)(null);
65
+ (0, vitest_1.expect)(nullResult._tag).toBe('Some');
66
+ if ((0, option_mjs_1.isSome)(nullResult)) {
67
+ (0, vitest_1.expect)(nullResult.value).toBe(null);
68
+ }
69
+ var undefinedResult = (0, option_mjs_1.some)(undefined);
70
+ (0, vitest_1.expect)(undefinedResult._tag).toBe('Some');
71
+ if ((0, option_mjs_1.isSome)(undefinedResult)) {
72
+ (0, vitest_1.expect)(undefinedResult.value).toBe(undefined);
73
+ }
74
+ });
75
+ });
76
+ (0, vitest_1.describe)('none', function () {
77
+ (0, vitest_1.it)('should create a None variant', function () {
78
+ var result = (0, option_mjs_1.none)();
79
+ (0, vitest_1.expect)(result._tag).toBe('None');
80
+ (0, vitest_1.expect)('value' in result).toBe(false);
81
+ });
82
+ (0, vitest_1.it)('should always return the same structure', function () {
83
+ var result1 = (0, option_mjs_1.none)();
84
+ var result2 = (0, option_mjs_1.none)();
85
+ (0, vitest_1.expect)(result1).toEqual(result2);
86
+ });
87
+ });
88
+ (0, vitest_1.describe)('fromNullable', function () {
89
+ (0, vitest_1.it)('should return Some for non-null/undefined values', function () {
90
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(42)).toEqual((0, option_mjs_1.some)(42));
91
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)('hello')).toEqual((0, option_mjs_1.some)('hello'));
92
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(0)).toEqual((0, option_mjs_1.some)(0));
93
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)('')).toEqual((0, option_mjs_1.some)(''));
94
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(false)).toEqual((0, option_mjs_1.some)(false));
95
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(NaN)).toEqual((0, option_mjs_1.some)(NaN));
96
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)([])).toEqual((0, option_mjs_1.some)([]));
97
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)({})).toEqual((0, option_mjs_1.some)({}));
98
+ });
99
+ (0, vitest_1.it)('should return None for null or undefined', function () {
100
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(null)).toEqual((0, option_mjs_1.none)());
101
+ (0, vitest_1.expect)((0, option_mjs_1.fromNullable)(undefined)).toEqual((0, option_mjs_1.none)());
102
+ });
103
+ (0, vitest_1.it)('should work with optional chaining', function () {
104
+ var _a;
105
+ var user = {};
106
+ var email = (0, option_mjs_1.fromNullable)((_a = user === null || user === void 0 ? void 0 : user.contact) === null || _a === void 0 ? void 0 : _a.email);
107
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)(email)).toBe(true);
108
+ });
109
+ });
110
+ (0, vitest_1.describe)('fromPredicate', function () {
111
+ var isPositive = function (n) { return n > 0; };
112
+ var positive = (0, option_mjs_1.fromPredicate)(isPositive);
113
+ (0, vitest_1.it)('should return Some when predicate is true', function () {
114
+ (0, vitest_1.expect)(positive(5)).toEqual((0, option_mjs_1.some)(5));
115
+ (0, vitest_1.expect)(positive(0.1)).toEqual((0, option_mjs_1.some)(0.1));
116
+ });
117
+ (0, vitest_1.it)('should return None when predicate is false', function () {
118
+ (0, vitest_1.expect)(positive(-1)).toEqual((0, option_mjs_1.none)());
119
+ (0, vitest_1.expect)(positive(0)).toEqual((0, option_mjs_1.none)());
120
+ });
121
+ (0, vitest_1.it)('should work with complex predicates', function () {
122
+ var validEmail = (0, option_mjs_1.fromPredicate)(function (s) {
123
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s);
124
+ });
125
+ (0, vitest_1.expect)(validEmail('user@example.com')).toEqual((0, option_mjs_1.some)('user@example.com'));
126
+ (0, vitest_1.expect)(validEmail('invalid')).toEqual((0, option_mjs_1.none)());
127
+ });
128
+ });
129
+ (0, vitest_1.describe)('tryCatch', function () {
130
+ (0, vitest_1.it)('should return Some when function succeeds', function () {
131
+ var result = (0, option_mjs_1.tryCatch)(function () { return JSON.parse('{"a": 1}'); });
132
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)(result)).toBe(true);
133
+ if ((0, option_mjs_1.isSome)(result)) {
134
+ (0, vitest_1.expect)(result.value).toEqual({ a: 1 });
135
+ }
136
+ });
137
+ (0, vitest_1.it)('should return None when function throws', function () {
138
+ var result = (0, option_mjs_1.tryCatch)(function () { return JSON.parse('invalid json'); });
139
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)(result)).toBe(true);
140
+ });
141
+ (0, vitest_1.it)('should work with any thrown value', function () {
142
+ var result = (0, option_mjs_1.tryCatch)(function () {
143
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
144
+ throw 'string error';
145
+ });
146
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)(result)).toBe(true);
147
+ });
148
+ (0, vitest_1.it)('should execute function immediately', function () {
149
+ var fn = vitest_1.vi.fn(function () { return 42; });
150
+ var result = (0, option_mjs_1.tryCatch)(fn);
151
+ (0, vitest_1.expect)(fn).toHaveBeenCalledTimes(1);
152
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(42));
153
+ });
154
+ });
155
+ });
156
+ (0, vitest_1.describe)('Type Guards', function () {
157
+ (0, vitest_1.describe)('isSome', function () {
158
+ (0, vitest_1.it)('should return true for Some variants', function () {
159
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)((0, option_mjs_1.some)(42))).toBe(true);
160
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)((0, option_mjs_1.some)(null))).toBe(true);
161
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)((0, option_mjs_1.some)(undefined))).toBe(true);
162
+ });
163
+ (0, vitest_1.it)('should return false for None variants', function () {
164
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)((0, option_mjs_1.none)())).toBe(false);
165
+ });
166
+ (0, vitest_1.it)('should narrow types correctly', function () {
167
+ var opt = (0, option_mjs_1.some)(42);
168
+ if ((0, option_mjs_1.isSome)(opt)) {
169
+ // TypeScript should know opt.value exists
170
+ (0, vitest_1.expect)(opt.value).toBe(42);
171
+ }
172
+ });
173
+ });
174
+ (0, vitest_1.describe)('isNone', function () {
175
+ (0, vitest_1.it)('should return true for None variants', function () {
176
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)((0, option_mjs_1.none)())).toBe(true);
177
+ });
178
+ (0, vitest_1.it)('should return false for Some variants', function () {
179
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)((0, option_mjs_1.some)(42))).toBe(false);
180
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)((0, option_mjs_1.some)(null))).toBe(false);
181
+ });
182
+ (0, vitest_1.it)('should work in filter operations', function () {
183
+ var options = [(0, option_mjs_1.some)(1), (0, option_mjs_1.none)(), (0, option_mjs_1.some)(2), (0, option_mjs_1.none)()];
184
+ var nones = options.filter(option_mjs_1.isNone);
185
+ (0, vitest_1.expect)(nones).toHaveLength(2);
186
+ });
187
+ });
188
+ });
189
+ (0, vitest_1.describe)('Transformations', function () {
190
+ (0, vitest_1.describe)('map', function () {
191
+ (0, vitest_1.it)('should transform value in Some', function () {
192
+ var double = (0, option_mjs_1.map)(function (n) { return n * 2; });
193
+ (0, vitest_1.expect)(double((0, option_mjs_1.some)(5))).toEqual((0, option_mjs_1.some)(10));
194
+ });
195
+ (0, vitest_1.it)('should return None for None', function () {
196
+ var double = (0, option_mjs_1.map)(function (n) { return n * 2; });
197
+ (0, vitest_1.expect)(double((0, option_mjs_1.none)())).toEqual((0, option_mjs_1.none)());
198
+ });
199
+ (0, vitest_1.it)('should work with type transformations', function () {
200
+ var toString = (0, option_mjs_1.map)(function (n) { return n.toString(); });
201
+ var result = toString((0, option_mjs_1.some)(42));
202
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)('42'));
203
+ });
204
+ (0, vitest_1.it)('should be chainable', function () {
205
+ var result = (0, option_mjs_1.some)(5);
206
+ var transformed = (0, option_mjs_1.map)(function (n) { return n * 2; })((0, option_mjs_1.map)(function (n) { return n + 1; })(result));
207
+ (0, vitest_1.expect)(transformed).toEqual((0, option_mjs_1.some)(12));
208
+ });
209
+ });
210
+ (0, vitest_1.describe)('flatMap/chain', function () {
211
+ var safeDivide = function (divisor) { return function (dividend) {
212
+ return divisor === 0 ? (0, option_mjs_1.none)() : (0, option_mjs_1.some)(dividend / divisor);
213
+ }; };
214
+ (0, vitest_1.it)('should chain operations on Some', function () {
215
+ var result = (0, option_mjs_1.flatMap)(safeDivide(2))((0, option_mjs_1.some)(10));
216
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(5));
217
+ });
218
+ (0, vitest_1.it)('should return None when function returns None', function () {
219
+ var result = (0, option_mjs_1.flatMap)(safeDivide(0))((0, option_mjs_1.some)(10));
220
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.none)());
221
+ });
222
+ (0, vitest_1.it)('should return None when input is None', function () {
223
+ var result = (0, option_mjs_1.flatMap)(safeDivide(2))((0, option_mjs_1.none)());
224
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.none)());
225
+ });
226
+ (0, vitest_1.it)('should work with multiple chained operations', function () {
227
+ var result = (0, option_mjs_1.chain)(safeDivide(2))((0, option_mjs_1.chain)(safeDivide(5))((0, option_mjs_1.some)(100)));
228
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(10));
229
+ });
230
+ (0, vitest_1.it)('chain should be an alias for flatMap', function () {
231
+ (0, vitest_1.expect)(option_mjs_1.chain).toBe(option_mjs_1.flatMap);
232
+ });
233
+ });
234
+ (0, vitest_1.describe)('filter', function () {
235
+ var isEven = function (n) { return n % 2 === 0; };
236
+ (0, vitest_1.it)('should keep Some when predicate is true', function () {
237
+ (0, vitest_1.expect)((0, option_mjs_1.filter)(isEven)((0, option_mjs_1.some)(4))).toEqual((0, option_mjs_1.some)(4));
238
+ });
239
+ (0, vitest_1.it)('should return None when predicate is false', function () {
240
+ (0, vitest_1.expect)((0, option_mjs_1.filter)(isEven)((0, option_mjs_1.some)(3))).toEqual((0, option_mjs_1.none)());
241
+ });
242
+ (0, vitest_1.it)('should return None when input is None', function () {
243
+ (0, vitest_1.expect)((0, option_mjs_1.filter)(isEven)((0, option_mjs_1.none)())).toEqual((0, option_mjs_1.none)());
244
+ });
245
+ (0, vitest_1.it)('should work with type guard predicates', function () {
246
+ var isString = function (v) { return typeof v === 'string'; };
247
+ var mixed = (0, option_mjs_1.some)(42);
248
+ var filtered = (0, option_mjs_1.filter)(isString)(mixed);
249
+ (0, vitest_1.expect)(filtered).toEqual((0, option_mjs_1.none)());
250
+ var stringOpt = (0, option_mjs_1.some)('hello');
251
+ var stringFiltered = (0, option_mjs_1.filter)(isString)(stringOpt);
252
+ (0, vitest_1.expect)(stringFiltered).toEqual((0, option_mjs_1.some)('hello'));
253
+ });
254
+ (0, vitest_1.it)('should be chainable with other operations', function () {
255
+ var result = (0, option_mjs_1.filter)(isEven)((0, option_mjs_1.map)(function (n) { return n * 2; })((0, option_mjs_1.some)(3)));
256
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(6));
257
+ });
258
+ });
259
+ (0, vitest_1.describe)('tap', function () {
260
+ (0, vitest_1.it)('should execute side effect on Some', function () {
261
+ var sideEffect = vitest_1.vi.fn();
262
+ var result = (0, option_mjs_1.tapOption)(sideEffect)((0, option_mjs_1.some)(42));
263
+ (0, vitest_1.expect)(sideEffect).toHaveBeenCalledWith(42);
264
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(42));
265
+ });
266
+ (0, vitest_1.it)('should not execute side effect on None', function () {
267
+ var sideEffect = vitest_1.vi.fn();
268
+ var result = (0, option_mjs_1.tapOption)(sideEffect)((0, option_mjs_1.none)());
269
+ (0, vitest_1.expect)(sideEffect).not.toHaveBeenCalled();
270
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.none)());
271
+ });
272
+ (0, vitest_1.it)('should return original Option unchanged', function () {
273
+ var original = (0, option_mjs_1.some)({ id: 1 });
274
+ var sideEffect = function (obj) {
275
+ obj.id = 2; // Try to mutate
276
+ };
277
+ var result = (0, option_mjs_1.tapOption)(sideEffect)(original);
278
+ (0, vitest_1.expect)(result).toBe(original);
279
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)({ id: 2 })); // Mutation happened but same reference
280
+ });
281
+ (0, vitest_1.it)('should work in a pipeline', function () {
282
+ var log = vitest_1.vi.fn();
283
+ var result = (0, option_mjs_1.tapOption)(log)((0, option_mjs_1.map)(function (n) { return n * 2; })((0, option_mjs_1.some)(5)));
284
+ (0, vitest_1.expect)(log).toHaveBeenCalledWith(10);
285
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(10));
286
+ });
287
+ });
288
+ });
289
+ (0, vitest_1.describe)('Extractors', function () {
290
+ (0, vitest_1.describe)('getOrElse', function () {
291
+ (0, vitest_1.it)('should return value for Some', function () {
292
+ var result = (0, option_mjs_1.getOrElse)(function () { return 0; })((0, option_mjs_1.some)(42));
293
+ (0, vitest_1.expect)(result).toBe(42);
294
+ });
295
+ (0, vitest_1.it)('should return default for None', function () {
296
+ var result = (0, option_mjs_1.getOrElse)(function () { return 0; })((0, option_mjs_1.none)());
297
+ (0, vitest_1.expect)(result).toBe(0);
298
+ });
299
+ (0, vitest_1.it)('should lazily evaluate default', function () {
300
+ var defaultFn = vitest_1.vi.fn(function () { return 'default'; });
301
+ (0, option_mjs_1.getOrElse)(defaultFn)((0, option_mjs_1.some)('value'));
302
+ (0, vitest_1.expect)(defaultFn).not.toHaveBeenCalled();
303
+ (0, option_mjs_1.getOrElse)(defaultFn)((0, option_mjs_1.none)());
304
+ (0, vitest_1.expect)(defaultFn).toHaveBeenCalledTimes(1);
305
+ });
306
+ });
307
+ (0, vitest_1.describe)('orElse', function () {
308
+ (0, vitest_1.it)('should return original Some', function () {
309
+ var result = (0, option_mjs_1.orElse)(function () { return (0, option_mjs_1.some)(0); })((0, option_mjs_1.some)(42));
310
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(42));
311
+ });
312
+ (0, vitest_1.it)('should return alternative for None', function () {
313
+ var result = (0, option_mjs_1.orElse)(function () { return (0, option_mjs_1.some)(0); })((0, option_mjs_1.none)());
314
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(0));
315
+ });
316
+ (0, vitest_1.it)('should lazily evaluate alternative', function () {
317
+ var alternativeFn = vitest_1.vi.fn(function () { return (0, option_mjs_1.some)('alternative'); });
318
+ (0, option_mjs_1.orElse)(alternativeFn)((0, option_mjs_1.some)('value'));
319
+ (0, vitest_1.expect)(alternativeFn).not.toHaveBeenCalled();
320
+ (0, option_mjs_1.orElse)(alternativeFn)((0, option_mjs_1.none)());
321
+ (0, vitest_1.expect)(alternativeFn).toHaveBeenCalledTimes(1);
322
+ });
323
+ (0, vitest_1.it)('should chain multiple fallbacks', function () {
324
+ var result = (0, option_mjs_1.orElse)(function () { return (0, option_mjs_1.some)('third'); })((0, option_mjs_1.orElse)(function () { return (0, option_mjs_1.none)(); })((0, option_mjs_1.none)()));
325
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)('third'));
326
+ });
327
+ });
328
+ });
329
+ (0, vitest_1.describe)('Pattern Matching', function () {
330
+ (0, vitest_1.describe)('match', function () {
331
+ (0, vitest_1.it)('should call some branch for Some', function () {
332
+ var result = (0, option_mjs_1.match)({
333
+ some: function (n) { return "Value is ".concat(n); },
334
+ none: function () { return 'No value'; },
335
+ })((0, option_mjs_1.some)(42));
336
+ (0, vitest_1.expect)(result).toBe('Value is 42');
337
+ });
338
+ (0, vitest_1.it)('should call none branch for None', function () {
339
+ var result = (0, option_mjs_1.match)({
340
+ some: function (n) { return "Value is ".concat(n); },
341
+ none: function () { return 'No value'; },
342
+ })((0, option_mjs_1.none)());
343
+ (0, vitest_1.expect)(result).toBe('No value');
344
+ });
345
+ (0, vitest_1.it)('should work with different return types', function () {
346
+ var renderOption = (0, option_mjs_1.match)({
347
+ some: function (user) { return ({ type: 'user', name: user.name }); },
348
+ none: function () { return ({ type: 'guest' }); },
349
+ });
350
+ (0, vitest_1.expect)(renderOption((0, option_mjs_1.some)({ name: 'Alice' }))).toEqual({ type: 'user', name: 'Alice' });
351
+ (0, vitest_1.expect)(renderOption((0, option_mjs_1.none)())).toEqual({ type: 'guest' });
352
+ });
353
+ (0, vitest_1.it)('should handle async branches', function () { return __awaiter(void 0, void 0, void 0, function () {
354
+ var fetchData, result;
355
+ return __generator(this, function (_a) {
356
+ switch (_a.label) {
357
+ case 0:
358
+ fetchData = (0, option_mjs_1.match)({
359
+ some: function (id) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
360
+ return [2 /*return*/, Promise.resolve("Fetched data for ".concat(id))];
361
+ }); }); },
362
+ none: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
363
+ return [2 /*return*/, Promise.resolve('No ID provided')];
364
+ }); }); },
365
+ });
366
+ return [4 /*yield*/, fetchData((0, option_mjs_1.some)(123))];
367
+ case 1:
368
+ result = _a.sent();
369
+ (0, vitest_1.expect)(result).toBe('Fetched data for 123');
370
+ return [2 /*return*/];
371
+ }
372
+ });
373
+ }); });
374
+ });
375
+ });
376
+ (0, vitest_1.describe)('Conversions', function () {
377
+ (0, vitest_1.describe)('toNullable', function () {
378
+ (0, vitest_1.it)('should convert Some to value', function () {
379
+ (0, vitest_1.expect)((0, option_mjs_1.toNullable)((0, option_mjs_1.some)(42))).toBe(42);
380
+ (0, vitest_1.expect)((0, option_mjs_1.toNullable)((0, option_mjs_1.some)('hello'))).toBe('hello');
381
+ });
382
+ (0, vitest_1.it)('should convert None to null', function () {
383
+ (0, vitest_1.expect)((0, option_mjs_1.toNullable)((0, option_mjs_1.none)())).toBe(null);
384
+ });
385
+ (0, vitest_1.it)('should preserve null in Some', function () {
386
+ (0, vitest_1.expect)((0, option_mjs_1.toNullable)((0, option_mjs_1.some)(null))).toBe(null);
387
+ });
388
+ });
389
+ (0, vitest_1.describe)('toUndefined', function () {
390
+ (0, vitest_1.it)('should convert Some to value', function () {
391
+ (0, vitest_1.expect)((0, option_mjs_1.toUndefined)((0, option_mjs_1.some)(42))).toBe(42);
392
+ (0, vitest_1.expect)((0, option_mjs_1.toUndefined)((0, option_mjs_1.some)('hello'))).toBe('hello');
393
+ });
394
+ (0, vitest_1.it)('should convert None to undefined', function () {
395
+ (0, vitest_1.expect)((0, option_mjs_1.toUndefined)((0, option_mjs_1.none)())).toBe(undefined);
396
+ });
397
+ (0, vitest_1.it)('should preserve undefined in Some', function () {
398
+ (0, vitest_1.expect)((0, option_mjs_1.toUndefined)((0, option_mjs_1.some)(undefined))).toBe(undefined);
399
+ });
400
+ });
401
+ });
402
+ (0, vitest_1.describe)('Combinations', function () {
403
+ (0, vitest_1.describe)('lift2', function () {
404
+ var add = function (a, b) { return a + b; };
405
+ var liftedAdd = (0, option_mjs_1.lift2)(add);
406
+ (0, vitest_1.it)('should combine two Some values', function () {
407
+ (0, vitest_1.expect)(liftedAdd((0, option_mjs_1.some)(5), (0, option_mjs_1.some)(3))).toEqual((0, option_mjs_1.some)(8));
408
+ });
409
+ (0, vitest_1.it)('should return None if first is None', function () {
410
+ (0, vitest_1.expect)(liftedAdd((0, option_mjs_1.none)(), (0, option_mjs_1.some)(3))).toEqual((0, option_mjs_1.none)());
411
+ });
412
+ (0, vitest_1.it)('should return None if second is None', function () {
413
+ (0, vitest_1.expect)(liftedAdd((0, option_mjs_1.some)(5), (0, option_mjs_1.none)())).toEqual((0, option_mjs_1.none)());
414
+ });
415
+ (0, vitest_1.it)('should return None if both are None', function () {
416
+ (0, vitest_1.expect)(liftedAdd((0, option_mjs_1.none)(), (0, option_mjs_1.none)())).toEqual((0, option_mjs_1.none)());
417
+ });
418
+ (0, vitest_1.it)('should work with different types', function () {
419
+ var concat = function (s, n) { return "".concat(s).concat(n); };
420
+ var liftedConcat = (0, option_mjs_1.lift2)(concat);
421
+ (0, vitest_1.expect)(liftedConcat((0, option_mjs_1.some)('value'), (0, option_mjs_1.some)(42))).toEqual((0, option_mjs_1.some)('value42'));
422
+ });
423
+ });
424
+ (0, vitest_1.describe)('sequence', function () {
425
+ (0, vitest_1.it)('should convert array of Somes to Some of array', function () {
426
+ var options = [(0, option_mjs_1.some)(1), (0, option_mjs_1.some)(2), (0, option_mjs_1.some)(3)];
427
+ (0, vitest_1.expect)((0, option_mjs_1.sequenceOption)(options)).toEqual((0, option_mjs_1.some)([1, 2, 3]));
428
+ });
429
+ (0, vitest_1.it)('should return None if any element is None', function () {
430
+ var options = [(0, option_mjs_1.some)(1), (0, option_mjs_1.none)(), (0, option_mjs_1.some)(3)];
431
+ (0, vitest_1.expect)((0, option_mjs_1.sequenceOption)(options)).toEqual((0, option_mjs_1.none)());
432
+ });
433
+ (0, vitest_1.it)('should return Some of empty array for empty input', function () {
434
+ (0, vitest_1.expect)((0, option_mjs_1.sequenceOption)([])).toEqual((0, option_mjs_1.some)([]));
435
+ });
436
+ (0, vitest_1.it)('should short-circuit on first None', function () {
437
+ var fn = vitest_1.vi.fn(function () { return (0, option_mjs_1.some)(42); });
438
+ var options = [(0, option_mjs_1.some)(1), (0, option_mjs_1.none)(), fn()];
439
+ var result = (0, option_mjs_1.sequenceOption)(options);
440
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.none)());
441
+ // fn was called because array is evaluated before sequence
442
+ (0, vitest_1.expect)(fn).toHaveBeenCalled();
443
+ });
444
+ });
445
+ (0, vitest_1.describe)('ap', function () {
446
+ (0, vitest_1.it)('should apply Some function to Some value', function () {
447
+ var addOne = function (n) { return n + 1; };
448
+ (0, vitest_1.expect)((0, option_mjs_1.ap)((0, option_mjs_1.some)(5))((0, option_mjs_1.some)(addOne))).toEqual((0, option_mjs_1.some)(6));
449
+ });
450
+ (0, vitest_1.it)('should return None if function is None', function () {
451
+ (0, vitest_1.expect)((0, option_mjs_1.ap)((0, option_mjs_1.some)(5))((0, option_mjs_1.none)())).toEqual((0, option_mjs_1.none)());
452
+ });
453
+ (0, vitest_1.it)('should return None if value is None', function () {
454
+ var addOne = function (n) { return n + 1; };
455
+ (0, vitest_1.expect)((0, option_mjs_1.ap)((0, option_mjs_1.none)())((0, option_mjs_1.some)(addOne))).toEqual((0, option_mjs_1.none)());
456
+ });
457
+ (0, vitest_1.it)('should work with curried functions', function () {
458
+ var add = function (a) { return function (b) { return a + b; }; };
459
+ var maybeAdd = (0, option_mjs_1.some)(add);
460
+ var applied1 = (0, option_mjs_1.ap)((0, option_mjs_1.some)(5))(maybeAdd);
461
+ var result = (0, option_mjs_1.ap)((0, option_mjs_1.some)(3))(applied1);
462
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)(8));
463
+ });
464
+ });
465
+ (0, vitest_1.describe)('sequenceS', function () {
466
+ (0, vitest_1.it)('should convert struct of Somes to Some of struct', function () {
467
+ var result = (0, option_mjs_1.sequenceS)({
468
+ a: (0, option_mjs_1.some)(1),
469
+ b: (0, option_mjs_1.some)('hello'),
470
+ c: (0, option_mjs_1.some)(true),
471
+ });
472
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)({
473
+ a: 1,
474
+ b: 'hello',
475
+ c: true,
476
+ }));
477
+ });
478
+ (0, vitest_1.it)('should return None if any value is None', function () {
479
+ var result = (0, option_mjs_1.sequenceS)({
480
+ a: (0, option_mjs_1.some)(1),
481
+ b: (0, option_mjs_1.none)(),
482
+ c: (0, option_mjs_1.some)(true),
483
+ });
484
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.none)());
485
+ });
486
+ (0, vitest_1.it)('should work with empty struct', function () {
487
+ (0, vitest_1.expect)((0, option_mjs_1.sequenceS)({})).toEqual((0, option_mjs_1.some)({}));
488
+ });
489
+ (0, vitest_1.it)('should preserve type information', function () {
490
+ var result = (0, option_mjs_1.sequenceS)({
491
+ num: (0, option_mjs_1.some)(42),
492
+ str: (0, option_mjs_1.some)('test'),
493
+ });
494
+ if ((0, option_mjs_1.isSome)(result)) {
495
+ (0, vitest_1.expect)(result.value.num).toBe(42);
496
+ (0, vitest_1.expect)(result.value.str).toBe('test');
497
+ }
498
+ });
499
+ (0, vitest_1.it)('should work with nested options', function () {
500
+ var result = (0, option_mjs_1.sequenceS)({
501
+ user: (0, option_mjs_1.some)({ id: 1, name: 'Alice' }),
502
+ config: (0, option_mjs_1.some)({ theme: 'dark' }),
503
+ });
504
+ (0, vitest_1.expect)(result).toEqual((0, option_mjs_1.some)({
505
+ user: { id: 1, name: 'Alice' },
506
+ config: { theme: 'dark' },
507
+ }));
508
+ });
509
+ });
510
+ });
511
+ (0, vitest_1.describe)('Namespace', function () {
512
+ (0, vitest_1.it)('should export all functions through Option namespace', function () {
513
+ (0, vitest_1.expect)(option_mjs_1.Option.some).toBe(option_mjs_1.some);
514
+ (0, vitest_1.expect)(option_mjs_1.Option.none).toBe(option_mjs_1.none);
515
+ (0, vitest_1.expect)(option_mjs_1.Option.fromNullable).toBe(option_mjs_1.fromNullable);
516
+ (0, vitest_1.expect)(option_mjs_1.Option.fromPredicate).toBe(option_mjs_1.fromPredicate);
517
+ (0, vitest_1.expect)(option_mjs_1.Option.tryCatch).toBe(option_mjs_1.tryCatch);
518
+ (0, vitest_1.expect)(option_mjs_1.Option.isSome).toBe(option_mjs_1.isSome);
519
+ (0, vitest_1.expect)(option_mjs_1.Option.isNone).toBe(option_mjs_1.isNone);
520
+ (0, vitest_1.expect)(option_mjs_1.Option.map).toBe(option_mjs_1.map);
521
+ (0, vitest_1.expect)(option_mjs_1.Option.flatMap).toBe(option_mjs_1.flatMap);
522
+ (0, vitest_1.expect)(option_mjs_1.Option.chain).toBe(option_mjs_1.chain);
523
+ (0, vitest_1.expect)(option_mjs_1.Option.filter).toBe(option_mjs_1.filter);
524
+ (0, vitest_1.expect)(option_mjs_1.Option.tapOption).toBe(option_mjs_1.tapOption);
525
+ (0, vitest_1.expect)(option_mjs_1.Option.getOrElse).toBe(option_mjs_1.getOrElse);
526
+ (0, vitest_1.expect)(option_mjs_1.Option.orElse).toBe(option_mjs_1.orElse);
527
+ (0, vitest_1.expect)(option_mjs_1.Option.match).toBe(option_mjs_1.match);
528
+ (0, vitest_1.expect)(option_mjs_1.Option.toNullable).toBe(option_mjs_1.toNullable);
529
+ (0, vitest_1.expect)(option_mjs_1.Option.toUndefined).toBe(option_mjs_1.toUndefined);
530
+ });
531
+ (0, vitest_1.it)('should work with pipe-style composition', function () {
532
+ var pipeline = function (value) {
533
+ return option_mjs_1.Option.fromPredicate(function (n) { return n > 0; })(value);
534
+ };
535
+ var transform = function (opt) {
536
+ return option_mjs_1.Option.getOrElse(function () { return 0; })(option_mjs_1.Option.filter(function (n) { return n < 100; })(option_mjs_1.Option.map(function (n) { return n * 2; })(opt)));
537
+ };
538
+ (0, vitest_1.expect)(transform(pipeline(5))).toBe(10);
539
+ (0, vitest_1.expect)(transform(pipeline(60))).toBe(0); // Filtered out
540
+ (0, vitest_1.expect)(transform(pipeline(-5))).toBe(0); // None from predicate
541
+ });
542
+ });
543
+ (0, vitest_1.describe)('Real-world scenarios', function () {
544
+ (0, vitest_1.it)('should handle user authentication flow', function () {
545
+ var findUser = function (id) {
546
+ return id === '123' ? (0, option_mjs_1.some)({ id: id, name: 'Alice', role: 'admin' }) : (0, option_mjs_1.none)();
547
+ };
548
+ var isAdmin = function (user) { return user.role === 'admin'; };
549
+ var result = (0, option_mjs_1.match)({
550
+ some: function (user) { return isAdmin(user) ? 'Admin access granted' : 'User access granted'; },
551
+ none: function () { return 'Access denied: User not found'; },
552
+ })(findUser('123'));
553
+ (0, vitest_1.expect)(result).toBe('Admin access granted');
554
+ });
555
+ (0, vitest_1.it)('should handle configuration with fallbacks', function () {
556
+ var getEnvVar = function (key) {
557
+ return (0, option_mjs_1.fromNullable)(process.env[key]);
558
+ };
559
+ var getConfig = function (key) {
560
+ return (0, option_mjs_1.orElse)(function () { return getEnvVar("FALLBACK_".concat(key)); })((0, option_mjs_1.orElse)(function () { return (0, option_mjs_1.none)(); })(getEnvVar(key)));
561
+ };
562
+ process.env.FALLBACK_API_KEY = 'fallback-key';
563
+ var apiKey = (0, option_mjs_1.getOrElse)(function () { return 'default-key'; })(getConfig('API_KEY'));
564
+ (0, vitest_1.expect)(apiKey).toBe('fallback-key');
565
+ delete process.env.FALLBACK_API_KEY;
566
+ });
567
+ (0, vitest_1.it)('should handle form validation', function () {
568
+ var validateName = function (name) {
569
+ return name.length >= 2 ? (0, option_mjs_1.some)(name) : (0, option_mjs_1.none)();
570
+ };
571
+ var validateEmail = function (email) {
572
+ return (0, option_mjs_1.fromPredicate)(function (e) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e); })(email);
573
+ };
574
+ var validateAge = function (age) {
575
+ return (0, option_mjs_1.flatMap)(function (n) { return n >= 18 && n <= 100 ? (0, option_mjs_1.some)(n) : (0, option_mjs_1.none)(); })((0, option_mjs_1.tryCatch)(function () { return parseInt(age, 10); }));
576
+ };
577
+ var validateForm = function (data) {
578
+ return (0, option_mjs_1.sequenceS)({
579
+ name: validateName(data.name),
580
+ email: validateEmail(data.email),
581
+ age: validateAge(data.age),
582
+ });
583
+ };
584
+ var validForm = validateForm({
585
+ name: 'Alice',
586
+ email: 'alice@example.com',
587
+ age: '25',
588
+ });
589
+ (0, vitest_1.expect)((0, option_mjs_1.isSome)(validForm)).toBe(true);
590
+ if ((0, option_mjs_1.isSome)(validForm)) {
591
+ (0, vitest_1.expect)(validForm.value).toEqual({
592
+ name: 'Alice',
593
+ email: 'alice@example.com',
594
+ age: 25,
595
+ });
596
+ }
597
+ var invalidForm = validateForm({
598
+ name: 'A',
599
+ email: 'invalid',
600
+ age: '200',
601
+ });
602
+ (0, vitest_1.expect)((0, option_mjs_1.isNone)(invalidForm)).toBe(true);
603
+ });
604
+ });
605
+ });
606
+ //# sourceMappingURL=option.test.js.map