@bessemer/cornerstone 0.5.63 → 0.5.65

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 (137) hide show
  1. package/dist/array.d.ts +23 -30
  2. package/dist/array.d.ts.map +1 -1
  3. package/dist/array.js +108 -58
  4. package/dist/array.js.map +1 -1
  5. package/dist/assertion.d.ts +1 -9
  6. package/dist/assertion.d.ts.map +1 -1
  7. package/dist/assertion.js +8 -53
  8. package/dist/assertion.js.map +1 -1
  9. package/dist/async-value.js +2 -2
  10. package/dist/async-value.js.map +1 -1
  11. package/dist/async.d.ts.map +1 -1
  12. package/dist/async.js +2 -2
  13. package/dist/async.js.map +1 -1
  14. package/dist/cache.d.ts +5 -5
  15. package/dist/cache.d.ts.map +1 -1
  16. package/dist/cache.js +21 -17
  17. package/dist/cache.js.map +1 -1
  18. package/dist/combinable.d.ts.map +1 -1
  19. package/dist/combinable.js +5 -4
  20. package/dist/combinable.js.map +1 -1
  21. package/dist/comparator.d.ts.map +1 -1
  22. package/dist/comparator.js +9 -8
  23. package/dist/comparator.js.map +1 -1
  24. package/dist/content.d.ts +4 -14
  25. package/dist/content.d.ts.map +1 -1
  26. package/dist/date.d.ts +2 -2
  27. package/dist/date.d.ts.map +1 -1
  28. package/dist/date.js +5 -4
  29. package/dist/date.js.map +1 -1
  30. package/dist/either.d.ts +0 -1
  31. package/dist/either.d.ts.map +1 -1
  32. package/dist/either.js +2 -3
  33. package/dist/either.js.map +1 -1
  34. package/dist/entry.d.ts +9 -7
  35. package/dist/entry.d.ts.map +1 -1
  36. package/dist/entry.js +5 -1
  37. package/dist/entry.js.map +1 -1
  38. package/dist/equalitor.d.ts +2 -1
  39. package/dist/equalitor.d.ts.map +1 -1
  40. package/dist/equalitor.js +6 -2
  41. package/dist/equalitor.js.map +1 -1
  42. package/dist/error-event.d.ts +9 -12
  43. package/dist/error-event.d.ts.map +1 -1
  44. package/dist/error-event.js +45 -12
  45. package/dist/error-event.js.map +1 -1
  46. package/dist/error.d.ts.map +1 -1
  47. package/dist/error.js +2 -2
  48. package/dist/error.js.map +1 -1
  49. package/dist/expression/array-expression.js +1 -1
  50. package/dist/expression/array-expression.js.map +1 -1
  51. package/dist/index.d.ts +3 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +4 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/json.d.ts.map +1 -1
  56. package/dist/json.js +3 -3
  57. package/dist/json.js.map +1 -1
  58. package/dist/logger.d.ts.map +1 -1
  59. package/dist/logger.js +10 -9
  60. package/dist/logger.js.map +1 -1
  61. package/dist/map.d.ts +17 -0
  62. package/dist/map.d.ts.map +1 -0
  63. package/dist/map.js +117 -0
  64. package/dist/map.js.map +1 -0
  65. package/dist/math.d.ts +1 -1
  66. package/dist/math.d.ts.map +1 -1
  67. package/dist/math.js +4 -7
  68. package/dist/math.js.map +1 -1
  69. package/dist/misc.d.ts.map +1 -1
  70. package/dist/misc.js +4 -3
  71. package/dist/misc.js.map +1 -1
  72. package/dist/monetary-amount.d.ts +8 -2
  73. package/dist/monetary-amount.d.ts.map +1 -1
  74. package/dist/monetary-amount.js +25 -8
  75. package/dist/monetary-amount.js.map +1 -1
  76. package/dist/object-path.d.ts +10 -0
  77. package/dist/object-path.d.ts.map +1 -0
  78. package/dist/object-path.js +78 -0
  79. package/dist/object-path.js.map +1 -0
  80. package/dist/object.d.ts +5 -24
  81. package/dist/object.d.ts.map +1 -1
  82. package/dist/object.js +64 -96
  83. package/dist/object.js.map +1 -1
  84. package/dist/patch.d.ts.map +1 -1
  85. package/dist/patch.js +5 -5
  86. package/dist/patch.js.map +1 -1
  87. package/dist/property.d.ts.map +1 -1
  88. package/dist/property.js +5 -4
  89. package/dist/property.js.map +1 -1
  90. package/dist/range.d.ts +4 -2
  91. package/dist/range.d.ts.map +1 -1
  92. package/dist/range.js +2 -2
  93. package/dist/range.js.map +1 -1
  94. package/dist/reference.d.ts +1 -2
  95. package/dist/reference.d.ts.map +1 -1
  96. package/dist/reference.js +13 -10
  97. package/dist/reference.js.map +1 -1
  98. package/dist/resource.d.ts.map +1 -1
  99. package/dist/resource.js +2 -2
  100. package/dist/resource.js.map +1 -1
  101. package/dist/result.d.ts.map +1 -1
  102. package/dist/result.js +6 -5
  103. package/dist/result.js.map +1 -1
  104. package/dist/retry.d.ts.map +1 -1
  105. package/dist/retry.js +14 -9
  106. package/dist/retry.js.map +1 -1
  107. package/dist/rich-text.js +2 -2
  108. package/dist/rich-text.js.map +1 -1
  109. package/dist/signature.d.ts +3 -2
  110. package/dist/signature.d.ts.map +1 -1
  111. package/dist/signature.js +6 -4
  112. package/dist/signature.js.map +1 -1
  113. package/dist/store.d.ts +13 -13
  114. package/dist/store.d.ts.map +1 -1
  115. package/dist/store.js +9 -7
  116. package/dist/store.js.map +1 -1
  117. package/dist/string.d.ts.map +1 -1
  118. package/dist/string.js +3 -4
  119. package/dist/string.js.map +1 -1
  120. package/dist/tag.d.ts.map +1 -1
  121. package/dist/tag.js +12 -12
  122. package/dist/tag.js.map +1 -1
  123. package/dist/types.d.ts +2 -2
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/uri.d.ts.map +1 -1
  126. package/dist/uri.js +52 -50
  127. package/dist/uri.js.map +1 -1
  128. package/dist/url.d.ts.map +1 -1
  129. package/dist/url.js.map +1 -1
  130. package/dist/uuid.d.ts.map +1 -1
  131. package/dist/uuid.js +4 -3
  132. package/dist/uuid.js.map +1 -1
  133. package/dist/zod-util.d.ts +1 -1
  134. package/dist/zod-util.d.ts.map +1 -1
  135. package/dist/zod-util.js +4 -1
  136. package/dist/zod-util.js.map +1 -1
  137. package/package.json +2 -2
package/dist/map.js ADDED
@@ -0,0 +1,117 @@
1
+ // src/map.ts
2
+ import { concatenate as arrayConcatenate } from "@bessemer/cornerstone/array";
3
+ import { assert, assertPresent } from "@bessemer/cornerstone/assertion";
4
+ import { Objects } from "@bessemer/cornerstone/index";
5
+ var groupBy = (iterable, mapper) => {
6
+ return collect(
7
+ iterable,
8
+ (it) => [mapper(it), [it]],
9
+ (_, first, second) => arrayConcatenate(first, second)
10
+ );
11
+ };
12
+ var fuse = (target, valuesMap) => {
13
+ return mapValues(target, (value) => {
14
+ const newValue = valuesMap.get(value);
15
+ assertPresent(newValue, () => `Maps.fuse - Encountered missing linkage: ${value}`);
16
+ return newValue;
17
+ });
18
+ };
19
+ var mapKeys = (target, mapper) => {
20
+ return map(target, ([key, value]) => [mapper(key), value]);
21
+ };
22
+ var mapValues = (target, mapper) => {
23
+ return map(target, ([key, value]) => [key, mapper(value)]);
24
+ };
25
+ var map = (target, mapper) => {
26
+ return collect(target.entries(), mapper, (key) => {
27
+ throw new Error(`Maps.transform - Encountered illegal duplicate collection value: ${key}`);
28
+ });
29
+ };
30
+ var collectKeys = (iterable, mapper) => {
31
+ return collect(
32
+ iterable,
33
+ (it) => [mapper(it), it],
34
+ (key) => {
35
+ throw new Error(`Maps.collectKeys - Encountered illegal duplicate collection value: ${key}`);
36
+ }
37
+ );
38
+ };
39
+ var collectValues = (iterable, mapper) => {
40
+ return collect(
41
+ iterable,
42
+ (it) => [it, mapper(it)],
43
+ (key) => {
44
+ throw new Error(`Maps.mapValues - Encountered illegal duplicate collection value: ${key}`);
45
+ }
46
+ );
47
+ };
48
+ function collect(iterable, mapEntry, reducer) {
49
+ const result = /* @__PURE__ */ new Map();
50
+ for (const item of iterable) {
51
+ const [key, value] = mapEntry(item);
52
+ if (result.has(key)) {
53
+ if (Objects.isNil(reducer)) {
54
+ throw new Error(`Maps.collect - Encountered illegal duplicate collection key: ${key}`);
55
+ }
56
+ const existingValue = result.get(key);
57
+ const reducedValue = reducer(key, existingValue, value);
58
+ result.set(key, reducedValue);
59
+ } else {
60
+ result.set(key, value);
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ var append = (map2, ...values) => {
66
+ const result = new Map(map2.entries());
67
+ appendInto(result, ...values);
68
+ return result;
69
+ };
70
+ var appendInto = (map2, ...values) => {
71
+ for (const [key, value] of values) {
72
+ assert(!map2.has(key), () => `Maps.append - Encountered illegal duplicate key: ${key}`);
73
+ map2.set(key, value);
74
+ }
75
+ };
76
+ var concatenate = (map2, ...values) => {
77
+ const result = new Map(map2);
78
+ concatenateInto(result, ...values);
79
+ return result;
80
+ };
81
+ var concatenateInto = (map2, ...values) => {
82
+ for (const otherMap of values) {
83
+ for (const [key, value] of otherMap) {
84
+ assert(!map2.has(key), () => `Maps.concatenate - Encountered illegal duplicate key: ${key}`);
85
+ map2.set(key, value);
86
+ }
87
+ }
88
+ };
89
+ var filter = (map2, predicate) => {
90
+ const result = new Map(map2);
91
+ filterFrom(result, predicate);
92
+ return result;
93
+ };
94
+ var filterFrom = (map2, predicate) => {
95
+ for (const entry of map2) {
96
+ if (!predicate(entry)) {
97
+ map2.delete(entry[0]);
98
+ }
99
+ }
100
+ };
101
+ export {
102
+ append,
103
+ appendInto,
104
+ collect,
105
+ collectKeys,
106
+ collectValues,
107
+ concatenate,
108
+ concatenateInto,
109
+ filter,
110
+ filterFrom,
111
+ fuse,
112
+ groupBy,
113
+ map,
114
+ mapKeys,
115
+ mapValues
116
+ };
117
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/map.ts"],"sourcesContent":["import { Entry } from '@bessemer/cornerstone/entry'\nimport { concatenate as arrayConcatenate } from '@bessemer/cornerstone/array'\nimport { assert, assertPresent } from '@bessemer/cornerstone/assertion'\nimport { Objects } from '@bessemer/cornerstone/index'\n\nexport const groupBy = <CollectionType, KeyType>(\n iterable: Iterable<CollectionType>,\n mapper: (it: CollectionType) => KeyType\n): Map<KeyType, Array<CollectionType>> => {\n return collect(\n iterable,\n (it) => [mapper(it), [it]],\n (_, first, second) => arrayConcatenate(first, second)\n )\n}\n\nexport const fuse = <KeyType, FuseType, ValueType>(target: Map<KeyType, FuseType>, valuesMap: Map<FuseType, ValueType>): Map<KeyType, ValueType> => {\n return mapValues(target, (value) => {\n const newValue = valuesMap.get(value)\n assertPresent(newValue, () => `Maps.fuse - Encountered missing linkage: ${value}`)\n return newValue\n })\n}\n\nexport const mapKeys = <KeyType, ValueType, NewKeyType>(\n target: Map<KeyType, ValueType>,\n mapper: (key: KeyType) => NewKeyType\n): Map<NewKeyType, ValueType> => {\n return map(target, ([key, value]) => [mapper(key), value])\n}\n\nexport const mapValues = <KeyType, ValueType, NewValueType>(\n target: Map<KeyType, ValueType>,\n mapper: (value: ValueType) => NewValueType\n): Map<KeyType, NewValueType> => {\n return map(target, ([key, value]) => [key, mapper(value)])\n}\n\nexport const map = <KeyType, ValueType, NewKeyType, NewValueType>(\n target: Map<KeyType, ValueType>,\n mapper: (entry: Entry<KeyType, ValueType>) => Entry<NewKeyType, NewValueType>\n): Map<NewKeyType, NewValueType> => {\n return collect(target.entries(), mapper, (key) => {\n throw new Error(`Maps.transform - Encountered illegal duplicate collection value: ${key}`)\n })\n}\n\nexport const collectKeys = <CollectionType, KeyType>(\n iterable: Iterable<CollectionType>,\n mapper: (it: CollectionType) => KeyType\n): Map<KeyType, CollectionType> => {\n return collect(\n iterable,\n (it) => [mapper(it), it],\n (key) => {\n throw new Error(`Maps.collectKeys - Encountered illegal duplicate collection value: ${key}`)\n }\n )\n}\n\nexport const collectValues = <CollectionType, ValueType>(\n iterable: Iterable<CollectionType>,\n mapper: (it: CollectionType) => ValueType\n): Map<CollectionType, ValueType> => {\n return collect(\n iterable,\n (it) => [it, mapper(it)],\n (key) => {\n throw new Error(`Maps.mapValues - Encountered illegal duplicate collection value: ${key}`)\n }\n )\n}\n\nexport function collect<CollectionType, KeyType, ValueType>(\n iterable: Iterable<CollectionType>,\n mapEntry: (it: CollectionType) => Entry<KeyType, ValueType>\n): Map<KeyType, ValueType>\nexport function collect<CollectionType, KeyType, ValueType>(\n iterable: Iterable<CollectionType>,\n mapEntry: (it: CollectionType) => Entry<KeyType, ValueType>,\n reducer: (key: KeyType, first: ValueType, second: ValueType) => ValueType\n): Map<KeyType, ValueType>\nexport function collect<CollectionType, KeyType, ValueType>(\n iterable: Iterable<CollectionType>,\n mapEntry: (it: CollectionType) => Entry<KeyType, ValueType>,\n reducer?: (key: KeyType, first: ValueType, second: ValueType) => ValueType\n): Map<KeyType, ValueType> {\n const result = new Map<KeyType, ValueType>()\n\n for (const item of iterable) {\n const [key, value] = mapEntry(item)\n\n if (result.has(key)) {\n if (Objects.isNil(reducer)) {\n throw new Error(`Maps.collect - Encountered illegal duplicate collection key: ${key}`)\n }\n\n const existingValue = result.get(key)!\n const reducedValue = reducer(key, existingValue, value)\n result.set(key, reducedValue)\n } else {\n result.set(key, value)\n }\n }\n\n return result\n}\n\nexport const append = <KeyType, ValueType>(map: Map<KeyType, ValueType>, ...values: Array<Entry<KeyType, ValueType>>): Map<KeyType, ValueType> => {\n const result = new Map(map.entries())\n appendInto(result, ...values)\n return result\n}\n\nexport const appendInto = <KeyType, ValueType>(map: Map<KeyType, ValueType>, ...values: Array<Entry<KeyType, ValueType>>): void => {\n for (const [key, value] of values) {\n assert(!map.has(key), () => `Maps.append - Encountered illegal duplicate key: ${key}`)\n map.set(key, value)\n }\n}\n\nexport const concatenate = <KeyType, ValueType>(map: Map<KeyType, ValueType>, ...values: Array<Map<KeyType, ValueType>>): Map<KeyType, ValueType> => {\n const result = new Map(map)\n concatenateInto(result, ...values)\n return result\n}\n\nexport const concatenateInto = <KeyType, ValueType>(map: Map<KeyType, ValueType>, ...values: Array<Map<KeyType, ValueType>>): void => {\n for (const otherMap of values) {\n for (const [key, value] of otherMap) {\n assert(!map.has(key), () => `Maps.concatenate - Encountered illegal duplicate key: ${key}`)\n map.set(key, value)\n }\n }\n}\n\nexport const filter = <KeyType, ValueType>(\n map: Map<KeyType, ValueType>,\n predicate: (entry: Entry<KeyType, ValueType>) => boolean\n): Map<KeyType, ValueType> => {\n const result = new Map(map)\n filterFrom(result, predicate)\n return result\n}\n\nexport const filterFrom = <KeyType, ValueType>(map: Map<KeyType, ValueType>, predicate: (entry: Entry<KeyType, ValueType>) => boolean): void => {\n for (const entry of map) {\n if (!predicate(entry)) {\n map.delete(entry[0])\n }\n }\n}\n"],"mappings":"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","names":["map"]}
package/dist/math.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export declare const isNumber: (value?: unknown) => value is number;
2
- export declare const isPositive: (value?: unknown) => value is number;
3
2
  export declare const isEven: (d: number) => boolean;
3
+ export declare const isOdd: (d: number) => boolean;
4
4
  export declare enum RoundingMode {
5
5
  Nearest = "Nearest",
6
6
  Down = "Down",
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,KAAG,KAAK,IAAI,MAKnD,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,OAAO,KAAG,KAAK,IAAI,MAErD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,YAAgB,CAAA;AAEhD,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,EAAE,OAAO;IACT,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,eAAc,YAAmC,KAAG,MAWvG,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MAG3D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WAGrD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WAGnD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MA0E5D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAEjD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,MAEpE,CAAA"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,KAAG,KAAK,IAAI,MAMnD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,YAAgB,CAAA;AAEhD,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,YAAgB,CAAA;AAE/C,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,EAAE,OAAO;IACT,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,eAAc,YAAmC,KAAG,MAWvG,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MAG3D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WAGrD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WAGnD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MA0E5D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAEjD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,MAEpE,CAAA"}
package/dist/math.js CHANGED
@@ -1,15 +1,12 @@
1
1
  // src/math.ts
2
- import { isNumber as _isNumber } from "lodash-es";
3
2
  var isNumber = (value) => {
4
- if (isNaN(value)) {
3
+ if (value === null || value === void 0) {
5
4
  return false;
6
5
  }
7
- return _isNumber(value);
8
- };
9
- var isPositive = (value) => {
10
- return isNumber(value) && value > 0;
6
+ return typeof value === "number" && !isNaN(value);
11
7
  };
12
8
  var isEven = (d) => d % 2 === 0;
9
+ var isOdd = (d) => d % 2 !== 0;
13
10
  var RoundingMode = /* @__PURE__ */ ((RoundingMode2) => {
14
11
  RoundingMode2["Nearest"] = "Nearest";
15
12
  RoundingMode2["Down"] = "Down";
@@ -119,7 +116,7 @@ export {
119
116
  greatestCommonFactor,
120
117
  isEven,
121
118
  isNumber,
122
- isPositive,
119
+ isOdd,
123
120
  random,
124
121
  round,
125
122
  roundDown,
package/dist/math.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/math.ts"],"sourcesContent":["import { isNumber as _isNumber } from 'lodash-es'\n\nexport const isNumber = (value?: unknown): value is number => {\n if (isNaN(value as any)) {\n return false\n }\n return _isNumber(value)\n}\n\nexport const isPositive = (value?: unknown): value is number => {\n return isNumber(value) && value > 0\n}\n\nexport const isEven = (d: number) => d % 2 === 0\n\nexport enum RoundingMode {\n Nearest = 'Nearest',\n Down = 'Down',\n Up = 'Up',\n HalfEven = 'HalfEven',\n}\n\nexport const round = (value: number, scale: number, roundingMode: RoundingMode = RoundingMode.Nearest): number => {\n switch (roundingMode) {\n case RoundingMode.Nearest:\n return roundNearest(value, scale)\n case RoundingMode.Down:\n return roundDown(value, scale)\n case RoundingMode.Up:\n return roundUp(value, scale)\n case RoundingMode.HalfEven:\n return roundHalfEven(value, scale)\n }\n}\n\nexport const roundNearest = (value: number, scale: number): number => {\n const factor = Math.pow(10, scale)\n return Math.round((value + Number.EPSILON) * factor) / factor\n}\n\nexport const roundDown = (value: number, scale: number) => {\n const factor = Math.pow(10, scale)\n return Math.floor((value + +Number.EPSILON) * factor) / factor\n}\n\nexport const roundUp = (value: number, scale: number) => {\n const factor = Math.pow(10, scale)\n return Math.ceil((value + +Number.EPSILON) * factor) / factor\n}\n\n/**\n * Round Half-Even (Banker's Rounding) Utility\n * https://en.wikipedia.org/wiki/Rounding#Round_half_to_even\n *\n * Mostly copied from this Github: https://github.com/schowdhuri/round-half-even\n */\nexport const roundHalfEven = (value: number, scale: number): number => {\n if (value < 0) {\n return -roundHalfEven(-value, scale)\n }\n if (scale === 0) {\n return roundHalfEven(value / 10, 1) * 10\n }\n\n const MAX_DECIMALS_ALLOWED = 20\n if (scale > MAX_DECIMALS_ALLOWED) {\n throw new Error(`Cannot handle more than ${MAX_DECIMALS_ALLOWED} decimals`)\n }\n\n // convert to string; remove trailing 0s\n const isExponentialForm = value.toString().includes('e') || value.toString().includes('E')\n const strNum = (isExponentialForm ? value.toFixed(MAX_DECIMALS_ALLOWED).toString() : value.toString()).replace(/0+$/, '')\n const decimalIndex = strNum.indexOf('.')\n if (decimalIndex < 0) {\n // no fractional part\n return value\n }\n let intPart: string = strNum.slice(0, decimalIndex)\n if (intPart.length == 0) {\n intPart = '0'\n }\n let fractPart = strNum.slice(decimalIndex + 1) // extract fractional part\n if (fractPart.length < scale) {\n return value\n }\n const followingDig = parseInt(fractPart[scale]!, 10)\n if (followingDig < 5) {\n // rounding not required\n const newFractPart = fractPart.slice(0, scale)\n return parseFloat(`${intPart}.${newFractPart}`)\n }\n if (followingDig === 5) {\n const newFractPart = fractPart.slice(0, scale + 1)\n if (parseInt(fractPart.slice(scale + 1), 10) > 0) {\n fractPart = `${newFractPart}9`\n } else {\n fractPart = newFractPart\n }\n }\n\n let nextDig = parseInt(fractPart[fractPart.length - 1]!, 10)\n let carriedOver = 0\n for (let ptr = fractPart.length - 1; ptr >= scale; ptr--) {\n let dig = parseInt(fractPart[ptr - 1]!, 10) + carriedOver\n if (nextDig > 5 || (nextDig == 5 && !isEven(dig))) {\n ++dig\n }\n if (dig > 9) {\n dig -= 10\n carriedOver = 1\n } else {\n carriedOver = 0\n }\n nextDig = dig\n }\n\n let newFractPart = ''\n for (let ptr = scale - 2; ptr >= 0; ptr--) {\n let d = parseInt(fractPart[ptr]!, 10) + carriedOver\n if (d > 9) {\n d -= 10\n carriedOver = 1\n } else {\n carriedOver = 0\n }\n newFractPart = `${d}${newFractPart}`\n }\n\n const resolvedIntPart = parseInt(intPart, 10) + carriedOver\n return parseFloat(`${resolvedIntPart}.${newFractPart}${nextDig}`)\n}\n\nexport const random = (min: number, max: number): number => {\n return Math.random() * (max - min) + min\n}\n\nexport const greatestCommonFactor = (first: number, second: number): number => {\n return second === 0 ? first : greatestCommonFactor(second, first % second)\n}\n"],"mappings":"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","names":["RoundingMode","newFractPart"]}
1
+ {"version":3,"sources":["../src/math.ts"],"sourcesContent":["export const isNumber = (value?: unknown): value is number => {\n if (value === null || value === undefined) {\n return false\n }\n\n return typeof value === 'number' && !isNaN(value)\n}\n\nexport const isEven = (d: number) => d % 2 === 0\n\nexport const isOdd = (d: number) => d % 2 !== 0\n\nexport enum RoundingMode {\n Nearest = 'Nearest',\n Down = 'Down',\n Up = 'Up',\n HalfEven = 'HalfEven',\n}\n\nexport const round = (value: number, scale: number, roundingMode: RoundingMode = RoundingMode.Nearest): number => {\n switch (roundingMode) {\n case RoundingMode.Nearest:\n return roundNearest(value, scale)\n case RoundingMode.Down:\n return roundDown(value, scale)\n case RoundingMode.Up:\n return roundUp(value, scale)\n case RoundingMode.HalfEven:\n return roundHalfEven(value, scale)\n }\n}\n\nexport const roundNearest = (value: number, scale: number): number => {\n const factor = Math.pow(10, scale)\n return Math.round((value + Number.EPSILON) * factor) / factor\n}\n\nexport const roundDown = (value: number, scale: number) => {\n const factor = Math.pow(10, scale)\n return Math.floor((value + +Number.EPSILON) * factor) / factor\n}\n\nexport const roundUp = (value: number, scale: number) => {\n const factor = Math.pow(10, scale)\n return Math.ceil((value + +Number.EPSILON) * factor) / factor\n}\n\n/**\n * Round Half-Even (Banker's Rounding) Utility\n * https://en.wikipedia.org/wiki/Rounding#Round_half_to_even\n *\n * Mostly copied from this Github: https://github.com/schowdhuri/round-half-even\n */\nexport const roundHalfEven = (value: number, scale: number): number => {\n if (value < 0) {\n return -roundHalfEven(-value, scale)\n }\n if (scale === 0) {\n return roundHalfEven(value / 10, 1) * 10\n }\n\n const MAX_DECIMALS_ALLOWED = 20\n if (scale > MAX_DECIMALS_ALLOWED) {\n throw new Error(`Cannot handle more than ${MAX_DECIMALS_ALLOWED} decimals`)\n }\n\n // convert to string; remove trailing 0s\n const isExponentialForm = value.toString().includes('e') || value.toString().includes('E')\n const strNum = (isExponentialForm ? value.toFixed(MAX_DECIMALS_ALLOWED).toString() : value.toString()).replace(/0+$/, '')\n const decimalIndex = strNum.indexOf('.')\n if (decimalIndex < 0) {\n // no fractional part\n return value\n }\n let intPart: string = strNum.slice(0, decimalIndex)\n if (intPart.length == 0) {\n intPart = '0'\n }\n let fractPart = strNum.slice(decimalIndex + 1) // extract fractional part\n if (fractPart.length < scale) {\n return value\n }\n const followingDig = parseInt(fractPart[scale]!, 10)\n if (followingDig < 5) {\n // rounding not required\n const newFractPart = fractPart.slice(0, scale)\n return parseFloat(`${intPart}.${newFractPart}`)\n }\n if (followingDig === 5) {\n const newFractPart = fractPart.slice(0, scale + 1)\n if (parseInt(fractPart.slice(scale + 1), 10) > 0) {\n fractPart = `${newFractPart}9`\n } else {\n fractPart = newFractPart\n }\n }\n\n let nextDig = parseInt(fractPart[fractPart.length - 1]!, 10)\n let carriedOver = 0\n for (let ptr = fractPart.length - 1; ptr >= scale; ptr--) {\n let dig = parseInt(fractPart[ptr - 1]!, 10) + carriedOver\n if (nextDig > 5 || (nextDig == 5 && !isEven(dig))) {\n ++dig\n }\n if (dig > 9) {\n dig -= 10\n carriedOver = 1\n } else {\n carriedOver = 0\n }\n nextDig = dig\n }\n\n let newFractPart = ''\n for (let ptr = scale - 2; ptr >= 0; ptr--) {\n let d = parseInt(fractPart[ptr]!, 10) + carriedOver\n if (d > 9) {\n d -= 10\n carriedOver = 1\n } else {\n carriedOver = 0\n }\n newFractPart = `${d}${newFractPart}`\n }\n\n const resolvedIntPart = parseInt(intPart, 10) + carriedOver\n return parseFloat(`${resolvedIntPart}.${newFractPart}${nextDig}`)\n}\n\nexport const random = (min: number, max: number): number => {\n return Math.random() * (max - min) + min\n}\n\nexport const greatestCommonFactor = (first: number, second: number): number => {\n return second === 0 ? first : greatestCommonFactor(second, first % second)\n}\n"],"mappings":"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","names":["RoundingMode","newFractPart"]}
@@ -1 +1 @@
1
- {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE3D,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAG,CAkBhG,CAAA"}
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAI3D,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAG,CAkBhG,CAAA"}
package/dist/misc.js CHANGED
@@ -1,13 +1,14 @@
1
1
  // src/misc.ts
2
- import { Assertions, Objects } from "@bessemer/cornerstone";
2
+ import { isPresent } from "@bessemer/cornerstone/object";
3
+ import { assert } from "@bessemer/cornerstone/assertion";
3
4
  var doUntilConsistent = (supplier, equals) => {
4
5
  let done = false;
5
6
  let previousValue = null;
6
7
  let attempts = 0;
7
8
  do {
8
- Assertions.assertTrue(attempts < 10);
9
+ assert(attempts < 10);
9
10
  const currentValue = supplier(previousValue);
10
- if (Objects.isPresent(previousValue) && equals(previousValue, currentValue)) {
11
+ if (isPresent(previousValue) && equals(previousValue, currentValue)) {
11
12
  done = true;
12
13
  }
13
14
  previousValue = currentValue;
package/dist/misc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/misc.ts"],"sourcesContent":["import { Assertions, Objects } from '@bessemer/cornerstone'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\n\nexport const doUntilConsistent = <T>(supplier: (previous: T | null) => T, equals: Equalitor<T>): T => {\n let done = false\n let previousValue: T | null = null\n let attempts = 0\n do {\n Assertions.assertTrue(attempts < 10)\n\n const currentValue = supplier(previousValue)\n\n if (Objects.isPresent(previousValue) && equals(previousValue, currentValue)) {\n done = true\n }\n\n previousValue = currentValue\n attempts++\n } while (!done)\n\n return previousValue\n}\n"],"mappings":";AAAA,SAAS,YAAY,eAAe;AAG7B,IAAM,oBAAoB,CAAI,UAAqC,WAA4B;AACpG,MAAI,OAAO;AACX,MAAI,gBAA0B;AAC9B,MAAI,WAAW;AACf,KAAG;AACD,eAAW,WAAW,WAAW,EAAE;AAEnC,UAAM,eAAe,SAAS,aAAa;AAE3C,QAAI,QAAQ,UAAU,aAAa,KAAK,OAAO,eAAe,YAAY,GAAG;AAC3E,aAAO;AAAA,IACT;AAEA,oBAAgB;AAChB;AAAA,EACF,SAAS,CAAC;AAEV,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/misc.ts"],"sourcesContent":["import { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport { isPresent } from '@bessemer/cornerstone/object'\nimport { assert } from '@bessemer/cornerstone/assertion'\n\nexport const doUntilConsistent = <T>(supplier: (previous: T | null) => T, equals: Equalitor<T>): T => {\n let done = false\n let previousValue: T | null = null\n let attempts = 0\n do {\n assert(attempts < 10)\n\n const currentValue = supplier(previousValue)\n\n if (isPresent(previousValue) && equals(previousValue, currentValue)) {\n done = true\n }\n\n previousValue = currentValue\n attempts++\n } while (!done)\n\n return previousValue\n}\n"],"mappings":";AACA,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AAEhB,IAAM,oBAAoB,CAAI,UAAqC,WAA4B;AACpG,MAAI,OAAO;AACX,MAAI,gBAA0B;AAC9B,MAAI,WAAW;AACf,KAAG;AACD,WAAO,WAAW,EAAE;AAEpB,UAAM,eAAe,SAAS,aAAa;AAE3C,QAAI,UAAU,aAAa,KAAK,OAAO,eAAe,YAAY,GAAG;AACnE,aAAO;AAAA,IACT;AAEA,oBAAgB;AAChB;AAAA,EACF,SAAS,CAAC;AAEV,SAAO;AACT;","names":[]}
@@ -1,10 +1,13 @@
1
1
  import { CurrencyCode } from '@bessemer/cornerstone/currency';
2
2
  import { ZodType } from 'zod';
3
+ import { Comparator as IComparator } from '@bessemer/cornerstone/comparator';
3
4
  export type MonetaryAmount = {
4
5
  amount: number;
5
6
  currency: CurrencyCode;
6
7
  };
7
8
  export declare const Schema: ZodType<MonetaryAmount>;
9
+ export declare const Comparator: IComparator<MonetaryAmount>;
10
+ export declare const Equalitor: import("@bessemer/cornerstone/equalitor").Equalitor<MonetaryAmount>;
8
11
  export declare const of: (amount: number, currency: CurrencyCode) => MonetaryAmount;
9
12
  export declare const zero: (currency: CurrencyCode) => MonetaryAmount;
10
13
  export declare const apply: <T>(first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => T) => T;
@@ -15,11 +18,14 @@ export declare const sum: (first: MonetaryAmount, second?: MonetaryAmount | null
15
18
  export declare const subtract: (first: MonetaryAmount, second: MonetaryAmount) => MonetaryAmount;
16
19
  export declare const multiply: (money: MonetaryAmount, value: number) => MonetaryAmount;
17
20
  export declare const divide: (money: MonetaryAmount, value: number) => MonetaryAmount;
18
- export declare function sumAll(monetaryAmounts: [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount;
19
- export declare function sumAll(monetaryAmounts: Array<MonetaryAmount>): MonetaryAmount | null;
21
+ export declare function sumAll(monetaryAmounts: readonly [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount;
22
+ export declare function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency: CurrencyCode): MonetaryAmount;
20
23
  export declare const negate: (monetaryAmount: MonetaryAmount) => MonetaryAmount;
21
24
  export declare const isZero: (monetaryAmount: MonetaryAmount) => boolean;
22
25
  export declare const greaterThan: (first: MonetaryAmount, second: MonetaryAmount) => boolean;
26
+ export declare const lessThan: (first: MonetaryAmount, second: MonetaryAmount) => boolean;
27
+ export declare const greaterThanOrEqual: (first: MonetaryAmount, second: MonetaryAmount) => boolean;
28
+ export declare const lessThanOrEqual: (first: MonetaryAmount, second: MonetaryAmount) => boolean;
23
29
  export type MonetaryAmountFormatOptions = {
24
30
  hideCents?: boolean;
25
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"monetary-amount.d.ts","sourceRoot":"","sources":["../src/monetary-amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgC,MAAM,gCAAgC,CAAA;AAC3F,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAMlC,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AACD,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,cAAc,CAGzC,CAAA;AAEF,eAAO,MAAM,EAAE,GAAI,QAAQ,MAAM,EAAE,UAAU,YAAY,KAAG,cAG3D,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,UAAU,YAAY,KAAG,cAE7C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,KAAG,CAMxH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,cAE5H,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,KAAK,GAAI,QAAQ,cAAc,GAAG,IAAI,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,OASrF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,OAAO,cAAc,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,cAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,cAExE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE7D,CAAA;AAED,wBAAgB,MAAM,CAAC,eAAe,EAAE,CAAC,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC,GAAG,cAAc,CAAA;AAC9F,wBAAgB,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,IAAI,CAAA;AASrF,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,cAOvD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,OAEvD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE3E,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,cAAc,EAAE,YAAY,MAAM,EAAE,UAAU,2BAA2B,KAAG,MAgB1G,CAAA"}
1
+ {"version":3,"file":"monetary-amount.d.ts","sourceRoot":"","sources":["../src/monetary-amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgC,MAAM,gCAAgC,CAAA;AAC3F,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAGlC,OAAO,EAAE,UAAU,IAAI,WAAW,EAAW,MAAM,kCAAkC,CAAA;AAIrF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,cAAc,CAGzC,CAAA;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,cAAc,CAElD,CAAA;AAED,eAAO,MAAM,SAAS,qEAA6B,CAAA;AAEnD,eAAO,MAAM,EAAE,GAAI,QAAQ,MAAM,EAAE,UAAU,YAAY,KAAG,cAG3D,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,UAAU,YAAY,KAAG,cAE7C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,KAAG,CAMxH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,cAE5H,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,KAAK,GAAI,QAAQ,cAAc,GAAG,IAAI,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,OASrF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,OAAO,cAAc,EAAE,SAAS,cAAc,GAAG,IAAI,KAAG,cAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,cAExE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,cAAc,EAAE,OAAO,MAAM,KAAG,cAE7D,CAAA;AAED,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC,GAAG,cAAc,CAAA;AACvG,wBAAgB,MAAM,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,cAAc,CAAA;AAM1G,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,cAOvD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,gBAAgB,cAAc,KAAG,OAEvD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE3E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAExE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAElF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,cAAc,EAAE,QAAQ,cAAc,KAAG,OAE/E,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,QAAQ,cAAc,EAAE,YAAY,MAAM,EAAE,UAAU,2BAA2B,KAAG,MAgB1G,CAAA"}
@@ -1,16 +1,21 @@
1
1
  // src/monetary-amount.ts
2
2
  import { Schema as CurrencyCodeSchema } from "@bessemer/cornerstone/currency";
3
3
  import Zod from "zod";
4
- import { assertTrue } from "@bessemer/cornerstone/assertion";
5
4
  import { isNil } from "@bessemer/cornerstone/object";
6
5
  import { roundHalfEven } from "@bessemer/cornerstone/math";
7
- import { isEmpty } from "@bessemer/cornerstone/array";
6
+ import { natural } from "@bessemer/cornerstone/comparator";
7
+ import { fromComparator } from "@bessemer/cornerstone/equalitor";
8
+ import { assert } from "@bessemer/cornerstone/assertion";
8
9
  var Schema = Zod.object({
9
10
  amount: Zod.number().int(),
10
11
  currency: CurrencyCodeSchema
11
12
  });
13
+ var Comparator = (first, second) => {
14
+ return apply(first, second, natural());
15
+ };
16
+ var Equalitor = fromComparator(Comparator);
12
17
  var of = (amount, currency) => {
13
- assertTrue(Number.isInteger(amount));
18
+ assert(Number.isInteger(amount));
14
19
  return { amount, currency };
15
20
  };
16
21
  var zero = (currency) => {
@@ -46,11 +51,9 @@ var multiply = (money, value) => {
46
51
  var divide = (money, value) => {
47
52
  return of(roundHalfEven(money.amount / value, 0), money.currency);
48
53
  };
49
- function sumAll(monetaryAmounts) {
50
- if (isEmpty(monetaryAmounts)) {
51
- return null;
52
- }
53
- return monetaryAmounts.reduce((first, second) => sum(second, first), null);
54
+ function sumAll(monetaryAmounts, currency) {
55
+ const resolvedCurrency = currency ?? monetaryAmounts[0].currency;
56
+ return monetaryAmounts.reduce((first, second) => sum(second, first), zero(resolvedCurrency));
54
57
  }
55
58
  var negate = (monetaryAmount) => {
56
59
  if (isZero(monetaryAmount)) {
@@ -64,6 +67,15 @@ var isZero = (monetaryAmount) => {
64
67
  var greaterThan = (first, second) => {
65
68
  return apply(first, second, (first2, second2) => first2 > second2);
66
69
  };
70
+ var lessThan = (first, second) => {
71
+ return apply(first, second, (first2, second2) => first2 < second2);
72
+ };
73
+ var greaterThanOrEqual = (first, second) => {
74
+ return apply(first, second, (first2, second2) => first2 >= second2);
75
+ };
76
+ var lessThanOrEqual = (first, second) => {
77
+ return apply(first, second, (first2, second2) => first2 <= second2);
78
+ };
67
79
  var format = (amount, alpha2Code, options) => {
68
80
  const hideCents = options?.hideCents ?? false;
69
81
  const isWholeNumber = amount.amount % 100 === 0;
@@ -78,13 +90,18 @@ var format = (amount, alpha2Code, options) => {
78
90
  return formatCurrency.format(amount.amount / 100);
79
91
  };
80
92
  export {
93
+ Comparator,
94
+ Equalitor,
81
95
  Schema,
82
96
  apply,
83
97
  divide,
84
98
  equal,
85
99
  format,
86
100
  greaterThan,
101
+ greaterThanOrEqual,
87
102
  isZero,
103
+ lessThan,
104
+ lessThanOrEqual,
88
105
  multiply,
89
106
  negate,
90
107
  of,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/monetary-amount.ts"],"sourcesContent":["import { CurrencyCode, Schema as CurrencyCodeSchema } from '@bessemer/cornerstone/currency'\nimport Zod, { ZodType } from 'zod'\nimport { assertTrue } from '@bessemer/cornerstone/assertion'\nimport { isNil } from '@bessemer/cornerstone/object'\nimport { roundHalfEven } from '@bessemer/cornerstone/math'\nimport { isEmpty } from '@bessemer/cornerstone/array'\n\nexport type MonetaryAmount = {\n amount: number\n currency: CurrencyCode\n}\nexport const Schema: ZodType<MonetaryAmount> = Zod.object({\n amount: Zod.number().int(),\n currency: CurrencyCodeSchema,\n})\n\nexport const of = (amount: number, currency: CurrencyCode): MonetaryAmount => {\n assertTrue(Number.isInteger(amount))\n return { amount, currency }\n}\n\nexport const zero = (currency: CurrencyCode): MonetaryAmount => {\n return { amount: 0, currency }\n}\n\nexport const apply = <T>(first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => T): T => {\n if (first.currency !== second.currency) {\n throw new Error(`Currency mismatch in operation on MonetaryAmount: ${first.currency}, ${second.currency}`)\n }\n\n return operator(first.amount, second.amount)\n}\n\nexport const operate = (first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => number): MonetaryAmount => {\n return of(apply(first, second, operator), first.currency)\n}\n\n/** Determines whether two MonetaryAmounts are considered equivalent */\nexport const equal = (first?: MonetaryAmount | null, second?: MonetaryAmount | null): boolean => {\n if (isNil(first) && isNil(second)) {\n return true\n }\n if (isNil(first) || isNil(second)) {\n return false\n }\n\n return apply(first, second, (first, second) => first === second)\n}\n\nexport const sum = (first: MonetaryAmount, second?: MonetaryAmount | null): MonetaryAmount => {\n return operate(first, second ?? zero(first.currency), (first, second) => first + second)\n}\n\nexport const subtract = (first: MonetaryAmount, second: MonetaryAmount): MonetaryAmount => {\n return operate(first, second, (first, second) => first - second)\n}\n\nexport const multiply = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount * value, 0), money.currency)\n}\n\nexport const divide = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount / value, 0), money.currency)\n}\n\nexport function sumAll(monetaryAmounts: [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount\nexport function sumAll(monetaryAmounts: Array<MonetaryAmount>): MonetaryAmount | null\nexport function sumAll(monetaryAmounts: Array<MonetaryAmount>): MonetaryAmount | null {\n if (isEmpty(monetaryAmounts)) {\n return null\n }\n\n return monetaryAmounts.reduce<MonetaryAmount | null>((first, second) => sum(second, first), null)\n}\n\nexport const negate = (monetaryAmount: MonetaryAmount): MonetaryAmount => {\n // Avoid creating a negative 0, which is a real thing!\n if (isZero(monetaryAmount)) {\n return monetaryAmount\n }\n\n return of(-monetaryAmount.amount, monetaryAmount.currency)\n}\n\nexport const isZero = (monetaryAmount: MonetaryAmount): boolean => {\n return monetaryAmount.amount === 0\n}\n\nexport const greaterThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first > second)\n}\n\nexport type MonetaryAmountFormatOptions = {\n hideCents?: boolean\n}\n\nexport const format = (amount: MonetaryAmount, alpha2Code: string, options?: MonetaryAmountFormatOptions): string => {\n const hideCents = options?.hideCents ?? false\n const isWholeNumber = amount.amount % 100 === 0\n\n const formatCurrency = new Intl.NumberFormat(alpha2Code, {\n style: 'currency',\n currency: amount.currency,\n ...(hideCents\n ? {\n minimumFractionDigits: isWholeNumber ? 0 : 2,\n maximumFractionDigits: 2,\n }\n : {}),\n })\n\n return formatCurrency.format(amount.amount / 100)\n}\n"],"mappings":";AAAA,SAAuB,UAAU,0BAA0B;AAC3D,OAAO,SAAsB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AAMjB,IAAM,SAAkC,IAAI,OAAO;AAAA,EACxD,QAAQ,IAAI,OAAO,EAAE,IAAI;AAAA,EACzB,UAAU;AACZ,CAAC;AAEM,IAAM,KAAK,CAAC,QAAgB,aAA2C;AAC5E,aAAW,OAAO,UAAU,MAAM,CAAC;AACnC,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEO,IAAM,OAAO,CAAC,aAA2C;AAC9D,SAAO,EAAE,QAAQ,GAAG,SAAS;AAC/B;AAEO,IAAM,QAAQ,CAAI,OAAuB,QAAwB,aAAsD;AAC5H,MAAI,MAAM,aAAa,OAAO,UAAU;AACtC,UAAM,IAAI,MAAM,qDAAqD,MAAM,QAAQ,KAAK,OAAO,QAAQ,EAAE;AAAA,EAC3G;AAEA,SAAO,SAAS,MAAM,QAAQ,OAAO,MAAM;AAC7C;AAEO,IAAM,UAAU,CAAC,OAAuB,QAAwB,aAAwE;AAC7I,SAAO,GAAG,MAAM,OAAO,QAAQ,QAAQ,GAAG,MAAM,QAAQ;AAC1D;AAGO,IAAM,QAAQ,CAAC,OAA+B,WAA4C;AAC/F,MAAI,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,OAAO,QAAQ,CAACA,QAAOC,YAAWD,WAAUC,OAAM;AACjE;AAEO,IAAM,MAAM,CAAC,OAAuB,WAAmD;AAC5F,SAAO,QAAQ,OAAO,UAAU,KAAK,MAAM,QAAQ,GAAG,CAACD,QAAOC,YAAWD,SAAQC,OAAM;AACzF;AAEO,IAAM,WAAW,CAAC,OAAuB,WAA2C;AACzF,SAAO,QAAQ,OAAO,QAAQ,CAACD,QAAOC,YAAWD,SAAQC,OAAM;AACjE;AAEO,IAAM,WAAW,CAAC,OAAuB,UAAkC;AAChF,SAAO,GAAG,cAAc,MAAM,SAAS,OAAO,CAAC,GAAG,MAAM,QAAQ;AAClE;AAEO,IAAM,SAAS,CAAC,OAAuB,UAAkC;AAC9E,SAAO,GAAG,cAAc,MAAM,SAAS,OAAO,CAAC,GAAG,MAAM,QAAQ;AAClE;AAIO,SAAS,OAAO,iBAA+D;AACpF,MAAI,QAAQ,eAAe,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,OAA8B,CAAC,OAAO,WAAW,IAAI,QAAQ,KAAK,GAAG,IAAI;AAClG;AAEO,IAAM,SAAS,CAAC,mBAAmD;AAExE,MAAI,OAAO,cAAc,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,CAAC,eAAe,QAAQ,eAAe,QAAQ;AAC3D;AAEO,IAAM,SAAS,CAAC,mBAA4C;AACjE,SAAO,eAAe,WAAW;AACnC;AAEO,IAAM,cAAc,CAAC,OAAuB,WAAoC;AACrF,SAAO,MAAM,OAAO,QAAQ,CAACD,QAAOC,YAAWD,SAAQC,OAAM;AAC/D;AAMO,IAAM,SAAS,CAAC,QAAwB,YAAoB,YAAkD;AACnH,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,gBAAgB,OAAO,SAAS,QAAQ;AAE9C,QAAM,iBAAiB,IAAI,KAAK,aAAa,YAAY;AAAA,IACvD,OAAO;AAAA,IACP,UAAU,OAAO;AAAA,IACjB,GAAI,YACA;AAAA,MACE,uBAAuB,gBAAgB,IAAI;AAAA,MAC3C,uBAAuB;AAAA,IACzB,IACA,CAAC;AAAA,EACP,CAAC;AAED,SAAO,eAAe,OAAO,OAAO,SAAS,GAAG;AAClD;","names":["first","second"]}
1
+ {"version":3,"sources":["../src/monetary-amount.ts"],"sourcesContent":["import { CurrencyCode, Schema as CurrencyCodeSchema } from '@bessemer/cornerstone/currency'\nimport Zod, { ZodType } from 'zod'\nimport { isNil } from '@bessemer/cornerstone/object'\nimport { roundHalfEven } from '@bessemer/cornerstone/math'\nimport { Comparator as IComparator, natural } from '@bessemer/cornerstone/comparator'\nimport { fromComparator } from '@bessemer/cornerstone/equalitor'\nimport { assert } from '@bessemer/cornerstone/assertion'\n\nexport type MonetaryAmount = {\n amount: number\n currency: CurrencyCode\n}\n\nexport const Schema: ZodType<MonetaryAmount> = Zod.object({\n amount: Zod.number().int(),\n currency: CurrencyCodeSchema,\n})\n\nexport const Comparator: IComparator<MonetaryAmount> = (first: MonetaryAmount, second: MonetaryAmount): number => {\n return apply(first, second, natural())\n}\n\nexport const Equalitor = fromComparator(Comparator)\n\nexport const of = (amount: number, currency: CurrencyCode): MonetaryAmount => {\n assert(Number.isInteger(amount))\n return { amount, currency }\n}\n\nexport const zero = (currency: CurrencyCode): MonetaryAmount => {\n return { amount: 0, currency }\n}\n\nexport const apply = <T>(first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => T): T => {\n if (first.currency !== second.currency) {\n throw new Error(`Currency mismatch in operation on MonetaryAmount: ${first.currency}, ${second.currency}`)\n }\n\n return operator(first.amount, second.amount)\n}\n\nexport const operate = (first: MonetaryAmount, second: MonetaryAmount, operator: (first: number, second: number) => number): MonetaryAmount => {\n return of(apply(first, second, operator), first.currency)\n}\n\n/** Determines whether two MonetaryAmounts are considered equivalent */\nexport const equal = (first?: MonetaryAmount | null, second?: MonetaryAmount | null): boolean => {\n if (isNil(first) && isNil(second)) {\n return true\n }\n if (isNil(first) || isNil(second)) {\n return false\n }\n\n return apply(first, second, (first, second) => first === second)\n}\n\nexport const sum = (first: MonetaryAmount, second?: MonetaryAmount | null): MonetaryAmount => {\n return operate(first, second ?? zero(first.currency), (first, second) => first + second)\n}\n\nexport const subtract = (first: MonetaryAmount, second: MonetaryAmount): MonetaryAmount => {\n return operate(first, second, (first, second) => first - second)\n}\n\nexport const multiply = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount * value, 0), money.currency)\n}\n\nexport const divide = (money: MonetaryAmount, value: number): MonetaryAmount => {\n return of(roundHalfEven(money.amount / value, 0), money.currency)\n}\n\nexport function sumAll(monetaryAmounts: readonly [MonetaryAmount, ...MonetaryAmount[]]): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency: CurrencyCode): MonetaryAmount\nexport function sumAll(monetaryAmounts: readonly MonetaryAmount[], currency?: CurrencyCode): MonetaryAmount {\n const resolvedCurrency = currency ?? monetaryAmounts[0]!.currency\n return monetaryAmounts.reduce<MonetaryAmount>((first, second) => sum(second, first), zero(resolvedCurrency))\n}\n\nexport const negate = (monetaryAmount: MonetaryAmount): MonetaryAmount => {\n // Avoid creating a negative 0, which is a real thing!\n if (isZero(monetaryAmount)) {\n return monetaryAmount\n }\n\n return of(-monetaryAmount.amount, monetaryAmount.currency)\n}\n\nexport const isZero = (monetaryAmount: MonetaryAmount): boolean => {\n return monetaryAmount.amount === 0\n}\n\nexport const greaterThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first > second)\n}\n\nexport const lessThan = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first < second)\n}\n\nexport const greaterThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first >= second)\n}\n\nexport const lessThanOrEqual = (first: MonetaryAmount, second: MonetaryAmount): boolean => {\n return apply(first, second, (first, second) => first <= second)\n}\n\nexport type MonetaryAmountFormatOptions = {\n hideCents?: boolean\n}\n\nexport const format = (amount: MonetaryAmount, alpha2Code: string, options?: MonetaryAmountFormatOptions): string => {\n const hideCents = options?.hideCents ?? false\n const isWholeNumber = amount.amount % 100 === 0\n\n const formatCurrency = new Intl.NumberFormat(alpha2Code, {\n style: 'currency',\n currency: amount.currency,\n ...(hideCents\n ? {\n minimumFractionDigits: isWholeNumber ? 0 : 2,\n maximumFractionDigits: 2,\n }\n : {}),\n })\n\n return formatCurrency.format(amount.amount / 100)\n}\n"],"mappings":"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","names":["first","second"]}
@@ -0,0 +1,10 @@
1
+ import { TaggedType } from '@bessemer/cornerstone/types';
2
+ import { ZodType } from 'zod';
3
+ import { UnknownRecord } from 'type-fest';
4
+ export type ObjectPath = TaggedType<Array<string | number>, 'ObjectPath'>;
5
+ export declare const Schema: ZodType<ObjectPath>;
6
+ export declare const of: (value: Array<string | number>) => ObjectPath;
7
+ export declare const fromString: (path: string) => ObjectPath;
8
+ export declare const getValue: (object: UnknownRecord, path: ObjectPath) => unknown;
9
+ export declare const applyValue: (object: UnknownRecord, path: ObjectPath, valueToApply: unknown) => unknown;
10
+ //# sourceMappingURL=object-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../src/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAY,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAQzC,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,YAAY,CAAC,CAAA;AACzE,eAAO,MAAM,MAAM,EAAE,OAAO,CAAC,UAAU,CAA6D,CAAA;AAEpG,eAAO,MAAM,EAAE,GAAI,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,UAElD,CAAA;AAKD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,UAezC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,KAAG,OAOlE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,aAAa,EAAE,MAAM,UAAU,EAAE,cAAc,OAAO,KAAG,OAc3F,CAAA"}
@@ -0,0 +1,78 @@
1
+ // src/object-path.ts
2
+ import Zod from "zod";
3
+ import { isObject } from "@bessemer/cornerstone/object";
4
+ import { produce } from "immer";
5
+ import { isNumber } from "@bessemer/cornerstone/math";
6
+ import { isString } from "@bessemer/cornerstone/string";
7
+ import { assert } from "@bessemer/cornerstone/assertion";
8
+ import { isEmpty } from "@bessemer/cornerstone/array";
9
+ var Schema = Zod.array(Zod.union([Zod.string(), Zod.number()]));
10
+ var of = (value) => {
11
+ return value;
12
+ };
13
+ var ObjectPathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\.[a-zA-Z_$][a-zA-Z0-9_$]*|\[\d+])*$/;
14
+ var ObjectPathPartRegex = /([^.\[\]]+)|\[(\d+)]/g;
15
+ var fromString = (path) => {
16
+ assert(ObjectPathRegex.test(path), () => `Unable to parse ObjectPath from string: ${path}`);
17
+ const result = [];
18
+ let match;
19
+ while ((match = ObjectPathPartRegex.exec(path)) !== null) {
20
+ if (match[1] !== void 0) {
21
+ result.push(match[1]);
22
+ } else if (match[2] !== void 0) {
23
+ result.push(Number(match[2]));
24
+ }
25
+ }
26
+ return of(result);
27
+ };
28
+ var getValue = (object, path) => {
29
+ let value = object;
30
+ for (const key of path) {
31
+ value = getIndexValueOrThrow(value, key, object, path);
32
+ }
33
+ return value;
34
+ };
35
+ var applyValue = (object, path, valueToApply) => {
36
+ if (isEmpty(path)) {
37
+ return valueToApply;
38
+ }
39
+ return produce(object, (draft) => {
40
+ const rest = path.slice(0, -1);
41
+ const last = path[path.length - 1];
42
+ const parent = isEmpty(rest) ? draft : getValue(draft, of(rest));
43
+ assertLegalIndex(parent, last, object, path);
44
+ parent[last] = valueToApply;
45
+ });
46
+ };
47
+ var getIndexValueOrThrow = (value, key, object, path) => {
48
+ if (isNumber(key) && Array.isArray(value)) {
49
+ if (key < 0 || key >= value.length) {
50
+ throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
51
+ }
52
+ return value[key];
53
+ } else if (isString(key) && isObject(value)) {
54
+ if (!(key in value)) {
55
+ throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
56
+ }
57
+ return value[key];
58
+ } else {
59
+ throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
60
+ }
61
+ };
62
+ var assertLegalIndex = (value, key, object, path) => {
63
+ if (isNumber(key) && Array.isArray(value)) {
64
+ return;
65
+ } else if (isString(key) && isObject(value)) {
66
+ return;
67
+ } else {
68
+ throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
69
+ }
70
+ };
71
+ export {
72
+ Schema,
73
+ applyValue,
74
+ fromString,
75
+ getValue,
76
+ of
77
+ };
78
+ //# sourceMappingURL=object-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/object-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport Zod, { ZodType } from 'zod'\nimport { UnknownRecord } from 'type-fest'\nimport { isObject } from '@bessemer/cornerstone/object'\nimport { produce } from 'immer'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { isEmpty } from '@bessemer/cornerstone/array'\n\nexport type ObjectPath = TaggedType<Array<string | number>, 'ObjectPath'>\nexport const Schema: ZodType<ObjectPath> = Zod.array(Zod.union([Zod.string(), Zod.number()])) as any\n\nexport const of = (value: Array<string | number>): ObjectPath => {\n return value as ObjectPath\n}\n\nconst ObjectPathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\\.[a-zA-Z_$][a-zA-Z0-9_$]*|\\[\\d+])*$/\nconst ObjectPathPartRegex = /([^.\\[\\]]+)|\\[(\\d+)]/g\n\nexport const fromString = (path: string): ObjectPath => {\n assert(ObjectPathRegex.test(path), () => `Unable to parse ObjectPath from string: ${path}`)\n\n const result: Array<string | number> = []\n\n let match: RegExpExecArray | null\n while ((match = ObjectPathPartRegex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n result.push(match[1])\n } else if (match[2] !== undefined) {\n result.push(Number(match[2]))\n }\n }\n\n return of(result)\n}\n\nexport const getValue = (object: UnknownRecord, path: ObjectPath): unknown => {\n let value: any = object\n for (const key of path) {\n value = getIndexValueOrThrow(value, key, object, path)\n }\n\n return value\n}\n\nexport const applyValue = (object: UnknownRecord, path: ObjectPath, valueToApply: unknown): unknown => {\n if (isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent: any = isEmpty(rest) ? draft : getValue(draft, of(rest))\n\n // Check to make sure the last index is ok\n assertLegalIndex(parent, last, object, path)\n parent[last] = valueToApply\n })\n}\n\nconst getIndexValueOrThrow = (value: any, key: string | number, object: UnknownRecord, path: ObjectPath): any => {\n if (isNumber(key) && Array.isArray(value)) {\n if (key < 0 || key >= value.length) {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n\n return value[key]\n } else if (isString(key) && isObject(value)) {\n if (!(key in value)) {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n\n return value[key]\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n\nconst assertLegalIndex = (value: any, key: string | number, object: UnknownRecord, path: ObjectPath): void => {\n if (isNumber(key) && Array.isArray(value)) {\n return\n } else if (isString(key) && isObject(value)) {\n return\n } else {\n throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`)\n }\n}\n"],"mappings":";AACA,OAAO,SAAsB;AAE7B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,eAAe;AAGjB,IAAM,SAA8B,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;AAErF,IAAM,KAAK,CAAC,UAA8C;AAC/D,SAAO;AACT;AAEA,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAErB,IAAM,aAAa,CAAC,SAA6B;AACtD,SAAO,gBAAgB,KAAK,IAAI,GAAG,MAAM,2CAA2C,IAAI,EAAE;AAE1F,QAAM,SAAiC,CAAC;AAExC,MAAI;AACJ,UAAQ,QAAQ,oBAAoB,KAAK,IAAI,OAAO,MAAM;AACxD,QAAI,MAAM,CAAC,MAAM,QAAW;AAC1B,aAAO,KAAK,MAAM,CAAC,CAAC;AAAA,IACtB,WAAW,MAAM,CAAC,MAAM,QAAW;AACjC,aAAO,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,GAAG,MAAM;AAClB;AAEO,IAAM,WAAW,CAAC,QAAuB,SAA8B;AAC5E,MAAI,QAAa;AACjB,aAAW,OAAO,MAAM;AACtB,YAAQ,qBAAqB,OAAO,KAAK,QAAQ,IAAI;AAAA,EACvD;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,CAAC,QAAuB,MAAkB,iBAAmC;AACrG,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAC7B,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,SAAc,QAAQ,IAAI,IAAI,QAAQ,SAAS,OAAO,GAAG,IAAI,CAAC;AAGpE,qBAAiB,QAAQ,MAAM,QAAQ,IAAI;AAC3C,WAAO,IAAI,IAAI;AAAA,EACjB,CAAC;AACH;AAEA,IAAM,uBAAuB,CAAC,OAAY,KAAsB,QAAuB,SAA0B;AAC/G,MAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC,QAAI,MAAM,KAAK,OAAO,MAAM,QAAQ;AAClC,YAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,IACnG;AAEA,WAAO,MAAM,GAAG;AAAA,EAClB,WAAW,SAAS,GAAG,KAAK,SAAS,KAAK,GAAG;AAC3C,QAAI,EAAE,OAAO,QAAQ;AACnB,YAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,IACnG;AAEA,WAAO,MAAM,GAAG;AAAA,EAClB,OAAO;AACL,UAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACnG;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAY,KAAsB,QAAuB,SAA2B;AAC5G,MAAI,SAAS,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC;AAAA,EACF,WAAW,SAAS,GAAG,KAAK,SAAS,KAAK,GAAG;AAC3C;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,iCAAiC,IAAI,oBAAoB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACnG;AACF;","names":[]}
package/dist/object.d.ts CHANGED
@@ -1,24 +1,12 @@
1
1
  import { mergeWith as unsafeMergeWith } from 'lodash-es';
2
- import { produce } from 'immer';
3
2
  import { BasicType, Dictionary, NominalType } from '@bessemer/cornerstone/types';
4
3
  import { Primitive, UnknownRecord } from 'type-fest';
5
- export declare const update: typeof produce;
6
- export declare const isUndefined: (value: any) => value is undefined;
7
- export declare const isNil: (value: any) => value is null | undefined;
4
+ export declare const isUndefined: (value: unknown) => value is undefined;
5
+ export declare const isNil: (value: unknown) => value is null | undefined;
8
6
  export declare const isPresent: <T>(value: T) => value is NonNullable<T>;
9
7
  export declare const isObject: (value?: any) => value is Dictionary<unknown>;
10
- export declare const isEmpty: {
11
- <T extends {
12
- __trapAny: any;
13
- }>(value?: T): boolean;
14
- (value: string): value is "";
15
- (value: Map<any, any> | Set<any> | import("lodash").List<any> | null | undefined): boolean;
16
- (value: object): boolean;
17
- <T extends object>(value: T | null | undefined): value is import("lodash").EmptyObjectOf<T> | null | undefined;
18
- (value?: any): boolean;
19
- };
20
- export declare const deepEqual: (value: any, other: any) => boolean;
21
- export declare const invert: (object: object) => import("lodash").Dictionary<string>;
8
+ export declare const isEmpty: (value: Record<string | number | symbol, unknown>) => boolean;
9
+ export declare const deepEqual: (value1: unknown, value2: unknown) => boolean;
22
10
  export declare const mapValues: {
23
11
  <TResult>(obj: string | null | undefined, callback: import("lodash").StringIterator<TResult>): import("lodash").NumericDictionary<TResult>;
24
12
  <T, TResult>(array: T[], callback: import("lodash").ArrayIterator<T, TResult>): import("lodash").NumericDictionary<TResult>;
@@ -56,16 +44,9 @@ export declare const isValidKey: (field: PropertyKey, obj: object) => field is k
56
44
  export declare function fieldsPresent<T extends object, K extends keyof T>(object: T, fields: Array<K>): object is Exclude<T, K> & Required<{
57
45
  [P in K]: NonNullable<T[P]>;
58
46
  }>;
59
- export type ObjectPath = {
60
- path: Array<string | number>;
61
- };
62
- export declare const path: (path: Array<string | number>) => ObjectPath;
63
- export declare const parsePath: (path: string) => ObjectPath;
64
- export declare const getPathValue: (object: UnknownRecord, initialPath: ObjectPath | string) => unknown | undefined;
65
- export declare const applyPathValue: (object: UnknownRecord, initialPath: ObjectPath | string, value: unknown) => UnknownRecord | undefined;
66
47
  export declare const isPrimitive: (value: any) => value is Primitive;
67
48
  export declare const isBasic: (value: any) => value is BasicType;
68
- export declare const isBoolean: (value?: any) => value is boolean;
49
+ export declare const isBoolean: (value: unknown) => value is boolean;
69
50
  export type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = NominalType<string, [Type, Class]>;
70
51
  type RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never;
71
52
  export declare const getAttribute: <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T) => RecordAttributeType<T> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}