@sectile/core 0.2.0 → 0.2.1

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 (373) hide show
  1. package/dist/accordion.d.ts +44 -0
  2. package/dist/accordion.d.ts.map +1 -0
  3. package/dist/accordion.js +87 -0
  4. package/dist/accordion.js.map +1 -0
  5. package/dist/alert-dialog.d.ts +19 -0
  6. package/dist/alert-dialog.d.ts.map +1 -0
  7. package/dist/alert-dialog.js +10 -0
  8. package/dist/alert-dialog.js.map +1 -0
  9. package/dist/calendar.d.ts +3 -0
  10. package/dist/calendar.d.ts.map +1 -0
  11. package/dist/calendar.js +3 -0
  12. package/dist/calendar.js.map +1 -0
  13. package/dist/carousel.d.ts +41 -0
  14. package/dist/carousel.d.ts.map +1 -0
  15. package/dist/carousel.js +55 -0
  16. package/dist/carousel.js.map +1 -0
  17. package/dist/cascade-select.d.ts +48 -0
  18. package/dist/cascade-select.d.ts.map +1 -0
  19. package/dist/cascade-select.js +148 -0
  20. package/dist/cascade-select.js.map +1 -0
  21. package/dist/checkbox-group.d.ts +13 -0
  22. package/dist/checkbox-group.d.ts.map +1 -0
  23. package/dist/checkbox-group.js +16 -0
  24. package/dist/checkbox-group.js.map +1 -0
  25. package/dist/checkbox.d.ts +3 -0
  26. package/dist/checkbox.d.ts.map +1 -0
  27. package/dist/checkbox.js +3 -0
  28. package/dist/checkbox.js.map +1 -0
  29. package/dist/collection-window.d.ts +51 -0
  30. package/dist/collection-window.d.ts.map +1 -0
  31. package/dist/collection-window.js +111 -0
  32. package/dist/collection-window.js.map +1 -0
  33. package/dist/color-picker.d.ts +101 -0
  34. package/dist/color-picker.d.ts.map +1 -0
  35. package/dist/color-picker.js +503 -0
  36. package/dist/color-picker.js.map +1 -0
  37. package/dist/combobox.d.ts +17 -0
  38. package/dist/combobox.d.ts.map +1 -0
  39. package/dist/combobox.js +46 -0
  40. package/dist/combobox.js.map +1 -0
  41. package/dist/date-field.d.ts +62 -0
  42. package/dist/date-field.d.ts.map +1 -0
  43. package/dist/date-field.js +245 -0
  44. package/dist/date-field.js.map +1 -0
  45. package/dist/date-picker.d.ts +76 -0
  46. package/dist/date-picker.d.ts.map +1 -0
  47. package/dist/date-picker.js +261 -0
  48. package/dist/date-picker.js.map +1 -0
  49. package/dist/date-range-field.d.ts +47 -0
  50. package/dist/date-range-field.d.ts.map +1 -0
  51. package/dist/date-range-field.js +66 -0
  52. package/dist/date-range-field.js.map +1 -0
  53. package/dist/date-range-picker.d.ts +29 -0
  54. package/dist/date-range-picker.d.ts.map +1 -0
  55. package/dist/date-range-picker.js +89 -0
  56. package/dist/date-range-picker.js.map +1 -0
  57. package/dist/date-time-field.d.ts +57 -0
  58. package/dist/date-time-field.d.ts.map +1 -0
  59. package/dist/date-time-field.js +267 -0
  60. package/dist/date-time-field.js.map +1 -0
  61. package/dist/date-time-picker.d.ts +71 -0
  62. package/dist/date-time-picker.d.ts.map +1 -0
  63. package/dist/date-time-picker.js +156 -0
  64. package/dist/date-time-picker.js.map +1 -0
  65. package/dist/date-time-range-picker.d.ts +87 -0
  66. package/dist/date-time-range-picker.d.ts.map +1 -0
  67. package/dist/date-time-range-picker.js +252 -0
  68. package/dist/date-time-range-picker.js.map +1 -0
  69. package/dist/dialog.d.ts +17 -0
  70. package/dist/dialog.d.ts.map +1 -0
  71. package/dist/dialog.js +6 -0
  72. package/dist/dialog.js.map +1 -0
  73. package/dist/disclosure.d.ts +3 -0
  74. package/dist/disclosure.d.ts.map +1 -0
  75. package/dist/disclosure.js +3 -0
  76. package/dist/disclosure.js.map +1 -0
  77. package/dist/editable.d.ts +29 -0
  78. package/dist/editable.d.ts.map +1 -0
  79. package/dist/editable.js +34 -0
  80. package/dist/editable.js.map +1 -0
  81. package/dist/feed.d.ts +49 -0
  82. package/dist/feed.d.ts.map +1 -0
  83. package/dist/feed.js +124 -0
  84. package/dist/feed.js.map +1 -0
  85. package/dist/form.d.ts +135 -0
  86. package/dist/form.d.ts.map +1 -0
  87. package/dist/form.js +627 -0
  88. package/dist/form.js.map +1 -0
  89. package/dist/index.d.ts +37 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/interaction.d.ts +15 -0
  94. package/dist/interaction.d.ts.map +1 -0
  95. package/dist/interaction.js +42 -0
  96. package/dist/interaction.js.map +1 -0
  97. package/dist/internal/composites/calendar.d.ts +36 -0
  98. package/dist/internal/composites/calendar.d.ts.map +1 -0
  99. package/dist/internal/composites/calendar.js +143 -0
  100. package/dist/internal/composites/calendar.js.map +1 -0
  101. package/dist/internal/composites/combobox.d.ts +42 -0
  102. package/dist/internal/composites/combobox.d.ts.map +1 -0
  103. package/dist/internal/composites/combobox.js +188 -0
  104. package/dist/internal/composites/combobox.js.map +1 -0
  105. package/dist/internal/composites/grid-control.d.ts +37 -0
  106. package/dist/internal/composites/grid-control.d.ts.map +1 -0
  107. package/dist/internal/composites/grid-control.js +90 -0
  108. package/dist/internal/composites/grid-control.js.map +1 -0
  109. package/dist/internal/composites/linear-action.d.ts +36 -0
  110. package/dist/internal/composites/linear-action.d.ts.map +1 -0
  111. package/dist/internal/composites/linear-action.js +96 -0
  112. package/dist/internal/composites/linear-action.js.map +1 -0
  113. package/dist/internal/composites/linear-choice.d.ts +41 -0
  114. package/dist/internal/composites/linear-choice.d.ts.map +1 -0
  115. package/dist/internal/composites/linear-choice.js +139 -0
  116. package/dist/internal/composites/linear-choice.js.map +1 -0
  117. package/dist/internal/composites/listbox.d.ts +52 -0
  118. package/dist/internal/composites/listbox.d.ts.map +1 -0
  119. package/dist/internal/composites/listbox.js +251 -0
  120. package/dist/internal/composites/listbox.js.map +1 -0
  121. package/dist/internal/composites/menu.d.ts +29 -0
  122. package/dist/internal/composites/menu.d.ts.map +1 -0
  123. package/dist/internal/composites/menu.js +76 -0
  124. package/dist/internal/composites/menu.js.map +1 -0
  125. package/dist/internal/composites/popup.d.ts +21 -0
  126. package/dist/internal/composites/popup.d.ts.map +1 -0
  127. package/dist/internal/composites/popup.js +10 -0
  128. package/dist/internal/composites/popup.js.map +1 -0
  129. package/dist/internal/composites/slider.d.ts +21 -0
  130. package/dist/internal/composites/slider.d.ts.map +1 -0
  131. package/dist/internal/composites/slider.js +73 -0
  132. package/dist/internal/composites/slider.js.map +1 -0
  133. package/dist/internal/composites/tree-grid.d.ts +67 -0
  134. package/dist/internal/composites/tree-grid.d.ts.map +1 -0
  135. package/dist/internal/composites/tree-grid.js +281 -0
  136. package/dist/internal/composites/tree-grid.js.map +1 -0
  137. package/dist/internal/composites/tree-view.d.ts +42 -0
  138. package/dist/internal/composites/tree-view.d.ts.map +1 -0
  139. package/dist/internal/composites/tree-view.js +196 -0
  140. package/dist/internal/composites/tree-view.js.map +1 -0
  141. package/dist/internal/editing/text.d.ts +66 -0
  142. package/dist/internal/editing/text.d.ts.map +1 -0
  143. package/dist/internal/editing/text.js +248 -0
  144. package/dist/internal/editing/text.js.map +1 -0
  145. package/dist/internal/kernel/decimal.d.ts +22 -0
  146. package/dist/internal/kernel/decimal.d.ts.map +1 -0
  147. package/dist/internal/kernel/decimal.js +137 -0
  148. package/dist/internal/kernel/decimal.js.map +1 -0
  149. package/dist/internal/kernel/foundation.d.ts +12 -0
  150. package/dist/internal/kernel/foundation.d.ts.map +1 -0
  151. package/dist/internal/kernel/foundation.js +132 -0
  152. package/dist/internal/kernel/foundation.js.map +1 -0
  153. package/dist/internal/kernel/indexed-sequence.d.ts +26 -0
  154. package/dist/internal/kernel/indexed-sequence.d.ts.map +1 -0
  155. package/dist/internal/kernel/indexed-sequence.js +117 -0
  156. package/dist/internal/kernel/indexed-sequence.js.map +1 -0
  157. package/dist/internal/kernel/machine.d.ts +8 -0
  158. package/dist/internal/kernel/machine.d.ts.map +1 -0
  159. package/dist/internal/kernel/machine.js +6 -0
  160. package/dist/internal/kernel/machine.js.map +1 -0
  161. package/dist/internal/runtime/revision.d.ts +23 -0
  162. package/dist/internal/runtime/revision.d.ts.map +1 -0
  163. package/dist/internal/runtime/revision.js +76 -0
  164. package/dist/internal/runtime/revision.js.map +1 -0
  165. package/dist/internal/state/checked.d.ts +22 -0
  166. package/dist/internal/state/checked.d.ts.map +1 -0
  167. package/dist/internal/state/checked.js +33 -0
  168. package/dist/internal/state/checked.js.map +1 -0
  169. package/dist/internal/state/cursor.d.ts +13 -0
  170. package/dist/internal/state/cursor.d.ts.map +1 -0
  171. package/dist/internal/state/cursor.js +24 -0
  172. package/dist/internal/state/cursor.js.map +1 -0
  173. package/dist/internal/state/expansion.d.ts +8 -0
  174. package/dist/internal/state/expansion.d.ts.map +1 -0
  175. package/dist/internal/state/expansion.js +23 -0
  176. package/dist/internal/state/expansion.js.map +1 -0
  177. package/dist/internal/state/open-state.d.ts +17 -0
  178. package/dist/internal/state/open-state.d.ts.map +1 -0
  179. package/dist/internal/state/open-state.js +29 -0
  180. package/dist/internal/state/open-state.js.map +1 -0
  181. package/dist/internal/state/selection.d.ts +23 -0
  182. package/dist/internal/state/selection.d.ts.map +1 -0
  183. package/dist/internal/state/selection.js +110 -0
  184. package/dist/internal/state/selection.js.map +1 -0
  185. package/dist/layer-stack.d.ts +47 -0
  186. package/dist/layer-stack.d.ts.map +1 -0
  187. package/dist/layer-stack.js +115 -0
  188. package/dist/layer-stack.js.map +1 -0
  189. package/dist/listbox.d.ts +3 -0
  190. package/dist/listbox.d.ts.map +1 -0
  191. package/dist/listbox.js +3 -0
  192. package/dist/listbox.js.map +1 -0
  193. package/dist/menu-button.d.ts +5 -0
  194. package/dist/menu-button.d.ts.map +1 -0
  195. package/dist/menu-button.js +5 -0
  196. package/dist/menu-button.js.map +1 -0
  197. package/dist/menu.d.ts +10 -0
  198. package/dist/menu.d.ts.map +1 -0
  199. package/dist/menu.js +9 -0
  200. package/dist/menu.js.map +1 -0
  201. package/dist/menubar.d.ts +5 -0
  202. package/dist/menubar.d.ts.map +1 -0
  203. package/dist/menubar.js +5 -0
  204. package/dist/menubar.js.map +1 -0
  205. package/dist/month-picker.d.ts +5 -0
  206. package/dist/month-picker.d.ts.map +1 -0
  207. package/dist/month-picker.js +4 -0
  208. package/dist/month-picker.js.map +1 -0
  209. package/dist/month-range-picker.d.ts +6 -0
  210. package/dist/month-range-picker.d.ts.map +1 -0
  211. package/dist/month-range-picker.js +5 -0
  212. package/dist/month-range-picker.js.map +1 -0
  213. package/dist/multi-thumb-slider.d.ts +36 -0
  214. package/dist/multi-thumb-slider.d.ts.map +1 -0
  215. package/dist/multi-thumb-slider.js +72 -0
  216. package/dist/multi-thumb-slider.js.map +1 -0
  217. package/dist/navigation-menu.d.ts +6 -0
  218. package/dist/navigation-menu.d.ts.map +1 -0
  219. package/dist/navigation-menu.js +5 -0
  220. package/dist/navigation-menu.js.map +1 -0
  221. package/dist/number-field.d.ts +51 -0
  222. package/dist/number-field.d.ts.map +1 -0
  223. package/dist/number-field.js +461 -0
  224. package/dist/number-field.js.map +1 -0
  225. package/dist/pagination.d.ts +65 -0
  226. package/dist/pagination.d.ts.map +1 -0
  227. package/dist/pagination.js +197 -0
  228. package/dist/pagination.js.map +1 -0
  229. package/dist/pin-input.d.ts +31 -0
  230. package/dist/pin-input.d.ts.map +1 -0
  231. package/dist/pin-input.js +53 -0
  232. package/dist/pin-input.js.map +1 -0
  233. package/dist/popover.d.ts +17 -0
  234. package/dist/popover.d.ts.map +1 -0
  235. package/dist/popover.js +6 -0
  236. package/dist/popover.js.map +1 -0
  237. package/dist/quantity-field.d.ts +59 -0
  238. package/dist/quantity-field.d.ts.map +1 -0
  239. package/dist/quantity-field.js +254 -0
  240. package/dist/quantity-field.js.map +1 -0
  241. package/dist/radio-group.d.ts +23 -0
  242. package/dist/radio-group.d.ts.map +1 -0
  243. package/dist/radio-group.js +20 -0
  244. package/dist/radio-group.js.map +1 -0
  245. package/dist/range-calendar.d.ts +6 -0
  246. package/dist/range-calendar.d.ts.map +1 -0
  247. package/dist/range-calendar.js +5 -0
  248. package/dist/range-calendar.js.map +1 -0
  249. package/dist/rating.d.ts +18 -0
  250. package/dist/rating.d.ts.map +1 -0
  251. package/dist/rating.js +19 -0
  252. package/dist/rating.js.map +1 -0
  253. package/dist/reorder.d.ts +47 -0
  254. package/dist/reorder.d.ts.map +1 -0
  255. package/dist/reorder.js +110 -0
  256. package/dist/reorder.js.map +1 -0
  257. package/dist/result.d.ts +10 -0
  258. package/dist/result.d.ts.map +1 -0
  259. package/dist/result.js +19 -0
  260. package/dist/result.js.map +1 -0
  261. package/dist/revision.d.ts +3 -0
  262. package/dist/revision.d.ts.map +1 -0
  263. package/dist/revision.js +3 -0
  264. package/dist/revision.js.map +1 -0
  265. package/dist/select.d.ts +31 -0
  266. package/dist/select.d.ts.map +1 -0
  267. package/dist/select.js +32 -0
  268. package/dist/select.js.map +1 -0
  269. package/dist/shared.d.ts +43 -0
  270. package/dist/shared.d.ts.map +1 -0
  271. package/dist/shared.js +3 -0
  272. package/dist/shared.js.map +1 -0
  273. package/dist/slider.d.ts +3 -0
  274. package/dist/slider.d.ts.map +1 -0
  275. package/dist/slider.js +3 -0
  276. package/dist/slider.js.map +1 -0
  277. package/dist/spin-button.d.ts +31 -0
  278. package/dist/spin-button.d.ts.map +1 -0
  279. package/dist/spin-button.js +65 -0
  280. package/dist/spin-button.js.map +1 -0
  281. package/dist/stepper.d.ts +18 -0
  282. package/dist/stepper.d.ts.map +1 -0
  283. package/dist/stepper.js +16 -0
  284. package/dist/stepper.js.map +1 -0
  285. package/dist/structures/grid.d.ts +29 -0
  286. package/dist/structures/grid.d.ts.map +1 -0
  287. package/dist/structures/grid.js +202 -0
  288. package/dist/structures/grid.js.map +1 -0
  289. package/dist/structures/range.d.ts +41 -0
  290. package/dist/structures/range.d.ts.map +1 -0
  291. package/dist/structures/range.js +249 -0
  292. package/dist/structures/range.js.map +1 -0
  293. package/dist/structures/sequence.d.ts +19 -0
  294. package/dist/structures/sequence.d.ts.map +1 -0
  295. package/dist/structures/sequence.js +28 -0
  296. package/dist/structures/sequence.js.map +1 -0
  297. package/dist/structures/tree.d.ts +33 -0
  298. package/dist/structures/tree.d.ts.map +1 -0
  299. package/dist/structures/tree.js +238 -0
  300. package/dist/structures/tree.js.map +1 -0
  301. package/dist/switch.d.ts +21 -0
  302. package/dist/switch.d.ts.map +1 -0
  303. package/dist/switch.js +8 -0
  304. package/dist/switch.js.map +1 -0
  305. package/dist/tabs.d.ts +16 -0
  306. package/dist/tabs.d.ts.map +1 -0
  307. package/dist/tabs.js +27 -0
  308. package/dist/tabs.js.map +1 -0
  309. package/dist/tags-input.d.ts +43 -0
  310. package/dist/tags-input.d.ts.map +1 -0
  311. package/dist/tags-input.js +48 -0
  312. package/dist/tags-input.js.map +1 -0
  313. package/dist/text.d.ts +4 -0
  314. package/dist/text.d.ts.map +1 -0
  315. package/dist/text.js +4 -0
  316. package/dist/text.js.map +1 -0
  317. package/dist/time-field.d.ts +48 -0
  318. package/dist/time-field.d.ts.map +1 -0
  319. package/dist/time-field.js +157 -0
  320. package/dist/time-field.js.map +1 -0
  321. package/dist/time-range-field.d.ts +53 -0
  322. package/dist/time-range-field.d.ts.map +1 -0
  323. package/dist/time-range-field.js +75 -0
  324. package/dist/time-range-field.js.map +1 -0
  325. package/dist/timer.d.ts +37 -0
  326. package/dist/timer.d.ts.map +1 -0
  327. package/dist/timer.js +84 -0
  328. package/dist/timer.js.map +1 -0
  329. package/dist/toast.d.ts +56 -0
  330. package/dist/toast.d.ts.map +1 -0
  331. package/dist/toast.js +87 -0
  332. package/dist/toast.js.map +1 -0
  333. package/dist/toggle-button.d.ts +20 -0
  334. package/dist/toggle-button.d.ts.map +1 -0
  335. package/dist/toggle-button.js +20 -0
  336. package/dist/toggle-button.js.map +1 -0
  337. package/dist/toggle-group.d.ts +25 -0
  338. package/dist/toggle-group.d.ts.map +1 -0
  339. package/dist/toggle-group.js +30 -0
  340. package/dist/toggle-group.js.map +1 -0
  341. package/dist/toolbar.d.ts +3 -0
  342. package/dist/toolbar.d.ts.map +1 -0
  343. package/dist/toolbar.js +3 -0
  344. package/dist/toolbar.js.map +1 -0
  345. package/dist/tooltip.d.ts +3 -0
  346. package/dist/tooltip.d.ts.map +1 -0
  347. package/dist/tooltip.js +3 -0
  348. package/dist/tooltip.js.map +1 -0
  349. package/dist/tree-grid.d.ts +13 -0
  350. package/dist/tree-grid.d.ts.map +1 -0
  351. package/dist/tree-grid.js +20 -0
  352. package/dist/tree-grid.js.map +1 -0
  353. package/dist/tree-view.d.ts +3 -0
  354. package/dist/tree-view.d.ts.map +1 -0
  355. package/dist/tree-view.js +3 -0
  356. package/dist/tree-view.js.map +1 -0
  357. package/dist/units.d.ts +77 -0
  358. package/dist/units.d.ts.map +1 -0
  359. package/dist/units.js +512 -0
  360. package/dist/units.js.map +1 -0
  361. package/dist/window-splitter.d.ts +3 -0
  362. package/dist/window-splitter.d.ts.map +1 -0
  363. package/dist/window-splitter.js +3 -0
  364. package/dist/window-splitter.js.map +1 -0
  365. package/dist/year-picker.d.ts +10 -0
  366. package/dist/year-picker.d.ts.map +1 -0
  367. package/dist/year-picker.js +27 -0
  368. package/dist/year-picker.js.map +1 -0
  369. package/dist/year-range-picker.d.ts +6 -0
  370. package/dist/year-range-picker.d.ts.map +1 -0
  371. package/dist/year-range-picker.js +5 -0
  372. package/dist/year-range-picker.js.map +1 -0
  373. package/package.json +1 -1
@@ -0,0 +1,41 @@
1
+ import { type Result, type TiePolicy } from '../shared.js';
2
+ export interface RangeOptions {
3
+ readonly maxCount?: number;
4
+ readonly maxDecimalCodeUnits?: number;
5
+ readonly maxScale?: number;
6
+ }
7
+ export interface RangeInput extends RangeOptions {
8
+ readonly origin: string;
9
+ readonly step: string;
10
+ /** Highest tick. Cardinality is count + 1. */
11
+ readonly count: number;
12
+ }
13
+ export interface BoundedRangeInput extends RangeOptions {
14
+ readonly min: string;
15
+ readonly max: string;
16
+ readonly step: string;
17
+ }
18
+ export interface ExactRatio {
19
+ readonly numerator: bigint;
20
+ readonly denominator: bigint;
21
+ }
22
+ export interface QuantizedRange {
23
+ readonly origin: string;
24
+ readonly step: string;
25
+ readonly count: number;
26
+ readonly cardinality: number;
27
+ readonly lower: string;
28
+ readonly upper: string;
29
+ valueAt(tick: number): string | null;
30
+ tickOf(value: string): number | null;
31
+ clamp(value: string): string | null;
32
+ snap(value: string, tie?: TiePolicy): string | null;
33
+ ratioOfTick(tick: number): ExactRatio | null;
34
+ tickFromRatio(ratio: ExactRatio, tie?: TiePolicy): number | null;
35
+ }
36
+ export declare function createRange(input: RangeInput): QuantizedRange;
37
+ export declare function tryCreateRange(input: RangeInput): Result<QuantizedRange>;
38
+ export declare function createBoundedRange(input: BoundedRangeInput): QuantizedRange;
39
+ export declare function tryCreateBoundedRange(input: BoundedRangeInput): Result<QuantizedRange>;
40
+ export type { Result, TiePolicy } from '../shared.js';
41
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/structures/range.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAe3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7C,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;CAClE;AAkHD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAE7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAsDxE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,cAAc,CAE3E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC,CAkEtF;AAcD,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,249 @@
1
+ import { unwrap } from '../result.js';
2
+ import {} from '../shared.js';
3
+ import { addDecimal, compareDecimal, decimalQuotient, decimalToString, floorFraction, multiplyDecimalByInteger, parseDecimal, reduceFraction, subtractDecimal, } from '../internal/kernel/decimal.js';
4
+ import { fail, ok, validateSafeCeiling } from '../internal/kernel/foundation.js';
5
+ class ExactQuantizedRange {
6
+ origin;
7
+ step;
8
+ count;
9
+ #origin;
10
+ #step;
11
+ constructor(origin, step, count) {
12
+ this.#origin = origin;
13
+ this.#step = step;
14
+ this.origin = decimalToString(origin);
15
+ this.step = decimalToString(step);
16
+ this.count = count;
17
+ Object.freeze(this);
18
+ }
19
+ get cardinality() {
20
+ return this.count + 1;
21
+ }
22
+ get lower() {
23
+ return this.origin;
24
+ }
25
+ get upper() {
26
+ return decimalToString(this.valueDecimal(this.count));
27
+ }
28
+ valueAt(tick) {
29
+ return validTick(tick, this.count) ? decimalToString(this.valueDecimal(tick)) : null;
30
+ }
31
+ tickOf(value) {
32
+ const parsed = parseDecimal(value);
33
+ if (parsed === null)
34
+ return null;
35
+ const [numerator, denominator] = decimalQuotient(subtractDecimal(parsed, this.#origin), this.#step);
36
+ if (denominator <= 0n || numerator % denominator !== 0n)
37
+ return null;
38
+ const tick = numerator / denominator;
39
+ return tick >= 0n && tick <= BigInt(this.count) ? Number(tick) : null;
40
+ }
41
+ clamp(value) {
42
+ const parsed = parseDecimal(value);
43
+ if (parsed === null)
44
+ return null;
45
+ if (compareDecimal(parsed, this.#origin) < 0)
46
+ return this.lower;
47
+ const upper = this.valueDecimal(this.count);
48
+ if (compareDecimal(parsed, upper) > 0)
49
+ return this.upper;
50
+ return decimalToString(parsed);
51
+ }
52
+ snap(value, tie = 'lower') {
53
+ const parsed = parseDecimal(value);
54
+ if (parsed === null || !isTiePolicy(tie))
55
+ return null;
56
+ const clamped = compareDecimal(parsed, this.#origin) < 0
57
+ ? this.#origin
58
+ : compareDecimal(parsed, this.valueDecimal(this.count)) > 0
59
+ ? this.valueDecimal(this.count)
60
+ : parsed;
61
+ const [numerator, denominator] = decimalQuotient(subtractDecimal(clamped, this.#origin), this.#step);
62
+ const floor = floorFraction(numerator, denominator);
63
+ const ceil = numerator % denominator === 0n ? floor : floor + 1n;
64
+ const boundedFloor = clampBigInt(floor, 0n, BigInt(this.count));
65
+ const boundedCeil = clampBigInt(ceil, 0n, BigInt(this.count));
66
+ const lowerDistance = numerator - boundedFloor * denominator;
67
+ const upperDistance = boundedCeil * denominator - numerator;
68
+ let tick;
69
+ if (lowerDistance < upperDistance)
70
+ tick = boundedFloor;
71
+ else if (upperDistance < lowerDistance)
72
+ tick = boundedCeil;
73
+ else if (tie === 'lower')
74
+ tick = boundedFloor;
75
+ else if (tie === 'upper')
76
+ tick = boundedCeil;
77
+ else
78
+ tick = boundedFloor % 2n === 0n ? boundedFloor : boundedCeil;
79
+ return decimalToString(this.valueDecimal(Number(tick)));
80
+ }
81
+ ratioOfTick(tick) {
82
+ if (!validTick(tick, this.count))
83
+ return null;
84
+ 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 });
88
+ }
89
+ tickFromRatio(ratio, tie = 'lower') {
90
+ if (ratio.denominator === 0n || !isTiePolicy(tie))
91
+ return null;
92
+ let numerator = ratio.numerator;
93
+ let denominator = ratio.denominator;
94
+ if (denominator < 0n) {
95
+ numerator = -numerator;
96
+ denominator = -denominator;
97
+ }
98
+ numerator = clampBigInt(numerator, 0n, denominator);
99
+ if (this.count === 0)
100
+ return 0;
101
+ const scaled = numerator * BigInt(this.count);
102
+ const floor = scaled / denominator;
103
+ const ceil = scaled % denominator === 0n ? floor : floor + 1n;
104
+ const lowerDistance = scaled - floor * denominator;
105
+ const upperDistance = ceil * denominator - scaled;
106
+ if (lowerDistance < upperDistance)
107
+ return Number(floor);
108
+ if (upperDistance < lowerDistance)
109
+ return Number(ceil);
110
+ if (tie === 'lower')
111
+ return Number(floor);
112
+ if (tie === 'upper')
113
+ return Number(ceil);
114
+ return Number(floor % 2n === 0n ? floor : ceil);
115
+ }
116
+ valueDecimal(tick) {
117
+ return addDecimal(this.#origin, multiplyDecimalByInteger(this.#step, BigInt(tick)));
118
+ }
119
+ }
120
+ export function createRange(input) {
121
+ return unwrap(tryCreateRange(input));
122
+ }
123
+ export function tryCreateRange(input) {
124
+ const maxCount = input.maxCount ?? 10_000_000;
125
+ const maxDecimalCodeUnits = input.maxDecimalCodeUnits ?? 1_024;
126
+ const maxScale = input.maxScale ?? 100;
127
+ for (const [value, name, minimum] of [
128
+ [maxCount, 'maxCount', 0],
129
+ [maxDecimalCodeUnits, 'maxDecimalCodeUnits', 1],
130
+ [maxScale, 'maxScale', 0],
131
+ ]) {
132
+ const error = validateSafeCeiling(value, name, minimum);
133
+ if (error !== null)
134
+ return { ok: false, error };
135
+ }
136
+ const countError = validateSafeCeiling(input.count, 'count');
137
+ if (countError !== null)
138
+ return { ok: false, error: countError };
139
+ if (input.count >= Number.MAX_SAFE_INTEGER) {
140
+ return fail('resource-rejection', 'cardinality-not-safe', 'count + 1 must remain within the safe integer domain.', { count: input.count });
141
+ }
142
+ if (input.count > maxCount) {
143
+ return fail('resource-rejection', 'count-ceiling-exceeded', 'Range count exceeds maxCount.', {
144
+ count: input.count,
145
+ maxCount,
146
+ });
147
+ }
148
+ for (const [value, name] of [
149
+ [input.origin, 'origin'],
150
+ [input.step, 'step'],
151
+ ]) {
152
+ if (value.length > maxDecimalCodeUnits) {
153
+ return fail('resource-rejection', 'decimal-code-unit-ceiling-exceeded', `${name} exceeds maxDecimalCodeUnits.`, {
154
+ name,
155
+ codeUnits: value.length,
156
+ maxDecimalCodeUnits,
157
+ });
158
+ }
159
+ }
160
+ const origin = parseDecimal(input.origin);
161
+ const step = parseDecimal(input.step);
162
+ if (origin === null || step === null) {
163
+ return fail('construction', 'invalid-decimal', 'origin and step must be finite canonical decimal spellings.');
164
+ }
165
+ if (origin.scale > maxScale || step.scale > maxScale) {
166
+ return fail('resource-rejection', 'decimal-scale-ceiling-exceeded', 'Decimal scale exceeds maxScale.', {
167
+ maxScale,
168
+ });
169
+ }
170
+ if (step.coefficient <= 0n) {
171
+ return fail('construction', 'non-positive-step', 'step must be greater than zero.');
172
+ }
173
+ return ok(new ExactQuantizedRange(origin, step, input.count));
174
+ }
175
+ export function createBoundedRange(input) {
176
+ return unwrap(tryCreateBoundedRange(input));
177
+ }
178
+ export function tryCreateBoundedRange(input) {
179
+ const maxCount = input.maxCount ?? 10_000_000;
180
+ const maxDecimalCodeUnits = input.maxDecimalCodeUnits ?? 1_024;
181
+ const maxScale = input.maxScale ?? 100;
182
+ for (const [value, name, minimum] of [
183
+ [maxCount, 'maxCount', 0],
184
+ [maxDecimalCodeUnits, 'maxDecimalCodeUnits', 1],
185
+ [maxScale, 'maxScale', 0],
186
+ ]) {
187
+ const error = validateSafeCeiling(value, name, minimum);
188
+ if (error !== null)
189
+ return { ok: false, error };
190
+ }
191
+ for (const [value, name] of [
192
+ [input.min, 'min'],
193
+ [input.max, 'max'],
194
+ [input.step, 'step'],
195
+ ]) {
196
+ if (value.length > maxDecimalCodeUnits) {
197
+ return fail('resource-rejection', 'decimal-code-unit-ceiling-exceeded', `${name} exceeds maxDecimalCodeUnits.`, { name, codeUnits: value.length, maxDecimalCodeUnits });
198
+ }
199
+ }
200
+ const min = parseDecimal(input.min);
201
+ const max = parseDecimal(input.max);
202
+ const step = parseDecimal(input.step);
203
+ if (min === null || max === null || step === null) {
204
+ return fail('construction', 'invalid-decimal', 'min, max, and step must be finite decimal spellings.');
205
+ }
206
+ if (min.scale > maxScale || max.scale > maxScale || step.scale > maxScale) {
207
+ return fail('resource-rejection', 'decimal-scale-ceiling-exceeded', 'Decimal scale exceeds maxScale.', {
208
+ maxScale,
209
+ });
210
+ }
211
+ if (compareDecimal(max, min) < 0) {
212
+ return fail('construction', 'inverted-bounds', 'max must be greater than or equal to min.');
213
+ }
214
+ if (step.coefficient <= 0n) {
215
+ return fail('construction', 'non-positive-step', 'step must be greater than zero.');
216
+ }
217
+ const [numerator, denominator] = decimalQuotient(subtractDecimal(max, min), step);
218
+ if (numerator < 0n || numerator % denominator !== 0n) {
219
+ return fail('construction', 'endpoint-off-lattice', 'The upper endpoint must be on the range lattice.');
220
+ }
221
+ const count = numerator / denominator;
222
+ if (count >= BigInt(Number.MAX_SAFE_INTEGER)) {
223
+ return fail('resource-rejection', 'count-not-safe', 'Derived count exceeds the safe integer domain.');
224
+ }
225
+ if (count > BigInt(maxCount)) {
226
+ return fail('resource-rejection', 'count-ceiling-exceeded', 'Derived range count exceeds maxCount.', {
227
+ count: count.toString(),
228
+ maxCount,
229
+ });
230
+ }
231
+ return tryCreateRange({
232
+ origin: input.min,
233
+ step: input.step,
234
+ count: Number(count),
235
+ maxCount,
236
+ maxDecimalCodeUnits,
237
+ maxScale,
238
+ });
239
+ }
240
+ function validTick(tick, count) {
241
+ return Number.isSafeInteger(tick) && tick >= 0 && tick <= count;
242
+ }
243
+ function isTiePolicy(value) {
244
+ return value === 'lower' || value === 'upper' || value === 'even-tick';
245
+ }
246
+ function clampBigInt(value, lower, upper) {
247
+ return value < lower ? lower : value > upper ? upper : value;
248
+ }
249
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/structures/range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type BoundaryPolicy, type Direction, type MoveResult, type ResourceCeilings, type Result, type ScanOptions, type StableID } from '../shared.js';
2
+ export interface SequenceOptions extends ResourceCeilings {
3
+ readonly maxItems?: number;
4
+ }
5
+ export type SequenceProjectionPredicate<ID extends StableID = StableID> = (id: ID, index: number) => boolean;
6
+ export interface Sequence<ID extends StableID = StableID> {
7
+ readonly size: number;
8
+ readonly ids: readonly ID[];
9
+ at(index: number): ID | null;
10
+ indexOf(id: ID): number | null;
11
+ contains(id: ID): boolean;
12
+ compare(left: ID, right: ID): -1 | 0 | 1 | null;
13
+ project(predicate: SequenceProjectionPredicate<ID>): Sequence<ID>;
14
+ move(current: ID, direction: Direction, boundary?: BoundaryPolicy, options?: ScanOptions<ID>): MoveResult<ID>;
15
+ }
16
+ export declare function createSequence<ID extends StableID>(ids: readonly ID[], options?: SequenceOptions): Sequence<ID>;
17
+ export declare function tryCreateSequence<ID extends StableID>(ids: readonly ID[], options?: SequenceOptions): Result<Sequence<ID>>;
18
+ export type { BoundaryPolicy, Direction, MoveResult, Result, ScanOptions, SectileError, StableID, } from '../shared.js';
19
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/structures/sequence.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAItB,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,2BAA2B,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE7G,MAAM,WAAW,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC;IAC5B,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,2BAA2B,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,CACF,OAAO,EAAE,EAAE,EACX,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,cAAc,EACzB,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,GACxB,UAAU,CAAC,EAAE,CAAC,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,QAAQ,EAChD,GAAG,EAAE,SAAS,EAAE,EAAE,EAClB,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAAC,EAAE,CAAC,CAEd;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,QAAQ,EACnD,GAAG,EAAE,SAAS,EAAE,EAAE,EAClB,OAAO,GAAE,eAAoB,GAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAgBtB;AAED,YAAY,EACV,cAAc,EACd,SAAS,EACT,UAAU,EACV,MAAM,EACN,WAAW,EACX,YAAY,EACZ,QAAQ,GACT,MAAM,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { unwrap } from '../result.js';
2
+ import { DEFAULT_MAX_ID_CODE_UNITS, } from '../shared.js';
3
+ import { fail, ok, validateSafeCeiling, validateUniqueIDs } from '../internal/kernel/foundation.js';
4
+ import { IndexedSequence } from '../internal/kernel/indexed-sequence.js';
5
+ export function createSequence(ids, options = {}) {
6
+ return unwrap(tryCreateSequence(ids, options));
7
+ }
8
+ export function tryCreateSequence(ids, options = {}) {
9
+ const maxItems = options.maxItems ?? 100_000;
10
+ const ceilingError = validateSafeCeiling(maxItems, 'maxItems');
11
+ if (ceilingError !== null)
12
+ return { ok: false, error: ceilingError };
13
+ const maxIDCodeUnits = options.maxIDCodeUnits ?? DEFAULT_MAX_ID_CODE_UNITS;
14
+ const idCeilingError = validateSafeCeiling(maxIDCodeUnits, 'maxIDCodeUnits', 1);
15
+ if (idCeilingError !== null)
16
+ return { ok: false, error: idCeilingError };
17
+ if (ids.length > maxItems) {
18
+ return fail('resource-rejection', 'item-ceiling-exceeded', 'Sequence exceeds maxItems.', {
19
+ size: ids.length,
20
+ maxItems,
21
+ });
22
+ }
23
+ const validated = validateUniqueIDs(ids, maxIDCodeUnits);
24
+ if (!validated.ok)
25
+ return validated;
26
+ return ok(new IndexedSequence(validated.value));
27
+ }
28
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/structures/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,yBAAyB,GAQ1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAqB,MAAM,wCAAwC,CAAC;AAwB5F,MAAM,UAAU,cAAc,CAC5B,GAAkB,EAClB,OAAO,GAAoB,EAAE;IAE7B,OAAO,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAkB,EAClB,OAAO,GAAoB,EAAE;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,yBAAyB,CAAC;IAC3E,MAAM,cAAc,GAAG,mBAAmB,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IACzE,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE;YACvF,IAAI,EAAE,GAAG,CAAC,MAAM;YAChB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,EAAE,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,CAAqB,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ResourceCeilings, type Result, type StableID } from '../shared.js';
2
+ import type { Sequence } from './sequence.js';
3
+ export interface TreeNodeInput<ID extends StableID = StableID> {
4
+ readonly id: ID;
5
+ readonly parentID: ID | null;
6
+ }
7
+ export interface TreeOptions extends ResourceCeilings {
8
+ readonly maxItems?: number;
9
+ readonly maxDepth?: number;
10
+ }
11
+ export interface Tree<ID extends StableID = StableID> {
12
+ readonly size: number;
13
+ readonly roots: Sequence<ID>;
14
+ has(id: ID): boolean;
15
+ parentOf(id: ID): ID | null;
16
+ childrenOf(id: ID): Sequence<ID> | null;
17
+ isLeaf(id: ID): boolean | null;
18
+ depthOf(id: ID): number | null;
19
+ ancestorsOf(id: ID): readonly ID[] | null;
20
+ preorder(): Sequence<ID>;
21
+ postorder(): Sequence<ID>;
22
+ normalizeExpansion(expanded: Iterable<ID>): Expansion<ID>;
23
+ visible(expansion: Expansion<ID> | Iterable<ID>): Sequence<ID>;
24
+ }
25
+ export interface Expansion<ID extends StableID = StableID> {
26
+ readonly ids: readonly ID[];
27
+ readonly size: number;
28
+ has(id: ID): boolean;
29
+ }
30
+ export declare function createTree<ID extends StableID>(nodes: readonly TreeNodeInput<ID>[], options?: TreeOptions): Tree<ID>;
31
+ export declare function tryCreateTree<ID extends StableID>(nodes: readonly TreeNodeInput<ID>[], options?: TreeOptions): Result<Tree<ID>>;
32
+ export type { Result, StableID } from '../shared.js';
33
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/structures/tree.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAStB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,aAAa,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAC3D,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,gBAAgB;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,IAAI,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC;IAC1C,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzB,SAAS,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,SAAS,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IACvD,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;CACtB;AA6HD,wBAAgB,UAAU,CAAC,EAAE,SAAS,QAAQ,EAC5C,KAAK,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,EACnC,OAAO,GAAE,WAAgB,GACxB,IAAI,CAAC,EAAE,CAAC,CAEV;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,QAAQ,EAC/C,KAAK,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,EACnC,OAAO,GAAE,WAAgB,GACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAgIlB;AAWD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,238 @@
1
+ import { unwrap } from '../result.js';
2
+ import { DEFAULT_MAX_ID_CODE_UNITS, } from '../shared.js';
3
+ import { fail, freezeArray, ok, validateSafeCeiling, validateStableID, } from '../internal/kernel/foundation.js';
4
+ import { IndexedSequence } from '../internal/kernel/indexed-sequence.js';
5
+ class NormalizedExpansion {
6
+ ids;
7
+ #set;
8
+ constructor(ids) {
9
+ this.ids = freezeArray(ids);
10
+ this.#set = new Set(ids);
11
+ Object.freeze(this);
12
+ }
13
+ get size() {
14
+ return this.ids.length;
15
+ }
16
+ has(id) {
17
+ return this.#set.has(id);
18
+ }
19
+ }
20
+ class IndexedTree {
21
+ size;
22
+ roots;
23
+ #parent;
24
+ #children;
25
+ #depth;
26
+ #preorder;
27
+ #postorder;
28
+ constructor(roots, parent, children, depth, preorder, postorder) {
29
+ this.size = preorder.length;
30
+ this.roots = new IndexedSequence(roots);
31
+ this.#parent = parent;
32
+ this.#children = children;
33
+ this.#depth = depth;
34
+ this.#preorder = freezeArray(preorder);
35
+ this.#postorder = freezeArray(postorder);
36
+ Object.freeze(this);
37
+ }
38
+ has(id) {
39
+ return this.#parent.has(id);
40
+ }
41
+ parentOf(id) {
42
+ return this.#parent.get(id) ?? null;
43
+ }
44
+ childrenOf(id) {
45
+ const children = this.#children.get(id);
46
+ return children === undefined ? null : new IndexedSequence(children);
47
+ }
48
+ isLeaf(id) {
49
+ const children = this.#children.get(id);
50
+ return children === undefined ? null : children.length === 0;
51
+ }
52
+ depthOf(id) {
53
+ return this.#depth.get(id) ?? null;
54
+ }
55
+ ancestorsOf(id) {
56
+ if (!this.#parent.has(id))
57
+ return null;
58
+ const result = [];
59
+ let current = this.#parent.get(id) ?? null;
60
+ while (current !== null) {
61
+ result.push(current);
62
+ current = this.#parent.get(current) ?? null;
63
+ }
64
+ return freezeArray(result);
65
+ }
66
+ preorder() {
67
+ return new IndexedSequence(this.#preorder);
68
+ }
69
+ postorder() {
70
+ return new IndexedSequence(this.#postorder);
71
+ }
72
+ normalizeExpansion(expanded) {
73
+ const requested = new Set(expanded);
74
+ const normalized = this.#preorder.filter((id) => requested.has(id) && (this.#children.get(id)?.length ?? 0) > 0);
75
+ return new NormalizedExpansion(normalized);
76
+ }
77
+ visible(expansion) {
78
+ const normalized = expansion instanceof NormalizedExpansion
79
+ ? expansion
80
+ : this.normalizeExpansion(isExpansion(expansion) ? expansion.ids : expansion);
81
+ const result = [];
82
+ const stack = [...this.roots.ids].reverse();
83
+ while (stack.length > 0) {
84
+ const id = stack.pop();
85
+ if (id === undefined)
86
+ continue;
87
+ result.push(id);
88
+ if (!normalized.has(id))
89
+ continue;
90
+ const children = this.#children.get(id) ?? [];
91
+ for (let index = children.length - 1; index >= 0; index -= 1) {
92
+ const child = children[index];
93
+ if (child !== undefined)
94
+ stack.push(child);
95
+ }
96
+ }
97
+ return new IndexedSequence(result);
98
+ }
99
+ }
100
+ export function createTree(nodes, options = {}) {
101
+ return unwrap(tryCreateTree(nodes, options));
102
+ }
103
+ export function tryCreateTree(nodes, options = {}) {
104
+ const maxItems = options.maxItems ?? 100_000;
105
+ const maxDepth = options.maxDepth ?? 1_024;
106
+ const maxIDCodeUnits = options.maxIDCodeUnits ?? DEFAULT_MAX_ID_CODE_UNITS;
107
+ for (const [value, name] of [
108
+ [maxItems, 'maxItems'],
109
+ [maxDepth, 'maxDepth'],
110
+ [maxIDCodeUnits, 'maxIDCodeUnits'],
111
+ ]) {
112
+ const error = validateSafeCeiling(value, name);
113
+ if (error !== null)
114
+ return { ok: false, error };
115
+ }
116
+ if (maxIDCodeUnits < 1) {
117
+ return fail('construction', 'invalid-max-id-code-units', 'maxIDCodeUnits must be a positive safe integer.', { maxIDCodeUnits });
118
+ }
119
+ if (nodes.length > maxItems) {
120
+ return fail('resource-rejection', 'item-ceiling-exceeded', 'Tree exceeds maxItems.', {
121
+ size: nodes.length,
122
+ maxItems,
123
+ });
124
+ }
125
+ const parent = new Map();
126
+ const ids = [];
127
+ for (let index = 0; index < nodes.length; index += 1) {
128
+ const node = nodes[index];
129
+ if (node === undefined) {
130
+ return fail('construction', 'invalid-node', 'Tree input must not contain sparse or missing nodes.', { index });
131
+ }
132
+ const idError = validateStableID(node.id, maxIDCodeUnits);
133
+ if (idError !== null)
134
+ return { ok: false, error: idError };
135
+ if (parent.has(node.id)) {
136
+ return fail('construction', 'duplicate-id', 'Tree identities must be unique.', {
137
+ id: node.id,
138
+ index,
139
+ });
140
+ }
141
+ if (node.parentID === node.id) {
142
+ return fail('construction', 'self-parent', 'A tree node cannot be its own parent.', {
143
+ id: node.id,
144
+ });
145
+ }
146
+ parent.set(node.id, node.parentID);
147
+ ids.push(node.id);
148
+ }
149
+ for (const id of ids) {
150
+ const parentID = parent.get(id) ?? null;
151
+ if (parentID !== null && !parent.has(parentID)) {
152
+ return fail('construction', 'missing-parent', 'Every non-root parent must exist.', {
153
+ id,
154
+ parentID,
155
+ });
156
+ }
157
+ }
158
+ const childrenMutable = new Map();
159
+ for (const id of ids)
160
+ childrenMutable.set(id, []);
161
+ const roots = [];
162
+ for (const id of ids) {
163
+ const parentID = parent.get(id) ?? null;
164
+ if (parentID === null)
165
+ roots.push(id);
166
+ else
167
+ childrenMutable.get(parentID)?.push(id);
168
+ }
169
+ const marks = new Map();
170
+ const depth = new Map();
171
+ const preorder = [];
172
+ const postorder = [];
173
+ for (const root of roots) {
174
+ const stack = [{ id: root, depth: 0, nextChild: 0 }];
175
+ while (stack.length > 0) {
176
+ const frame = stack[stack.length - 1];
177
+ if (frame === undefined)
178
+ break;
179
+ if (frame.nextChild === 0) {
180
+ const mark = marks.get(frame.id) ?? 0;
181
+ if (mark === 1) {
182
+ return fail('construction', 'cycle', 'Tree parent relation must be acyclic.', {
183
+ id: frame.id,
184
+ });
185
+ }
186
+ if (mark === 2) {
187
+ stack.pop();
188
+ continue;
189
+ }
190
+ if (frame.depth > maxDepth) {
191
+ return fail('resource-rejection', 'depth-ceiling-exceeded', 'Tree exceeds maxDepth.', {
192
+ id: frame.id,
193
+ depth: frame.depth,
194
+ maxDepth,
195
+ });
196
+ }
197
+ marks.set(frame.id, 1);
198
+ depth.set(frame.id, frame.depth);
199
+ preorder.push(frame.id);
200
+ }
201
+ const children = childrenMutable.get(frame.id) ?? [];
202
+ const child = children[frame.nextChild];
203
+ if (child !== undefined) {
204
+ frame.nextChild += 1;
205
+ const childMark = marks.get(child) ?? 0;
206
+ if (childMark === 1) {
207
+ return fail('construction', 'cycle', 'Tree parent relation must be acyclic.', {
208
+ id: child,
209
+ });
210
+ }
211
+ if (childMark === 0) {
212
+ stack.push({ id: child, depth: frame.depth + 1, nextChild: 0 });
213
+ }
214
+ continue;
215
+ }
216
+ marks.set(frame.id, 2);
217
+ postorder.push(frame.id);
218
+ stack.pop();
219
+ }
220
+ }
221
+ if (preorder.length !== ids.length) {
222
+ const unvisited = ids.find((id) => (marks.get(id) ?? 0) !== 2);
223
+ return fail('construction', 'cycle', 'Every tree node must be reachable from a root.', {
224
+ ...(unvisited === undefined ? {} : { id: unvisited }),
225
+ });
226
+ }
227
+ const children = new Map();
228
+ for (const [id, values] of childrenMutable)
229
+ children.set(id, freezeArray(values));
230
+ return ok(new IndexedTree(roots, parent, children, depth, preorder, postorder));
231
+ }
232
+ function isExpansion(value) {
233
+ return (typeof value === 'object' &&
234
+ value !== null &&
235
+ 'ids' in value &&
236
+ Array.isArray(value.ids));
237
+ }
238
+ //# sourceMappingURL=tree.js.map