@othree.io/optional 1.3.0 → 1.7.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/lib/optional.d.ts CHANGED
@@ -1,17 +1,21 @@
1
- export declare function Try<T, E extends Error>(thunk: (() => T | undefined) | (() => Promise<T | undefined>)): Optional<T> | Promise<Optional<T>>;
1
+ export declare function Try<T>(thunk: () => Optional<T> | T): Optional<T>;
2
+ export declare function TryAsync<T>(thunk: () => Promise<Optional<T>> | Promise<T>): Promise<Optional<T>>;
2
3
  export interface Maybe<T, E extends Error> {
3
4
  readonly get: () => T;
4
5
  readonly orElse: (value: T) => T;
5
6
  readonly orThrow: (error: E) => T;
6
- readonly map: <A>(callback: (value: T) => A | undefined) => Optional<A> | Promise<Optional<A>>;
7
+ readonly map: <A>(callback: (value: T) => Optional<A> | A) => Optional<A>;
8
+ readonly mapAsync: <A>(callback: (value: T) => Promise<Optional<A>> | Promise<A>) => Promise<Optional<A>>;
7
9
  readonly getError: () => any;
10
+ readonly catch: <A>(callback: (error: E) => Optional<A> | A) => Optional<A> | Optional<T>;
8
11
  readonly isEmpty: boolean;
9
12
  readonly isPresent: boolean;
10
13
  }
11
- export declare type Optional<T> = Maybe<T | undefined, Error>;
14
+ export declare type Optional<T> = Maybe<T, Error>;
15
+ export declare function Empty<T>(error?: Error): Optional<T>;
12
16
  export declare class EmptyOptionalError extends Error {
13
17
  static ERROR: string;
14
18
  constructor();
15
19
  }
16
- export declare function Optional<T>(value: T, error?: Error | undefined): Optional<T>;
20
+ export declare function Optional<T>(value: Optional<T> | T, error?: Error): Optional<T>;
17
21
  //# sourceMappingURL=optional.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../src/optional.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAWzI;AAYD,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9F,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC9B;AAED,oBAAY,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,CAAA;AAErD,qBAAa,kBAAmB,SAAQ,KAAK;IACzC,MAAM,CAAC,KAAK,SAAuB;;CAMtC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAE,KAAK,GAAG,SAAqB,GAAG,QAAQ,CAAC,CAAC,CAAC,CA2CvF"}
1
+ {"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../src/optional.ts"],"names":[],"mappings":"AAaA,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAUhE;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAWtG;AAED,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAA;IACzE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACzG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACzF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC9B;AAED,oBAAY,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAEzC,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEnD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACzC,MAAM,CAAC,KAAK,SAAuB;;CAOtC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAkE9E"}
package/lib/optional.js CHANGED
@@ -9,27 +9,38 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.Optional = exports.EmptyOptionalError = exports.Try = void 0;
13
- const util = require('util');
12
+ exports.Optional = exports.EmptyOptionalError = exports.Empty = exports.TryAsync = exports.Try = void 0;
13
+ function isOptional(optional) {
14
+ return Boolean(optional &&
15
+ typeof optional.get === 'function' &&
16
+ typeof optional.orElse === 'function' &&
17
+ typeof optional.orThrow === 'function' &&
18
+ typeof optional.map === 'function' &&
19
+ typeof optional.mapAsync === 'function' &&
20
+ typeof optional.getError === 'function' &&
21
+ typeof optional.isEmpty === 'boolean' &&
22
+ typeof optional.isPresent === 'boolean');
23
+ }
14
24
  function Try(thunk) {
15
25
  try {
16
26
  const value = thunk();
17
- if (util.types.isPromise(value)) {
18
- return TryPromise(value);
19
- }
20
- else {
21
- return Optional(value);
27
+ if (isOptional(value)) {
28
+ return value;
22
29
  }
30
+ return Optional(value);
23
31
  }
24
32
  catch (error) {
25
33
  return Optional(undefined, error);
26
34
  }
27
35
  }
28
36
  exports.Try = Try;
29
- function TryPromise(promise) {
37
+ function TryAsync(thunk) {
30
38
  return __awaiter(this, void 0, void 0, function* () {
31
39
  try {
32
- const value = yield promise;
40
+ const value = yield thunk();
41
+ if (isOptional(value)) {
42
+ return value;
43
+ }
33
44
  return Optional(value);
34
45
  }
35
46
  catch (error) {
@@ -38,6 +49,11 @@ function TryPromise(promise) {
38
49
  }
39
50
  });
40
51
  }
52
+ exports.TryAsync = TryAsync;
53
+ function Empty(error) {
54
+ return Optional(undefined, error);
55
+ }
56
+ exports.Empty = Empty;
41
57
  class EmptyOptionalError extends Error {
42
58
  constructor() {
43
59
  super('Optional is empty');
@@ -46,41 +62,61 @@ class EmptyOptionalError extends Error {
46
62
  }
47
63
  exports.EmptyOptionalError = EmptyOptionalError;
48
64
  EmptyOptionalError.ERROR = 'EmptyOptionalError';
49
- function Optional(value, error = undefined) {
50
- const isEmpty = typeof value === 'undefined' || value === null;
65
+ function Optional(value, error) {
66
+ const getValue = (value) => {
67
+ if (isOptional(value)) {
68
+ return value.isPresent ? value.get() : undefined;
69
+ }
70
+ return value;
71
+ };
72
+ const theValue = getValue(value);
73
+ const theError = isOptional(value) && !error ? value.getError() : error;
74
+ const isEmpty = typeof theValue === 'undefined' || theValue === null;
51
75
  const isPresent = !isEmpty;
52
76
  return Object.freeze({
53
77
  get: () => {
54
78
  if (isEmpty) {
55
- if (!error) {
79
+ if (!theError) {
56
80
  throw new EmptyOptionalError();
57
81
  }
58
82
  else {
59
- throw error;
83
+ throw theError;
60
84
  }
61
85
  }
62
- return value;
86
+ return theValue;
63
87
  },
64
88
  orElse: (elseValue) => {
65
89
  if (isEmpty) {
66
90
  return elseValue;
67
91
  }
68
- return value;
92
+ return theValue;
69
93
  },
70
94
  orThrow: (error) => {
71
95
  if (isEmpty) {
72
96
  throw error;
73
97
  }
74
- return value;
98
+ return theValue;
75
99
  },
76
100
  map: (callback) => {
77
101
  if (isPresent) {
78
- return Try(() => callback(value));
102
+ return Try(() => callback(theValue));
79
103
  }
80
- return Optional(undefined, error);
104
+ return Optional(undefined, theError);
105
+ },
106
+ mapAsync: (callback) => {
107
+ if (isPresent) {
108
+ return TryAsync(() => callback(theValue));
109
+ }
110
+ return Promise.resolve(Optional(undefined, theError));
81
111
  },
82
112
  getError: () => {
83
- return error;
113
+ return theError;
114
+ },
115
+ catch: (callback) => {
116
+ if (isEmpty && theError) {
117
+ return Try(() => callback(theError));
118
+ }
119
+ return Optional(theValue, theError);
84
120
  },
85
121
  isEmpty: isEmpty,
86
122
  isPresent: isPresent
@@ -1 +1 @@
1
- {"version":3,"file":"optional.js","sourceRoot":"","sources":["../src/optional.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5B,SAAgB,GAAG,CAAqB,KAA6D;IACjG,IAAI;QACA,MAAM,KAAK,GAAG,KAAK,EAAE,CAAA;QACrB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC7B,OAAO,UAAU,CAAC,KAA+B,CAAC,CAAA;SACrD;aAAM;YACH,OAAO,QAAQ,CAAC,KAAsB,CAAC,CAAA;SAC1C;KACJ;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;KACpC;AACL,CAAC;AAXD,kBAWC;AAED,SAAe,UAAU,CAAI,OAA+B;;QACxD,IAAI;YACA,MAAM,KAAK,GAAG,MAAM,OAAO,CAAA;YAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;SACzB;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;YAC3C,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;SACpC;IACL,CAAC;CAAA;AAcD,MAAa,kBAAmB,SAAQ,KAAK;IAEzC;QACI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAE1B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAA;IACxC,CAAC;;AANL,gDAOC;AANU,wBAAK,GAAG,oBAAoB,CAAA;AAQvC,SAAgB,QAAQ,CAAI,KAAQ,EAAE,QAA2B,SAAS;IACtE,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAA;IAC9D,MAAM,SAAS,GAAG,CAAC,OAAO,CAAA;IAE1B,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,GAAG,EAAE,GAAG,EAAE;YACN,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,KAAK,EAAE;oBACR,MAAM,IAAI,kBAAkB,EAAE,CAAA;iBACjC;qBAAM;oBACH,MAAM,KAAK,CAAA;iBACd;aACJ;YAED,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,CAAC,SAAY,EAAE,EAAE;YACrB,IAAI,OAAO,EAAE;gBACT,OAAO,SAAS,CAAA;aACnB;YAED,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACtB,IAAI,OAAO,EAAE;gBACT,MAAM,KAAK,CAAA;aACd;YAED,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,GAAG,EAAE,CAAI,QAAqC,EAAuC,EAAE;YACnF,IAAI,SAAS,EAAE;gBACX,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;aACpC;YAED,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE;YACX,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,SAAS;KACvB,CAAC,CAAA;AACN,CAAC;AA3CD,4BA2CC"}
1
+ {"version":3,"file":"optional.js","sourceRoot":"","sources":["../src/optional.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@othree.io/optional",
3
- "version": "1.3.0",
3
+ "version": "1.7.0",
4
4
  "description": "Implementation of Optional values",
5
5
  "private": false,
6
6
  "main": "lib/index.js",