@sectile/core 0.7.0 → 0.8.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.
Files changed (262) hide show
  1. package/dist/accordion.d.ts +0 -1
  2. package/dist/adapter-runtime.d.ts +53 -2
  3. package/dist/adapter-runtime.js +224 -25
  4. package/dist/adapter-runtime.js.map +1 -1
  5. package/dist/alert-dialog.d.ts +0 -1
  6. package/dist/carousel.d.ts +0 -1
  7. package/dist/cascade-list.d.ts +16 -0
  8. package/dist/cascade-list.js +33 -0
  9. package/dist/cascade-list.js.map +1 -0
  10. package/dist/cascade-select.d.ts +0 -1
  11. package/dist/cascade-select.js +47 -119
  12. package/dist/cascade-select.js.map +1 -1
  13. package/dist/checkbox-group.d.ts +0 -1
  14. package/dist/checkbox.d.ts +0 -1
  15. package/dist/collection-window.d.ts +0 -1
  16. package/dist/color-picker.d.ts +3 -8
  17. package/dist/color-picker.js +60 -305
  18. package/dist/color-picker.js.map +1 -1
  19. package/dist/combobox.d.ts +0 -1
  20. package/dist/dialog.d.ts +0 -1
  21. package/dist/disclosure.d.ts +0 -1
  22. package/dist/drawer.d.ts +0 -1
  23. package/dist/editable.d.ts +0 -1
  24. package/dist/editing/color-text.d.ts +7 -0
  25. package/dist/editing/color-text.js +199 -0
  26. package/dist/editing/color-text.js.map +1 -0
  27. package/dist/error-code.d.ts +1 -2
  28. package/dist/feed.d.ts +0 -1
  29. package/dist/grid-control.d.ts +3 -0
  30. package/dist/grid-control.js +2 -0
  31. package/dist/grid-control.js.map +1 -0
  32. package/dist/identity.d.ts +10 -0
  33. package/dist/identity.js +16 -0
  34. package/dist/identity.js.map +1 -0
  35. package/dist/index.d.ts +2 -2
  36. package/dist/interaction.d.ts +0 -1
  37. package/dist/internal/composites/cascade-choice.d.ts +54 -0
  38. package/dist/internal/composites/cascade-choice.js +154 -0
  39. package/dist/internal/composites/cascade-choice.js.map +1 -0
  40. package/dist/internal/composites/combobox.d.ts +0 -1
  41. package/dist/internal/composites/combobox.js +28 -11
  42. package/dist/internal/composites/combobox.js.map +1 -1
  43. package/dist/internal/composites/grid-control.d.ts +0 -1
  44. package/dist/internal/composites/grid-control.js +18 -23
  45. package/dist/internal/composites/grid-control.js.map +1 -1
  46. package/dist/internal/composites/linear-action.d.ts +0 -1
  47. package/dist/internal/composites/linear-action.js +20 -14
  48. package/dist/internal/composites/linear-action.js.map +1 -1
  49. package/dist/internal/composites/linear-choice.d.ts +0 -1
  50. package/dist/internal/composites/linear-choice.js +15 -8
  51. package/dist/internal/composites/linear-choice.js.map +1 -1
  52. package/dist/internal/composites/listbox.d.ts +0 -1
  53. package/dist/internal/composites/listbox.js +15 -13
  54. package/dist/internal/composites/listbox.js.map +1 -1
  55. package/dist/internal/composites/menu.d.ts +0 -1
  56. package/dist/internal/composites/menu.js +38 -17
  57. package/dist/internal/composites/menu.js.map +1 -1
  58. package/dist/internal/composites/popup.d.ts +0 -1
  59. package/dist/internal/composites/slider.d.ts +0 -1
  60. package/dist/internal/composites/tree-grid.d.ts +0 -1
  61. package/dist/internal/composites/tree-grid.js +70 -48
  62. package/dist/internal/composites/tree-grid.js.map +1 -1
  63. package/dist/internal/composites/tree-view.d.ts +0 -1
  64. package/dist/internal/composites/tree-view.js +32 -20
  65. package/dist/internal/composites/tree-view.js.map +1 -1
  66. package/dist/internal/editing/text.d.ts +0 -1
  67. package/dist/internal/editing/text.js +40 -27
  68. package/dist/internal/editing/text.js.map +1 -1
  69. package/dist/internal/kernel/bounded-scalar.d.ts +31 -0
  70. package/dist/internal/kernel/bounded-scalar.js +78 -0
  71. package/dist/internal/kernel/bounded-scalar.js.map +1 -0
  72. package/dist/internal/kernel/decimal.d.ts +0 -1
  73. package/dist/internal/kernel/exact-ratio.d.ts +5 -0
  74. package/dist/internal/kernel/exact-ratio.js +2 -0
  75. package/dist/internal/kernel/exact-ratio.js.map +1 -0
  76. package/dist/internal/kernel/foundation.d.ts +8 -6
  77. package/dist/internal/kernel/foundation.js +35 -16
  78. package/dist/internal/kernel/foundation.js.map +1 -1
  79. package/dist/internal/kernel/indexed-sequence.d.ts +28 -3
  80. package/dist/internal/kernel/indexed-sequence.js +162 -12
  81. package/dist/internal/kernel/indexed-sequence.js.map +1 -1
  82. package/dist/internal/kernel/machine.d.ts +1 -2
  83. package/dist/internal/kernel/machine.js +5 -2
  84. package/dist/internal/kernel/machine.js.map +1 -1
  85. package/dist/internal/runtime/revision.d.ts +0 -1
  86. package/dist/internal/state/checked.d.ts +0 -1
  87. package/dist/internal/state/cursor.d.ts +0 -1
  88. package/dist/internal/state/expansion.d.ts +0 -1
  89. package/dist/internal/state/open-state.d.ts +0 -1
  90. package/dist/internal/state/selection.d.ts +0 -1
  91. package/dist/internal/state/selection.js +99 -27
  92. package/dist/internal/state/selection.js.map +1 -1
  93. package/dist/layer-stack.d.ts +0 -1
  94. package/dist/listbox.d.ts +0 -1
  95. package/dist/menu-button.d.ts +0 -1
  96. package/dist/menu.d.ts +0 -1
  97. package/dist/menubar.d.ts +0 -1
  98. package/dist/meter-group.d.ts +38 -0
  99. package/dist/meter-group.js +103 -0
  100. package/dist/meter-group.js.map +1 -0
  101. package/dist/meter.d.ts +25 -0
  102. package/dist/meter.js +89 -0
  103. package/dist/meter.js.map +1 -0
  104. package/dist/multi-thumb-slider.d.ts +0 -1
  105. package/dist/navigation-menu.d.ts +0 -1
  106. package/dist/number-field.d.ts +0 -1
  107. package/dist/pagination.d.ts +0 -1
  108. package/dist/pin-input.d.ts +0 -1
  109. package/dist/popover.d.ts +0 -1
  110. package/dist/progress.d.ts +17 -0
  111. package/dist/progress.js +49 -0
  112. package/dist/progress.js.map +1 -0
  113. package/dist/quantity-field.d.ts +0 -1
  114. package/dist/radio-group.d.ts +0 -1
  115. package/dist/rating.d.ts +0 -1
  116. package/dist/reorder.d.ts +0 -1
  117. package/dist/reorder.js +92 -43
  118. package/dist/reorder.js.map +1 -1
  119. package/dist/result.d.ts +2 -1
  120. package/dist/result.js +14 -0
  121. package/dist/result.js.map +1 -1
  122. package/dist/revision.d.ts +1 -1
  123. package/dist/revision.js +1 -0
  124. package/dist/revision.js.map +1 -1
  125. package/dist/select.d.ts +0 -1
  126. package/dist/selection.d.ts +24 -0
  127. package/dist/selection.js +20 -0
  128. package/dist/selection.js.map +1 -0
  129. package/dist/shared.d.ts +0 -1
  130. package/dist/slider.d.ts +0 -1
  131. package/dist/spin-button.d.ts +0 -1
  132. package/dist/stepper.d.ts +0 -1
  133. package/dist/structures/anchored-layout.d.ts +33 -0
  134. package/dist/structures/anchored-layout.js +158 -0
  135. package/dist/structures/anchored-layout.js.map +1 -0
  136. package/dist/structures/color.d.ts +80 -0
  137. package/dist/structures/color.js +206 -0
  138. package/dist/structures/color.js.map +1 -0
  139. package/dist/structures/geometry.d.ts +53 -0
  140. package/dist/structures/geometry.js +165 -0
  141. package/dist/structures/geometry.js.map +1 -0
  142. package/dist/structures/grid.d.ts +20 -4
  143. package/dist/structures/grid.js +91 -50
  144. package/dist/structures/grid.js.map +1 -1
  145. package/dist/structures/index-span.d.ts +31 -0
  146. package/dist/structures/index-span.js +267 -0
  147. package/dist/structures/index-span.js.map +1 -0
  148. package/dist/structures/metric-index.d.ts +36 -0
  149. package/dist/structures/metric-index.js +390 -0
  150. package/dist/structures/metric-index.js.map +1 -0
  151. package/dist/structures/range.d.ts +21 -4
  152. package/dist/structures/range.js +156 -11
  153. package/dist/structures/range.js.map +1 -1
  154. package/dist/structures/selection-expression.d.ts +26 -0
  155. package/dist/structures/selection-expression.js +157 -0
  156. package/dist/structures/selection-expression.js.map +1 -0
  157. package/dist/structures/sequence.d.ts +0 -1
  158. package/dist/structures/sequence.js +69 -7
  159. package/dist/structures/sequence.js.map +1 -1
  160. package/dist/structures/tree.d.ts +5 -1
  161. package/dist/structures/tree.js +33 -5
  162. package/dist/structures/tree.js.map +1 -1
  163. package/dist/switch.d.ts +0 -1
  164. package/dist/tabs.d.ts +0 -1
  165. package/dist/tags-input.d.ts +0 -1
  166. package/dist/text.d.ts +0 -1
  167. package/dist/timer.d.ts +0 -1
  168. package/dist/toast.d.ts +2 -2
  169. package/dist/toast.js +3 -1
  170. package/dist/toast.js.map +1 -1
  171. package/dist/toggle-button.d.ts +0 -1
  172. package/dist/toggle-group.d.ts +0 -1
  173. package/dist/toolbar.d.ts +0 -1
  174. package/dist/tooltip.d.ts +0 -1
  175. package/dist/tree-grid.d.ts +0 -1
  176. package/dist/tree-view.d.ts +0 -1
  177. package/dist/units.d.ts +0 -1
  178. package/dist/window-splitter.d.ts +0 -1
  179. package/package.json +75 -12
  180. package/dist/accordion.d.ts.map +0 -1
  181. package/dist/adapter-runtime.d.ts.map +0 -1
  182. package/dist/alert-dialog.d.ts.map +0 -1
  183. package/dist/carousel.d.ts.map +0 -1
  184. package/dist/cascade-select.d.ts.map +0 -1
  185. package/dist/checkbox-group.d.ts.map +0 -1
  186. package/dist/checkbox.d.ts.map +0 -1
  187. package/dist/collection-window.d.ts.map +0 -1
  188. package/dist/color-picker.d.ts.map +0 -1
  189. package/dist/combobox.d.ts.map +0 -1
  190. package/dist/dialog.d.ts.map +0 -1
  191. package/dist/disclosure.d.ts.map +0 -1
  192. package/dist/drawer.d.ts.map +0 -1
  193. package/dist/editable.d.ts.map +0 -1
  194. package/dist/error-code.d.ts.map +0 -1
  195. package/dist/feed.d.ts.map +0 -1
  196. package/dist/form.d.ts +0 -135
  197. package/dist/form.d.ts.map +0 -1
  198. package/dist/form.js +0 -627
  199. package/dist/form.js.map +0 -1
  200. package/dist/index.d.ts.map +0 -1
  201. package/dist/interaction.d.ts.map +0 -1
  202. package/dist/internal/composites/combobox.d.ts.map +0 -1
  203. package/dist/internal/composites/grid-control.d.ts.map +0 -1
  204. package/dist/internal/composites/linear-action.d.ts.map +0 -1
  205. package/dist/internal/composites/linear-choice.d.ts.map +0 -1
  206. package/dist/internal/composites/listbox.d.ts.map +0 -1
  207. package/dist/internal/composites/menu.d.ts.map +0 -1
  208. package/dist/internal/composites/popup.d.ts.map +0 -1
  209. package/dist/internal/composites/slider.d.ts.map +0 -1
  210. package/dist/internal/composites/tree-grid.d.ts.map +0 -1
  211. package/dist/internal/composites/tree-view.d.ts.map +0 -1
  212. package/dist/internal/editing/text.d.ts.map +0 -1
  213. package/dist/internal/kernel/decimal.d.ts.map +0 -1
  214. package/dist/internal/kernel/foundation.d.ts.map +0 -1
  215. package/dist/internal/kernel/indexed-sequence.d.ts.map +0 -1
  216. package/dist/internal/kernel/machine.d.ts.map +0 -1
  217. package/dist/internal/runtime/revision.d.ts.map +0 -1
  218. package/dist/internal/state/checked.d.ts.map +0 -1
  219. package/dist/internal/state/cursor.d.ts.map +0 -1
  220. package/dist/internal/state/expansion.d.ts.map +0 -1
  221. package/dist/internal/state/open-state.d.ts.map +0 -1
  222. package/dist/internal/state/selection.d.ts.map +0 -1
  223. package/dist/layer-stack.d.ts.map +0 -1
  224. package/dist/listbox.d.ts.map +0 -1
  225. package/dist/menu-button.d.ts.map +0 -1
  226. package/dist/menu.d.ts.map +0 -1
  227. package/dist/menubar.d.ts.map +0 -1
  228. package/dist/multi-thumb-slider.d.ts.map +0 -1
  229. package/dist/navigation-menu.d.ts.map +0 -1
  230. package/dist/number-field.d.ts.map +0 -1
  231. package/dist/pagination.d.ts.map +0 -1
  232. package/dist/pin-input.d.ts.map +0 -1
  233. package/dist/popover.d.ts.map +0 -1
  234. package/dist/quantity-field.d.ts.map +0 -1
  235. package/dist/radio-group.d.ts.map +0 -1
  236. package/dist/rating.d.ts.map +0 -1
  237. package/dist/reorder.d.ts.map +0 -1
  238. package/dist/result.d.ts.map +0 -1
  239. package/dist/revision.d.ts.map +0 -1
  240. package/dist/select.d.ts.map +0 -1
  241. package/dist/shared.d.ts.map +0 -1
  242. package/dist/slider.d.ts.map +0 -1
  243. package/dist/spin-button.d.ts.map +0 -1
  244. package/dist/stepper.d.ts.map +0 -1
  245. package/dist/structures/grid.d.ts.map +0 -1
  246. package/dist/structures/range.d.ts.map +0 -1
  247. package/dist/structures/sequence.d.ts.map +0 -1
  248. package/dist/structures/tree.d.ts.map +0 -1
  249. package/dist/switch.d.ts.map +0 -1
  250. package/dist/tabs.d.ts.map +0 -1
  251. package/dist/tags-input.d.ts.map +0 -1
  252. package/dist/text.d.ts.map +0 -1
  253. package/dist/timer.d.ts.map +0 -1
  254. package/dist/toast.d.ts.map +0 -1
  255. package/dist/toggle-button.d.ts.map +0 -1
  256. package/dist/toggle-group.d.ts.map +0 -1
  257. package/dist/toolbar.d.ts.map +0 -1
  258. package/dist/tooltip.d.ts.map +0 -1
  259. package/dist/tree-grid.d.ts.map +0 -1
  260. package/dist/tree-view.d.ts.map +0 -1
  261. package/dist/units.d.ts.map +0 -1
  262. package/dist/window-splitter.d.ts.map +0 -1
@@ -0,0 +1,390 @@
1
+ import { unwrap } from '../result.js';
2
+ import { DEFAULT_MAX_ID_CODE_UNITS, } from '../shared.js';
3
+ import { fail, ok, validateSafeCeiling, validateStableID } from '../internal/kernel/foundation.js';
4
+ export const DEFAULT_MAX_METRIC_ITEMS = 100_000;
5
+ export const MAX_METRIC_ITEMS = 1_000_000;
6
+ export const DEFAULT_MAX_METRIC_DIMENSIONS = 32;
7
+ export const MAX_METRIC_DIMENSIONS = 32;
8
+ export const DEFAULT_MAX_METRIC_COORDINATE_MAGNITUDE = 1e150;
9
+ const KD_MIN_ITEMS = 129;
10
+ const KD_MAX_DIMENSIONS = 8;
11
+ const KD_QUERY_CROSSOVER = 128;
12
+ export function createMetricIndex(points, options = {}) {
13
+ return unwrap(tryCreateMetricIndex(points, options));
14
+ }
15
+ export function tryCreateMetricIndex(points, options = {}) {
16
+ if (!Array.isArray(points))
17
+ return fail('construction', 'invalid-boundary', 'Metric points must be an array.');
18
+ const limits = tryMetricLimits(points, options);
19
+ if (!limits.ok)
20
+ return limits;
21
+ if (points.length > limits.value.maxItems) {
22
+ return fail('resource-rejection', 'item-ceiling-exceeded', 'Metric point count exceeds maxItems.', {
23
+ size: points.length,
24
+ maxItems: limits.value.maxItems,
25
+ });
26
+ }
27
+ const ids = [];
28
+ const indexByID = new Map();
29
+ const coordinates = new Float64Array(points.length * limits.value.dimensions);
30
+ for (let pointIndex = 0; pointIndex < points.length; pointIndex += 1) {
31
+ const point = points[pointIndex];
32
+ if (point === undefined || point === null || typeof point !== 'object') {
33
+ return fail('construction', 'invalid-boundary', 'Every metric point must be an object.', { pointIndex });
34
+ }
35
+ const idError = validateStableID(point.id, limits.value.maxIDCodeUnits);
36
+ if (idError !== null)
37
+ return { ok: false, error: idError };
38
+ if (indexByID.has(point.id)) {
39
+ return fail('construction', 'duplicate-id', 'Metric point identities must be unique.', { id: point.id, pointIndex });
40
+ }
41
+ if (!Array.isArray(point.coordinates) || point.coordinates.length !== limits.value.dimensions) {
42
+ return fail('construction', 'invalid-boundary', 'Every metric coordinate must match the fixed dimension.', {
43
+ id: point.id,
44
+ expected: limits.value.dimensions,
45
+ actual: Array.isArray(point.coordinates) ? point.coordinates.length : null,
46
+ });
47
+ }
48
+ indexByID.set(point.id, pointIndex);
49
+ ids.push(point.id);
50
+ for (let dimension = 0; dimension < limits.value.dimensions; dimension += 1) {
51
+ const coordinate = point.coordinates[dimension];
52
+ if (!validCoordinate(coordinate, limits.value.maxCoordinateMagnitude)) {
53
+ return fail('construction', 'invalid-boundary', 'Metric coordinates must be finite and within maxCoordinateMagnitude.', {
54
+ id: point.id,
55
+ dimension,
56
+ coordinate,
57
+ maxCoordinateMagnitude: limits.value.maxCoordinateMagnitude,
58
+ });
59
+ }
60
+ coordinates[pointIndex * limits.value.dimensions + dimension] = coordinate;
61
+ }
62
+ }
63
+ const kd = points.length >= KD_MIN_ITEMS
64
+ && limits.value.dimensions <= KD_MAX_DIMENSIONS
65
+ && limits.value.expectedQueries >= KD_QUERY_CROSSOVER
66
+ ? buildKDIndex(coordinates, points.length, limits.value.dimensions)
67
+ : null;
68
+ return ok(Object.freeze(new PackedMetricIndex(Object.freeze(ids), indexByID, coordinates, limits.value, kd)));
69
+ }
70
+ class PackedMetricIndex {
71
+ #indexByID;
72
+ #coordinates;
73
+ #kd;
74
+ constructor(ids, indexByID, coordinates, limits, kd) {
75
+ this.ids = ids;
76
+ this.#indexByID = indexByID;
77
+ this.#coordinates = coordinates;
78
+ this.size = ids.length;
79
+ this.dimensions = limits.dimensions;
80
+ this.maxItems = limits.maxItems;
81
+ this.maxDimensions = limits.maxDimensions;
82
+ this.maxCoordinateMagnitude = limits.maxCoordinateMagnitude;
83
+ this.#kd = kd;
84
+ }
85
+ ids;
86
+ size;
87
+ dimensions;
88
+ maxItems;
89
+ maxDimensions;
90
+ maxCoordinateMagnitude;
91
+ coordinateOf(id) {
92
+ const index = this.#indexByID.get(id);
93
+ if (index === undefined)
94
+ return null;
95
+ const output = new Array(this.dimensions);
96
+ const offset = index * this.dimensions;
97
+ for (let dimension = 0; dimension < this.dimensions; dimension += 1)
98
+ output[dimension] = this.#coordinates[offset + dimension];
99
+ return Object.freeze(output);
100
+ }
101
+ squaredDistance(left, right) {
102
+ const leftIndex = this.#indexByID.get(left);
103
+ const rightIndex = this.#indexByID.get(right);
104
+ return leftIndex === undefined || rightIndex === undefined ? null : this.#distance(leftIndex, rightIndex);
105
+ }
106
+ nearest(target) {
107
+ const query = this.#validateVector(target, 'target');
108
+ if (this.size === 0)
109
+ return null;
110
+ const kd = this.#queryIndex();
111
+ const match = kd === null ? this.#packedNearest(query) : this.#kdNearest(kd, query, null);
112
+ return match === null ? null : this.#publicMatch(match);
113
+ }
114
+ withinRadius(target, radius) {
115
+ const query = this.#validateVector(target, 'target');
116
+ if (typeof radius !== 'number' || !Number.isFinite(radius) || radius < 0 || !Number.isFinite(radius * radius)) {
117
+ return unwrap(fail('construction', 'invalid-boundary', 'radius must be a non-negative finite number with a finite square.', { radius }));
118
+ }
119
+ if (this.size === 0)
120
+ return Object.freeze([]);
121
+ const squaredRadius = radius * radius;
122
+ const kd = this.#queryIndex();
123
+ const matches = kd === null ? this.#packedRadius(query, squaredRadius) : this.#kdRadius(kd, query, squaredRadius);
124
+ return Object.freeze(matches.map((match) => this.#publicMatch(match)));
125
+ }
126
+ forwardNearest(origin, direction) {
127
+ const query = this.#validateVector(origin, 'origin');
128
+ const normalizedDirection = this.#normalizeDirection(direction);
129
+ if (this.size === 0)
130
+ return null;
131
+ const kd = this.#queryIndex();
132
+ const match = kd === null
133
+ ? this.#packedNearest(query, normalizedDirection)
134
+ : this.#kdNearest(kd, query, normalizedDirection);
135
+ return match === null ? null : this.#publicMatch(match);
136
+ }
137
+ #queryIndex() {
138
+ return this.#kd;
139
+ }
140
+ #packedNearest(target, direction = null) {
141
+ let bestIndex = -1;
142
+ let bestSquaredDistance = Number.POSITIVE_INFINITY;
143
+ for (let index = 0; index < this.size; index += 1) {
144
+ if (direction !== null && this.#dotFrom(index, target, direction) <= 0)
145
+ continue;
146
+ const squaredDistance = this.#distanceTo(index, target);
147
+ if (squaredDistance < bestSquaredDistance) {
148
+ bestIndex = index;
149
+ bestSquaredDistance = squaredDistance;
150
+ }
151
+ }
152
+ return bestIndex < 0 ? null : { index: bestIndex, squaredDistance: bestSquaredDistance };
153
+ }
154
+ #packedRadius(target, squaredRadius) {
155
+ const matches = [];
156
+ for (let index = 0; index < this.size; index += 1) {
157
+ const squaredDistance = this.#distanceTo(index, target);
158
+ if (squaredDistance <= squaredRadius)
159
+ matches.push({ index, squaredDistance });
160
+ }
161
+ return matches;
162
+ }
163
+ #kdNearest(kd, target, direction) {
164
+ let bestIndex = -1;
165
+ let bestSquaredDistance = Number.POSITIVE_INFINITY;
166
+ let candidates = 0;
167
+ let aborted = false;
168
+ const visit = (node) => {
169
+ if (node < 0 || aborted)
170
+ return;
171
+ candidates += 1;
172
+ if (candidates > (this.size >>> 1)) {
173
+ aborted = true;
174
+ return;
175
+ }
176
+ const pointIndex = kd.point[node];
177
+ const axis = kd.axis[node];
178
+ const offset = pointIndex * this.dimensions;
179
+ const delta = target[axis] - this.#coordinates[offset + axis];
180
+ const near = delta <= 0 ? kd.left[node] : kd.right[node];
181
+ const far = delta <= 0 ? kd.right[node] : kd.left[node];
182
+ visit(near);
183
+ if (direction === null || this.#dotFrom(pointIndex, target, direction) > 0) {
184
+ const squaredDistance = this.#distanceTo(pointIndex, target);
185
+ if (squaredDistance < bestSquaredDistance
186
+ || (squaredDistance === bestSquaredDistance && pointIndex < bestIndex)) {
187
+ bestIndex = pointIndex;
188
+ bestSquaredDistance = squaredDistance;
189
+ }
190
+ }
191
+ if (bestIndex < 0 || delta * delta <= bestSquaredDistance)
192
+ visit(far);
193
+ };
194
+ visit(kd.root);
195
+ return aborted
196
+ ? this.#packedNearest(target, direction)
197
+ : bestIndex < 0 ? null : { index: bestIndex, squaredDistance: bestSquaredDistance };
198
+ }
199
+ #kdRadius(kd, target, squaredRadius) {
200
+ const matches = [];
201
+ let candidates = 0;
202
+ let aborted = false;
203
+ const visit = (node) => {
204
+ if (node < 0 || aborted)
205
+ return;
206
+ candidates += 1;
207
+ if (candidates > (this.size >>> 1)) {
208
+ aborted = true;
209
+ return;
210
+ }
211
+ const pointIndex = kd.point[node];
212
+ const axis = kd.axis[node];
213
+ const offset = pointIndex * this.dimensions;
214
+ const delta = target[axis] - this.#coordinates[offset + axis];
215
+ const squaredDistance = this.#distanceTo(pointIndex, target);
216
+ if (squaredDistance <= squaredRadius)
217
+ matches.push({ index: pointIndex, squaredDistance });
218
+ visit(delta <= 0 ? kd.left[node] : kd.right[node]);
219
+ if (delta * delta <= squaredRadius)
220
+ visit(delta <= 0 ? kd.right[node] : kd.left[node]);
221
+ };
222
+ visit(kd.root);
223
+ return aborted ? this.#packedRadius(target, squaredRadius) : radixDomainOrder(matches);
224
+ }
225
+ #distance(leftIndex, rightIndex) {
226
+ let total = 0;
227
+ const leftOffset = leftIndex * this.dimensions;
228
+ const rightOffset = rightIndex * this.dimensions;
229
+ for (let dimension = 0; dimension < this.dimensions; dimension += 1) {
230
+ const delta = this.#coordinates[leftOffset + dimension] - this.#coordinates[rightOffset + dimension];
231
+ total += delta * delta;
232
+ }
233
+ return total;
234
+ }
235
+ #distanceTo(index, target) {
236
+ let total = 0;
237
+ const offset = index * this.dimensions;
238
+ for (let dimension = 0; dimension < this.dimensions; dimension += 1) {
239
+ const delta = this.#coordinates[offset + dimension] - target[dimension];
240
+ total += delta * delta;
241
+ }
242
+ return total;
243
+ }
244
+ #dotFrom(index, origin, direction) {
245
+ let total = 0;
246
+ const offset = index * this.dimensions;
247
+ for (let dimension = 0; dimension < this.dimensions; dimension += 1) {
248
+ total += (this.#coordinates[offset + dimension] - origin[dimension]) * direction[dimension];
249
+ }
250
+ return total;
251
+ }
252
+ #validateVector(vector, label) {
253
+ if (!Array.isArray(vector) || vector.length !== this.dimensions) {
254
+ return unwrap(fail('construction', 'invalid-boundary', `${label} must match the fixed metric dimension.`, {
255
+ expected: this.dimensions,
256
+ actual: Array.isArray(vector) ? vector.length : null,
257
+ }));
258
+ }
259
+ for (let dimension = 0; dimension < this.dimensions; dimension += 1) {
260
+ if (!validCoordinate(vector[dimension], this.maxCoordinateMagnitude)) {
261
+ return unwrap(fail('construction', 'invalid-boundary', `${label} coordinates must be finite and bounded.`, { dimension }));
262
+ }
263
+ }
264
+ return vector;
265
+ }
266
+ #normalizeDirection(direction) {
267
+ const checked = this.#validateVector(direction, 'direction');
268
+ let scale = 0;
269
+ for (const value of checked)
270
+ scale = Math.max(scale, Math.abs(value));
271
+ if (scale === 0)
272
+ return unwrap(fail('construction', 'invalid-boundary', 'direction must be non-zero.'));
273
+ return checked.map((value) => value / scale);
274
+ }
275
+ #publicMatch(match) {
276
+ return Object.freeze({ id: this.ids[match.index], squaredDistance: match.squaredDistance });
277
+ }
278
+ }
279
+ function tryMetricLimits(points, options) {
280
+ const maxItems = options.maxItems ?? DEFAULT_MAX_METRIC_ITEMS;
281
+ const itemError = validateSafeCeiling(maxItems, 'maxItems');
282
+ if (itemError !== null)
283
+ return { ok: false, error: itemError };
284
+ if (maxItems > MAX_METRIC_ITEMS)
285
+ return fail('resource-rejection', 'item-ceiling-exceeded', 'maxItems exceeds the MetricIndex hard ceiling.', { maxItems, hardCeiling: MAX_METRIC_ITEMS });
286
+ const maxDimensions = options.maxDimensions ?? DEFAULT_MAX_METRIC_DIMENSIONS;
287
+ if (!Number.isSafeInteger(maxDimensions) || maxDimensions < 1 || maxDimensions > MAX_METRIC_DIMENSIONS) {
288
+ return fail('construction', 'invalid-boundary', 'maxDimensions must be a positive safe integer within the hard ceiling.', { maxDimensions, hardCeiling: MAX_METRIC_DIMENSIONS });
289
+ }
290
+ const inferredDimensions = points[0]?.coordinates?.length;
291
+ const dimensionValue = options.dimensions ?? inferredDimensions;
292
+ if (!Number.isSafeInteger(dimensionValue) || (dimensionValue ?? 0) < 1 || (dimensionValue ?? 0) > maxDimensions) {
293
+ return fail('construction', 'invalid-boundary', 'dimensions must be a positive safe integer within maxDimensions.', { dimensions: dimensionValue, maxDimensions });
294
+ }
295
+ const dimensions = dimensionValue;
296
+ const maxCoordinateMagnitude = options.maxCoordinateMagnitude ?? DEFAULT_MAX_METRIC_COORDINATE_MAGNITUDE;
297
+ if (typeof maxCoordinateMagnitude !== 'number' || !Number.isFinite(maxCoordinateMagnitude)
298
+ || maxCoordinateMagnitude <= 0 || maxCoordinateMagnitude > DEFAULT_MAX_METRIC_COORDINATE_MAGNITUDE) {
299
+ return fail('construction', 'invalid-boundary', 'maxCoordinateMagnitude must be finite, positive, and within the hard ceiling.', { maxCoordinateMagnitude });
300
+ }
301
+ const maxIDCodeUnits = options.maxIDCodeUnits ?? DEFAULT_MAX_ID_CODE_UNITS;
302
+ const idError = validateSafeCeiling(maxIDCodeUnits, 'maxIDCodeUnits', 1);
303
+ if (idError !== null)
304
+ return { ok: false, error: idError };
305
+ const expectedQueries = options.expectedQueries ?? 0;
306
+ if (!Number.isSafeInteger(expectedQueries) || expectedQueries < 0) {
307
+ return fail('construction', 'invalid-boundary', 'expectedQueries must be a non-negative safe integer.', { expectedQueries });
308
+ }
309
+ return ok(Object.freeze({ dimensions, maxItems, maxDimensions, maxCoordinateMagnitude, maxIDCodeUnits, expectedQueries }));
310
+ }
311
+ function buildKDIndex(coordinates, size, dimensions) {
312
+ const orders = Array.from({ length: dimensions }, (_, axis) => Array.from({ length: size }, (_unused, index) => index).sort((left, right) => {
313
+ const compared = coordinates[left * dimensions + axis] - coordinates[right * dimensions + axis];
314
+ return compared || left - right;
315
+ }));
316
+ const point = new Int32Array(size);
317
+ const left = new Int32Array(size);
318
+ const right = new Int32Array(size);
319
+ const axisByNode = new Uint8Array(size);
320
+ left.fill(-1);
321
+ right.fill(-1);
322
+ let nodeCount = 0;
323
+ const build = (active, depth) => {
324
+ const length = active[0]?.length ?? 0;
325
+ if (length === 0)
326
+ return -1;
327
+ const axis = depth % dimensions;
328
+ const axisOrder = active[axis];
329
+ const middle = length >>> 1;
330
+ const pointIndex = axisOrder[middle];
331
+ const leftMembers = new Set(axisOrder.slice(0, middle));
332
+ const leftOrders = [];
333
+ const rightOrders = [];
334
+ for (let orderedAxis = 0; orderedAxis < dimensions; orderedAxis += 1) {
335
+ const leftOrder = [];
336
+ const rightOrder = [];
337
+ for (const candidate of active[orderedAxis]) {
338
+ if (candidate === pointIndex)
339
+ continue;
340
+ if (leftMembers.has(candidate))
341
+ leftOrder.push(candidate);
342
+ else
343
+ rightOrder.push(candidate);
344
+ }
345
+ leftOrders.push(leftOrder);
346
+ rightOrders.push(rightOrder);
347
+ }
348
+ const node = nodeCount;
349
+ nodeCount += 1;
350
+ point[node] = pointIndex;
351
+ axisByNode[node] = axis;
352
+ left[node] = build(leftOrders, depth + 1);
353
+ right[node] = build(rightOrders, depth + 1);
354
+ return node;
355
+ };
356
+ return Object.freeze({ root: build(orders, 0), point, left, right, axis: axisByNode });
357
+ }
358
+ function radixDomainOrder(matches) {
359
+ if (matches.length < 2)
360
+ return matches;
361
+ let input = matches;
362
+ let output = new Array(matches.length);
363
+ const counts = new Uint32Array(256);
364
+ for (let shift = 0; shift < 24; shift += 8) {
365
+ counts.fill(0);
366
+ for (const match of input) {
367
+ const bucket = (match.index >>> shift) & 255;
368
+ counts[bucket] = counts[bucket] + 1;
369
+ }
370
+ let offset = 0;
371
+ for (let bucket = 0; bucket < counts.length; bucket += 1) {
372
+ const count = counts[bucket];
373
+ counts[bucket] = offset;
374
+ offset += count;
375
+ }
376
+ for (const match of input) {
377
+ const bucket = (match.index >>> shift) & 255;
378
+ output[counts[bucket]] = match;
379
+ counts[bucket] = counts[bucket] + 1;
380
+ }
381
+ const swap = input;
382
+ input = output;
383
+ output = swap;
384
+ }
385
+ return input;
386
+ }
387
+ function validCoordinate(value, maxMagnitude) {
388
+ return typeof value === 'number' && Number.isFinite(value) && Math.abs(value) <= maxMagnitude;
389
+ }
390
+ //# sourceMappingURL=metric-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metric-index.js","sourceRoot":"","sources":["../../src/structures/metric-index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Result, type TiePolicy } from '../shared.js';
2
+ import type { ExactRatio } from '../internal/kernel/exact-ratio.js';
2
3
  export interface RangeOptions {
3
4
  readonly maxCount?: number;
4
5
  readonly maxDecimalCodeUnits?: number;
@@ -15,10 +16,27 @@ export interface BoundedRangeInput extends RangeOptions {
15
16
  readonly max: string;
16
17
  readonly step: string;
17
18
  }
18
- export interface ExactRatio {
19
- readonly numerator: bigint;
20
- readonly denominator: bigint;
19
+ export type { ExactRatio } from '../internal/kernel/exact-ratio.js';
20
+ export interface ExactRatioOptions {
21
+ /** Maximum absolute numerator width accepted and retained. */
22
+ readonly maxNumeratorBits?: number;
23
+ /** Maximum denominator width accepted and retained. */
24
+ readonly maxDenominatorBits?: number;
21
25
  }
26
+ export declare const DEFAULT_MAX_RATIO_NUMERATOR_BITS = 4096;
27
+ export declare const DEFAULT_MAX_RATIO_DENOMINATOR_BITS = 4096;
28
+ export declare function formatExactRatioPercentage(ratio: ExactRatio): string;
29
+ export declare function createExactRatio(numerator: bigint, denominator: bigint, options?: ExactRatioOptions): ExactRatio;
30
+ export declare function tryCreateExactRatio(numerator: bigint, denominator: bigint, options?: ExactRatioOptions): Result<ExactRatio>;
31
+ export declare function compareExactRatios(left: ExactRatio, right: ExactRatio, options?: ExactRatioOptions): -1 | 0 | 1;
32
+ export declare function clampExactRatio(value: ExactRatio, minimum: ExactRatio, maximum: ExactRatio, options?: ExactRatioOptions): ExactRatio;
33
+ export declare function addExactRatios(left: ExactRatio, right: ExactRatio, options?: ExactRatioOptions): ExactRatio;
34
+ export declare function subtractExactRatios(left: ExactRatio, right: ExactRatio, options?: ExactRatioOptions): ExactRatio;
35
+ export declare function multiplyExactRatios(left: ExactRatio, right: ExactRatio, options?: ExactRatioOptions): ExactRatio;
36
+ export declare function divideExactRatios(dividend: ExactRatio, divisor: ExactRatio, options?: ExactRatioOptions): ExactRatio;
37
+ export declare function invertExactRatio(ratio: ExactRatio, options?: ExactRatioOptions): ExactRatio;
38
+ export declare function interpolateExactRatios(start: ExactRatio, end: ExactRatio, position: ExactRatio, options?: ExactRatioOptions): ExactRatio;
39
+ export declare function mapExactRatio(value: ExactRatio, sourceStart: ExactRatio, sourceEnd: ExactRatio, targetStart: ExactRatio, targetEnd: ExactRatio, options?: ExactRatioOptions): ExactRatio;
22
40
  export interface QuantizedRange {
23
41
  readonly origin: string;
24
42
  readonly step: string;
@@ -38,4 +56,3 @@ export declare function tryCreateRange(input: RangeInput): Result<QuantizedRange
38
56
  export declare function createBoundedRange(input: BoundedRangeInput): QuantizedRange;
39
57
  export declare function tryCreateBoundedRange(input: BoundedRangeInput): Result<QuantizedRange>;
40
58
  export type { Result, TiePolicy } from '../shared.js';
41
- //# sourceMappingURL=range.d.ts.map
@@ -1,7 +1,155 @@
1
1
  import { unwrap } from '../result.js';
2
2
  import {} from '../shared.js';
3
- import { addDecimal, compareDecimal, decimalQuotient, decimalToString, floorFraction, multiplyDecimalByInteger, parseDecimal, reduceFraction, subtractDecimal, } from '../internal/kernel/decimal.js';
3
+ import { addDecimal, compareDecimal, decimalQuotient, decimalToString, floorFraction, multiplyDecimalByInteger, parseDecimal, subtractDecimal, } from '../internal/kernel/decimal.js';
4
4
  import { fail, ok, validateSafeCeiling } from '../internal/kernel/foundation.js';
5
+ import { formatRatioPercentage } from '../internal/kernel/bounded-scalar.js';
6
+ export const DEFAULT_MAX_RATIO_NUMERATOR_BITS = 4_096;
7
+ export const DEFAULT_MAX_RATIO_DENOMINATOR_BITS = 4_096;
8
+ export function formatExactRatioPercentage(ratio) {
9
+ return formatRatioPercentage(createExactRatio(ratio.numerator, ratio.denominator));
10
+ }
11
+ export function createExactRatio(numerator, denominator, options = {}) {
12
+ return unwrap(tryCreateExactRatio(numerator, denominator, options));
13
+ }
14
+ export function tryCreateExactRatio(numerator, denominator, options = {}) {
15
+ const limits = tryRatioLimits(options);
16
+ if (!limits.ok)
17
+ return limits;
18
+ return canonicalRatio(numerator, denominator, limits.value);
19
+ }
20
+ export function compareExactRatios(left, right, options = {}) {
21
+ const [a, b] = checkedRatioPair(left, right, options);
22
+ const leftProduct = a.numerator * b.denominator;
23
+ const rightProduct = b.numerator * a.denominator;
24
+ return leftProduct < rightProduct ? -1 : leftProduct > rightProduct ? 1 : 0;
25
+ }
26
+ export function clampExactRatio(value, minimum, maximum, options = {}) {
27
+ const limits = unwrap(tryRatioLimits(options));
28
+ const canonicalValue = unwrap(canonicalRatio(value.numerator, value.denominator, limits));
29
+ const canonicalMinimum = unwrap(canonicalRatio(minimum.numerator, minimum.denominator, limits));
30
+ const canonicalMaximum = unwrap(canonicalRatio(maximum.numerator, maximum.denominator, limits));
31
+ if (compareCanonicalRatios(canonicalMinimum, canonicalMaximum) > 0) {
32
+ return unwrap(fail('construction', 'inverted-bounds', 'minimum must not exceed maximum.'));
33
+ }
34
+ if (compareCanonicalRatios(canonicalValue, canonicalMinimum) < 0)
35
+ return canonicalMinimum;
36
+ if (compareCanonicalRatios(canonicalValue, canonicalMaximum) > 0)
37
+ return canonicalMaximum;
38
+ return canonicalValue;
39
+ }
40
+ export function addExactRatios(left, right, options = {}) {
41
+ const limits = unwrap(tryRatioLimits(options));
42
+ const a = unwrap(canonicalRatio(left.numerator, left.denominator, limits));
43
+ const b = unwrap(canonicalRatio(right.numerator, right.denominator, limits));
44
+ const divisor = gcd(a.denominator, b.denominator);
45
+ const leftScale = b.denominator / divisor;
46
+ const rightScale = a.denominator / divisor;
47
+ return unwrap(canonicalRatio(a.numerator * leftScale + b.numerator * rightScale, a.denominator * leftScale, limits));
48
+ }
49
+ export function subtractExactRatios(left, right, options = {}) {
50
+ return addExactRatios(left, { numerator: -right.numerator, denominator: right.denominator }, options);
51
+ }
52
+ export function multiplyExactRatios(left, right, options = {}) {
53
+ const limits = unwrap(tryRatioLimits(options));
54
+ const a = unwrap(canonicalRatio(left.numerator, left.denominator, limits));
55
+ const b = unwrap(canonicalRatio(right.numerator, right.denominator, limits));
56
+ const crossA = gcd(abs(a.numerator), b.denominator);
57
+ const crossB = gcd(abs(b.numerator), a.denominator);
58
+ return unwrap(canonicalRatio((a.numerator / crossA) * (b.numerator / crossB), (a.denominator / crossB) * (b.denominator / crossA), limits));
59
+ }
60
+ export function divideExactRatios(dividend, divisor, options = {}) {
61
+ if (divisor.numerator === 0n) {
62
+ return unwrap(fail('construction', 'invalid-boundary', 'divisor must not be zero.'));
63
+ }
64
+ return multiplyExactRatios(dividend, { numerator: divisor.denominator, denominator: divisor.numerator }, options);
65
+ }
66
+ export function invertExactRatio(ratio, options = {}) {
67
+ if (ratio.numerator === 0n) {
68
+ return unwrap(fail('construction', 'invalid-boundary', 'zero has no multiplicative inverse.'));
69
+ }
70
+ return createExactRatio(ratio.denominator, ratio.numerator, options);
71
+ }
72
+ export function interpolateExactRatios(start, end, position, options = {}) {
73
+ return addExactRatios(start, multiplyExactRatios(subtractExactRatios(end, start, options), position, options), options);
74
+ }
75
+ export function mapExactRatio(value, sourceStart, sourceEnd, targetStart, targetEnd, options = {}) {
76
+ const sourceSpan = subtractExactRatios(sourceEnd, sourceStart, options);
77
+ if (sourceSpan.numerator === 0n) {
78
+ return unwrap(fail('construction', 'invalid-boundary', 'source range must have non-zero width.'));
79
+ }
80
+ const position = divideExactRatios(subtractExactRatios(value, sourceStart, options), sourceSpan, options);
81
+ return interpolateExactRatios(targetStart, targetEnd, position, options);
82
+ }
83
+ function checkedRatioPair(left, right, options) {
84
+ const limits = unwrap(tryRatioLimits(options));
85
+ return [
86
+ unwrap(canonicalRatio(left.numerator, left.denominator, limits)),
87
+ unwrap(canonicalRatio(right.numerator, right.denominator, limits)),
88
+ ];
89
+ }
90
+ function compareCanonicalRatios(left, right) {
91
+ const a = left.numerator * right.denominator;
92
+ const b = right.numerator * left.denominator;
93
+ return a < b ? -1 : a > b ? 1 : 0;
94
+ }
95
+ function tryRatioLimits(options) {
96
+ const maxNumeratorBits = options.maxNumeratorBits ?? DEFAULT_MAX_RATIO_NUMERATOR_BITS;
97
+ const maxDenominatorBits = options.maxDenominatorBits ?? DEFAULT_MAX_RATIO_DENOMINATOR_BITS;
98
+ if (!Number.isSafeInteger(maxNumeratorBits) || maxNumeratorBits < 1) {
99
+ return fail('construction', 'invalid-max-count', 'maxNumeratorBits must be a positive safe integer.', { maxNumeratorBits });
100
+ }
101
+ if (!Number.isSafeInteger(maxDenominatorBits) || maxDenominatorBits < 1) {
102
+ return fail('construction', 'invalid-max-count', 'maxDenominatorBits must be a positive safe integer.', { maxDenominatorBits });
103
+ }
104
+ return ok(Object.freeze({ maxNumeratorBits, maxDenominatorBits }));
105
+ }
106
+ function canonicalRatio(numerator, denominator, limits) {
107
+ if (typeof numerator !== 'bigint' || typeof denominator !== 'bigint') {
108
+ return fail('construction', 'invalid-boundary', 'numerator and denominator must be bigint values.');
109
+ }
110
+ if (denominator === 0n) {
111
+ return fail('construction', 'invalid-boundary', 'denominator must not be zero.');
112
+ }
113
+ const numeratorBits = bitLength(numerator);
114
+ const denominatorBits = bitLength(denominator);
115
+ if (numeratorBits > limits.maxNumeratorBits) {
116
+ return fail('resource-rejection', 'count-ceiling-exceeded', 'numerator exceeds maxNumeratorBits.', {
117
+ numeratorBits,
118
+ maxNumeratorBits: limits.maxNumeratorBits,
119
+ });
120
+ }
121
+ if (denominatorBits > limits.maxDenominatorBits) {
122
+ return fail('resource-rejection', 'count-ceiling-exceeded', 'denominator exceeds maxDenominatorBits.', {
123
+ denominatorBits,
124
+ maxDenominatorBits: limits.maxDenominatorBits,
125
+ });
126
+ }
127
+ if (numerator === 0n)
128
+ return ok(Object.freeze({ numerator: 0n, denominator: 1n }));
129
+ const sign = denominator < 0n ? -1n : 1n;
130
+ const divisor = gcd(abs(numerator), abs(denominator));
131
+ return ok(Object.freeze({
132
+ numerator: (numerator / divisor) * sign,
133
+ denominator: abs(denominator) / divisor,
134
+ }));
135
+ }
136
+ function bitLength(value) {
137
+ const magnitude = abs(value);
138
+ return magnitude === 0n ? 0 : magnitude.toString(2).length;
139
+ }
140
+ function abs(value) {
141
+ return value < 0n ? -value : value;
142
+ }
143
+ function gcd(left, right) {
144
+ let a = abs(left);
145
+ let b = abs(right);
146
+ while (b !== 0n) {
147
+ const remainder = a % b;
148
+ a = b;
149
+ b = remainder;
150
+ }
151
+ return a === 0n ? 1n : a;
152
+ }
5
153
  class ExactQuantizedRange {
6
154
  origin;
7
155
  step;
@@ -82,19 +230,16 @@ class ExactQuantizedRange {
82
230
  if (!validTick(tick, this.count))
83
231
  return null;
84
232
  if (this.count === 0)
85
- return Object.freeze({ numerator: 0n, denominator: 1n });
86
- const [numerator, denominator] = reduceFraction(BigInt(tick), BigInt(this.count));
87
- return Object.freeze({ numerator, denominator });
233
+ return createExactRatio(0n, 1n);
234
+ return createExactRatio(BigInt(tick), BigInt(this.count));
88
235
  }
89
236
  tickFromRatio(ratio, tie = 'lower') {
90
- if (ratio.denominator === 0n || !isTiePolicy(tie))
237
+ if (!isTiePolicy(tie))
91
238
  return null;
92
- let numerator = ratio.numerator;
93
- let denominator = ratio.denominator;
94
- if (denominator < 0n) {
95
- numerator = -numerator;
96
- denominator = -denominator;
97
- }
239
+ const canonical = tryCreateExactRatio(ratio.numerator, ratio.denominator);
240
+ if (!canonical.ok)
241
+ return null;
242
+ let { numerator, denominator } = canonical.value;
98
243
  numerator = clampBigInt(numerator, 0n, denominator);
99
244
  if (this.count === 0)
100
245
  return 0;