happy-rusty 1.1.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.mjs CHANGED
@@ -1,40 +1,75 @@
1
- const optionKindSymbol = Symbol("Option kind");
2
- const resultKindSymbol = Symbol("Result kind");
1
+ const OptionKindSymbol = Symbol("Option kind");
2
+ const ResultKindSymbol = Symbol("Result kind");
3
+
4
+ function isOption(o) {
5
+ return o != null && typeof o === "object" && OptionKindSymbol in o;
6
+ }
7
+ function isResult(r) {
8
+ return r != null && typeof r === "object" && ResultKindSymbol in r;
9
+ }
10
+
3
11
  function Some(value) {
4
12
  const some = {
5
- [optionKindSymbol]: "Some",
6
- isSome: () => true,
7
- isNone: () => false,
8
- isSomeAnd: (predicate) => predicate(value),
9
- expect: (_msg) => value,
10
- unwrap: () => value,
11
- unwrapOr: (_defaultValue) => value,
12
- unwrapOrElse: (_fn) => value,
13
- okOr: (_error) => Ok(value),
14
- okOrElse: (_err) => Ok(value),
15
- transpose: () => {
13
+ [Symbol.toStringTag]: "Option",
14
+ [OptionKindSymbol]: "Some",
15
+ isSome() {
16
+ return true;
17
+ },
18
+ isNone() {
19
+ return false;
20
+ },
21
+ isSomeAnd(predicate) {
22
+ return predicate(value);
23
+ },
24
+ expect(_msg) {
25
+ return value;
26
+ },
27
+ unwrap() {
28
+ return value;
29
+ },
30
+ unwrapOr(_defaultValue) {
31
+ return value;
32
+ },
33
+ unwrapOrElse(_fn) {
34
+ return value;
35
+ },
36
+ okOr(_error) {
37
+ return Ok(value);
38
+ },
39
+ okOrElse(_err) {
40
+ return Ok(value);
41
+ },
42
+ transpose() {
16
43
  const r = value;
17
44
  assertResult(r);
18
45
  return r.isOk() ? Ok(Some(r.unwrap())) : Err(r.unwrapErr());
19
46
  },
20
- filter: (predicate) => predicate(value) ? some : None,
21
- flatten: () => {
47
+ filter(predicate) {
48
+ return predicate(value) ? some : None;
49
+ },
50
+ flatten() {
22
51
  const o = value;
23
52
  assertOption(o);
24
53
  return o;
25
54
  },
26
- map: (fn) => Some(fn(value)),
27
- mapOr: (_defaultValue, fn) => fn(value),
28
- mapOrElse: (_defaultFn, fn) => fn(value),
29
- zip: (other) => {
55
+ map(fn) {
56
+ return Some(fn(value));
57
+ },
58
+ mapOr(_defaultValue, fn) {
59
+ return fn(value);
60
+ },
61
+ mapOrElse(_defaultFn, fn) {
62
+ return fn(value);
63
+ },
64
+ zip(other) {
30
65
  assertOption(other);
31
66
  return other.isSome() ? Some([value, other.unwrap()]) : None;
32
67
  },
33
- zipWith: (other, fn) => {
68
+ zipWith(other, fn) {
34
69
  assertOption(other);
35
70
  return other.isSome() ? Some(fn(value, other.unwrap())) : None;
36
71
  },
37
- unzip: () => {
72
+ unzip() {
38
73
  const tuple = value;
39
74
  if (!Array.isArray(tuple) || tuple.length !== 2) {
40
75
  throw new TypeError("Unzip format is incorrect.");
@@ -42,115 +77,205 @@ function Some(value) {
42
77
  const [a, b] = tuple;
43
78
  return [Some(a), Some(b)];
44
79
  },
45
- and: (other) => {
80
+ and(other) {
46
81
  assertOption(other);
47
82
  return other;
48
83
  },
49
- andThen: (fn) => fn(value),
50
- or: (_other) => some,
51
- orElse: (_fn) => some,
52
- xor: (other) => {
84
+ andThen(fn) {
85
+ return fn(value);
86
+ },
87
+ or(_other) {
88
+ return some;
89
+ },
90
+ orElse(_fn) {
91
+ return some;
92
+ },
93
+ xor(other) {
53
94
  assertOption(other);
54
95
  return other.isSome() ? None : some;
55
96
  },
56
- inspect: (fn) => {
97
+ inspect(fn) {
57
98
  fn(value);
58
99
  return some;
59
100
  },
60
- eq: (other) => {
101
+ eq(other) {
61
102
  assertOption(other);
62
103
  return other.isSome() && other.unwrap() === value;
104
+ },
105
+ toString() {
106
+ return `Some(${value})`;
63
107
  }
64
108
  };
65
109
  return some;
66
110
  }
67
111
  const None = Object.freeze({
68
- [optionKindSymbol]: "None",
69
- isSome: () => false,
70
- isNone: () => true,
71
- isSomeAnd: (_predicate) => false,
72
- expect: (msg) => {
112
+ [Symbol.toStringTag]: "Option",
113
+ [OptionKindSymbol]: "None",
114
+ isSome() {
115
+ return false;
116
+ },
117
+ isNone() {
118
+ return true;
119
+ },
120
+ isSomeAnd(_predicate) {
121
+ return false;
122
+ },
123
+ expect(msg) {
73
124
  throw new TypeError(msg);
74
125
  },
75
- unwrap: () => {
126
+ unwrap() {
76
127
  throw new TypeError("Called `Option::unwrap()` on a `None` value");
77
128
  },
78
- unwrapOr: (defaultValue) => defaultValue,
79
- unwrapOrElse: (fn) => fn(),
80
- okOr: (error) => Err(error),
81
- okOrElse: (err) => Err(err()),
82
- transpose: () => Ok(None),
83
- filter: (_predicate) => None,
84
- flatten: () => None,
85
- map: (_fn) => None,
86
- mapOr: (defaultValue, _fn) => defaultValue,
87
- mapOrElse: (defaultFn, _fn) => defaultFn(),
88
- zip: (_other) => None,
89
- zipWith: (_other, _fn) => None,
90
- unzip: () => [None, None],
91
- and: (_other) => None,
92
- andThen: (_fn) => None,
93
- or: (other) => {
129
+ unwrapOr(defaultValue) {
130
+ return defaultValue;
131
+ },
132
+ unwrapOrElse(fn) {
133
+ return fn();
134
+ },
135
+ okOr(error) {
136
+ return Err(error);
137
+ },
138
+ okOrElse(err) {
139
+ return Err(err());
140
+ },
141
+ transpose() {
142
+ return Ok(None);
143
+ },
144
+ filter(_predicate) {
145
+ return None;
146
+ },
147
+ flatten() {
148
+ return None;
149
+ },
150
+ map(_fn) {
151
+ return None;
152
+ },
153
+ mapOr(defaultValue, _fn) {
154
+ return defaultValue;
155
+ },
156
+ mapOrElse(defaultFn, _fn) {
157
+ return defaultFn();
158
+ },
159
+ zip(_other) {
160
+ return None;
161
+ },
162
+ zipWith(_other, _fn) {
163
+ return None;
164
+ },
165
+ unzip() {
166
+ return [None, None];
167
+ },
168
+ and(_other) {
169
+ return None;
170
+ },
171
+ andThen(_fn) {
172
+ return None;
173
+ },
174
+ or(other) {
94
175
  assertOption(other);
95
176
  return other;
96
177
  },
97
- orElse: (fn) => fn(),
98
- xor: (other) => {
178
+ orElse(fn) {
179
+ return fn();
180
+ },
181
+ xor(other) {
99
182
  assertOption(other);
100
183
  return other.isSome() ? other : None;
101
184
  },
102
- inspect: (_fn) => None,
103
- eq: (other) => {
185
+ inspect(_fn) {
186
+ return None;
187
+ },
188
+ eq(other) {
104
189
  assertOption(other);
105
190
  return other === None;
191
+ },
192
+ toString() {
193
+ return "None";
106
194
  }
107
195
  });
108
196
  function Ok(value) {
109
197
  const ok = {
110
- [resultKindSymbol]: "Ok",
111
- isOk: () => true,
112
- isErr: () => false,
113
- isOkAnd: (predicate) => predicate(value),
114
- isErrAnd: (_predicate) => false,
115
- expect: (_msg) => value,
116
- unwrap: () => value,
117
- unwrapOr: (_defaultValue) => value,
118
- unwrapOrElse: (_fn) => value,
119
- expectErr: (msg) => {
198
+ [Symbol.toStringTag]: "Result",
199
+ [ResultKindSymbol]: "Ok",
200
+ isOk() {
201
+ return true;
202
+ },
203
+ isErr() {
204
+ return false;
205
+ },
206
+ isOkAnd(predicate) {
207
+ return predicate(value);
208
+ },
209
+ isErrAnd(_predicate) {
210
+ return false;
211
+ },
212
+ expect(_msg) {
213
+ return value;
214
+ },
215
+ unwrap() {
216
+ return value;
217
+ },
218
+ unwrapOr(_defaultValue) {
219
+ return value;
220
+ },
221
+ unwrapOrElse(_fn) {
222
+ return value;
223
+ },
224
+ expectErr(msg) {
120
225
  throw new TypeError(`${msg}: ${value}`);
121
226
  },
122
- unwrapErr: () => {
227
+ unwrapErr() {
123
228
  throw new TypeError("Called `Result::unwrapErr()` on an `Ok` value");
124
229
  },
125
- ok: () => Some(value),
126
- err: () => None,
127
- transpose: () => {
230
+ ok() {
231
+ return Some(value);
232
+ },
233
+ err() {
234
+ return None;
235
+ },
236
+ transpose() {
128
237
  const o = value;
129
238
  assertOption(o);
130
239
  return o.isSome() ? Some(Ok(o.unwrap())) : None;
131
240
  },
132
- map: (fn) => Ok(fn(value)),
133
- mapErr: (_fn) => Ok(value),
134
- mapOr: (_defaultValue, fn) => fn(value),
135
- mapOrElse: (_defaultFn, fn) => fn(value),
136
- flatten: () => {
241
+ map(fn) {
242
+ return Ok(fn(value));
243
+ },
244
+ mapErr(_fn) {
245
+ return Ok(value);
246
+ },
247
+ mapOr(_defaultValue, fn) {
248
+ return fn(value);
249
+ },
250
+ mapOrElse(_defaultFn, fn) {
251
+ return fn(value);
252
+ },
253
+ flatten() {
137
254
  const r = value;
138
255
  assertResult(r);
139
256
  return r;
140
257
  },
141
- and: (other) => {
258
+ and(other) {
142
259
  assertResult(other);
143
260
  return other;
144
261
  },
145
- or: (_other) => ok,
146
- andThen: (fn) => fn(value),
147
- orElse: (_fn) => ok,
148
- inspect: (fn) => {
262
+ or(_other) {
263
+ return ok;
264
+ },
265
+ andThen(fn) {
266
+ return fn(value);
267
+ },
268
+ orElse(_fn) {
269
+ return ok;
270
+ },
271
+ inspect(fn) {
149
272
  fn(value);
150
273
  return ok;
151
274
  },
152
- inspectErr: (_fn) => ok,
153
- eq: (other) => {
275
+ inspectErr(_fn) {
276
+ return ok;
277
+ },
278
+ eq(other) {
154
279
  assertResult(other);
155
280
  return other.isOk() && other.unwrap() === value;
156
281
  },
@@ -159,48 +284,92 @@ function Ok(value) {
159
284
  },
160
285
  asErr() {
161
286
  throw new TypeError("Called `Result::asErr()` on an `Ok` value");
287
+ },
288
+ toString() {
289
+ return `Ok(${value})`;
162
290
  }
163
291
  };
164
292
  return ok;
165
293
  }
166
294
  function Err(error) {
167
295
  const err = {
168
- [resultKindSymbol]: "Err",
169
- isOk: () => false,
170
- isErr: () => true,
171
- isOkAnd: (_predicate) => false,
172
- isErrAnd: (predicate) => predicate(error),
173
- expect: (msg) => {
296
+ [Symbol.toStringTag]: "Result",
297
+ [ResultKindSymbol]: "Err",
298
+ isOk() {
299
+ return false;
300
+ },
301
+ isErr() {
302
+ return true;
303
+ },
304
+ isOkAnd(_predicate) {
305
+ return false;
306
+ },
307
+ isErrAnd(predicate) {
308
+ return predicate(error);
309
+ },
310
+ expect(msg) {
174
311
  throw new TypeError(`${msg}: ${error}`);
175
312
  },
176
- unwrap: () => {
313
+ unwrap() {
177
314
  throw new TypeError("Called `Result::unwrap()` on an `Err` value");
178
315
  },
179
- unwrapOr: (defaultValue) => defaultValue,
180
- unwrapOrElse: (fn) => fn(error),
181
- expectErr: (_msg) => error,
182
- unwrapErr: () => error,
183
- ok: () => None,
184
- err: () => Some(error),
185
- transpose: () => Some(err),
186
- map: (_fn) => err,
187
- mapErr: (fn) => Err(fn(error)),
188
- mapOr: (defaultValue, _fn) => defaultValue,
189
- mapOrElse: (defaultFn, _fn) => defaultFn(error),
190
- flatten: () => err,
191
- and: (_other) => err,
192
- or: (other) => {
316
+ unwrapOr(defaultValue) {
317
+ return defaultValue;
318
+ },
319
+ unwrapOrElse(fn) {
320
+ return fn(error);
321
+ },
322
+ expectErr(_msg) {
323
+ return error;
324
+ },
325
+ unwrapErr() {
326
+ return error;
327
+ },
328
+ ok() {
329
+ return None;
330
+ },
331
+ err() {
332
+ return Some(error);
333
+ },
334
+ transpose() {
335
+ return Some(err);
336
+ },
337
+ map(_fn) {
338
+ return err;
339
+ },
340
+ mapErr(fn) {
341
+ return Err(fn(error));
342
+ },
343
+ mapOr(defaultValue, _fn) {
344
+ return defaultValue;
345
+ },
346
+ mapOrElse(defaultFn, _fn) {
347
+ return defaultFn(error);
348
+ },
349
+ flatten() {
350
+ return err;
351
+ },
352
+ and(_other) {
353
+ return err;
354
+ },
355
+ or(other) {
193
356
  assertResult(other);
194
357
  return other;
195
358
  },
196
- andThen: (_fn) => err,
197
- orElse: (fn) => fn(error),
198
- inspect: (_fn) => err,
199
- inspectErr: (fn) => {
359
+ andThen(_fn) {
360
+ return err;
361
+ },
362
+ orElse(fn) {
363
+ return fn(error);
364
+ },
365
+ inspect(_fn) {
366
+ return err;
367
+ },
368
+ inspectErr(fn) {
200
369
  fn(error);
201
370
  return err;
202
371
  },
203
- eq: (other) => {
372
+ eq(other) {
204
373
  assertResult(other);
205
374
  return other.isErr() && other.unwrapErr() === error;
206
375
  },
@@ -209,21 +378,29 @@ function Err(error) {
209
378
  },
210
379
  asErr() {
211
380
  return err;
381
+ },
382
+ toString() {
383
+ return `Err(${error})`;
212
384
  }
213
385
  };
214
386
  return err;
215
387
  }
216
388
  function assertOption(o) {
217
- if (o == null || typeof o !== "object" || !(optionKindSymbol in o)) {
389
+ if (!isOption(o)) {
218
390
  throw new TypeError(`This(${o}) is not an Option`);
219
391
  }
220
392
  }
221
393
  function assertResult(r) {
222
- if (r == null || typeof r !== "object" || !(resultKindSymbol in r)) {
394
+ if (!isResult(r)) {
223
395
  throw new TypeError(`This(${r}) is not a Result`);
224
396
  }
225
397
  }
226
- function promiseToResult(p) {
398
+
399
+ const RESULT_TRUE = Ok(true);
400
+ const RESULT_FALSE = Ok(false);
401
+ const RESULT_ZERO = Ok(0);
402
+
403
+ function promiseToAsyncResult(p) {
227
404
  return p.then((x) => {
228
405
  return Ok(x);
229
406
  }).catch((err) => {
@@ -231,5 +408,5 @@ function promiseToResult(p) {
231
408
  });
232
409
  }
233
410
 
234
- export { Err, None, Ok, Some, promiseToResult };
411
+ export { Err, None, Ok, RESULT_FALSE, RESULT_TRUE, RESULT_ZERO, Some, isOption, isResult, promiseToAsyncResult };
235
412
  //# sourceMappingURL=main.mjs.map