@oasys/oecs 0.5.4 → 0.6.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 (510) hide show
  1. package/CHANGELOG.md +1223 -266
  2. package/README.md +217 -112
  3. package/dist/core/ecs/access_check.d.cts +29 -29
  4. package/dist/core/ecs/access_check.d.ts +29 -29
  5. package/dist/core/ecs/access_check.d.ts.map +1 -1
  6. package/dist/core/ecs/archetype.d.cts +217 -209
  7. package/dist/core/ecs/archetype.d.ts +217 -209
  8. package/dist/core/ecs/archetype.d.ts.map +1 -1
  9. package/dist/core/ecs/archetype_closure.d.cts +23 -0
  10. package/dist/core/ecs/archetype_closure.d.ts +23 -0
  11. package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
  12. package/dist/core/ecs/archetype_graph.d.cts +33 -33
  13. package/dist/core/ecs/archetype_graph.d.ts +33 -33
  14. package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
  15. package/dist/core/ecs/archetype_types.d.cts +55 -0
  16. package/dist/core/ecs/archetype_types.d.ts +55 -0
  17. package/dist/core/ecs/archetype_types.d.ts.map +1 -0
  18. package/dist/core/ecs/change_feed.d.cts +53 -0
  19. package/dist/core/ecs/change_feed.d.ts +53 -0
  20. package/dist/core/ecs/change_feed.d.ts.map +1 -0
  21. package/dist/core/ecs/changed_query.d.cts +36 -0
  22. package/dist/core/ecs/changed_query.d.ts +36 -0
  23. package/dist/core/ecs/changed_query.d.ts.map +1 -0
  24. package/dist/core/ecs/chunk_columns.d.cts +49 -0
  25. package/dist/core/ecs/chunk_columns.d.ts +49 -0
  26. package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
  27. package/dist/core/ecs/command_log.d.cts +26 -26
  28. package/dist/core/ecs/command_log.d.ts +26 -26
  29. package/dist/core/ecs/command_log.d.ts.map +1 -1
  30. package/dist/core/ecs/component.d.cts +43 -42
  31. package/dist/core/ecs/component.d.ts +43 -42
  32. package/dist/core/ecs/component.d.ts.map +1 -1
  33. package/dist/core/ecs/component_registry.d.cts +53 -0
  34. package/dist/core/ecs/component_registry.d.ts +53 -0
  35. package/dist/core/ecs/component_registry.d.ts.map +1 -0
  36. package/dist/core/ecs/compute_backend.d.cts +18 -7
  37. package/dist/core/ecs/compute_backend.d.ts +18 -7
  38. package/dist/core/ecs/compute_backend.d.ts.map +1 -1
  39. package/dist/core/ecs/deferred_commands.d.cts +15 -14
  40. package/dist/core/ecs/deferred_commands.d.ts +15 -14
  41. package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
  42. package/dist/core/ecs/dispatch_trace.d.cts +32 -31
  43. package/dist/core/ecs/dispatch_trace.d.ts +32 -31
  44. package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
  45. package/dist/core/ecs/ecs.d.cts +289 -270
  46. package/dist/core/ecs/ecs.d.ts +289 -270
  47. package/dist/core/ecs/ecs.d.ts.map +1 -1
  48. package/dist/core/ecs/ecs_memory.d.cts +134 -136
  49. package/dist/core/ecs/ecs_memory.d.ts +134 -136
  50. package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
  51. package/dist/core/ecs/ecs_options.d.cts +89 -0
  52. package/dist/core/ecs/ecs_options.d.ts +89 -0
  53. package/dist/core/ecs/ecs_options.d.ts.map +1 -0
  54. package/dist/core/ecs/entity.d.cts +4 -4
  55. package/dist/core/ecs/entity.d.ts +4 -4
  56. package/dist/core/ecs/entity_allocator.d.cts +20 -18
  57. package/dist/core/ecs/entity_allocator.d.ts +20 -18
  58. package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
  59. package/dist/core/ecs/event.d.cts +36 -22
  60. package/dist/core/ecs/event.d.ts +36 -22
  61. package/dist/core/ecs/event.d.ts.map +1 -1
  62. package/dist/core/ecs/facades.d.cts +12 -126
  63. package/dist/core/ecs/facades.d.ts +12 -126
  64. package/dist/core/ecs/facades.d.ts.map +1 -1
  65. package/dist/core/ecs/frame_stepper.d.cts +12 -12
  66. package/dist/core/ecs/frame_stepper.d.ts +12 -12
  67. package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
  68. package/dist/core/ecs/frame_trace.d.cts +32 -32
  69. package/dist/core/ecs/frame_trace.d.ts +32 -32
  70. package/dist/core/ecs/frame_trace.d.ts.map +1 -1
  71. package/dist/core/ecs/host_commands.d.cts +103 -85
  72. package/dist/core/ecs/host_commands.d.ts +103 -85
  73. package/dist/core/ecs/host_commands.d.ts.map +1 -1
  74. package/dist/core/ecs/index.d.cts +21 -11
  75. package/dist/core/ecs/index.d.ts +21 -11
  76. package/dist/core/ecs/index.d.ts.map +1 -1
  77. package/dist/core/ecs/observer.d.cts +39 -120
  78. package/dist/core/ecs/observer.d.ts +39 -120
  79. package/dist/core/ecs/observer.d.ts.map +1 -1
  80. package/dist/core/ecs/phase.d.cts +79 -0
  81. package/dist/core/ecs/phase.d.ts +79 -0
  82. package/dist/core/ecs/phase.d.ts.map +1 -0
  83. package/dist/core/ecs/plugin.d.cts +125 -0
  84. package/dist/core/ecs/plugin.d.ts +125 -0
  85. package/dist/core/ecs/plugin.d.ts.map +1 -0
  86. package/dist/core/ecs/plugin_slots.d.cts +26 -0
  87. package/dist/core/ecs/plugin_slots.d.ts +26 -0
  88. package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
  89. package/dist/core/ecs/query.d.cts +208 -578
  90. package/dist/core/ecs/query.d.ts +208 -578
  91. package/dist/core/ecs/query.d.ts.map +1 -1
  92. package/dist/core/ecs/query_cache.d.cts +130 -0
  93. package/dist/core/ecs/query_cache.d.ts +130 -0
  94. package/dist/core/ecs/query_cache.d.ts.map +1 -0
  95. package/dist/core/ecs/query_registry.d.cts +47 -0
  96. package/dist/core/ecs/query_registry.d.ts +47 -0
  97. package/dist/core/ecs/query_registry.d.ts.map +1 -0
  98. package/dist/core/ecs/query_terms.d.cts +126 -0
  99. package/dist/core/ecs/query_terms.d.ts +126 -0
  100. package/dist/core/ecs/query_terms.d.ts.map +1 -0
  101. package/dist/core/ecs/ref.d.cts +100 -39
  102. package/dist/core/ecs/ref.d.ts +100 -39
  103. package/dist/core/ecs/ref.d.ts.map +1 -1
  104. package/dist/core/ecs/relation.d.cts +101 -182
  105. package/dist/core/ecs/relation.d.ts +101 -182
  106. package/dist/core/ecs/relation.d.ts.map +1 -1
  107. package/dist/core/ecs/resource.d.cts +13 -13
  108. package/dist/core/ecs/resource.d.ts +13 -13
  109. package/dist/core/ecs/resource_registry.d.cts +5 -5
  110. package/dist/core/ecs/resource_registry.d.ts +5 -5
  111. package/dist/core/ecs/resource_registry.d.ts.map +1 -1
  112. package/dist/core/ecs/row_kinds.d.cts +24 -0
  113. package/dist/core/ecs/row_kinds.d.ts +24 -0
  114. package/dist/core/ecs/row_kinds.d.ts.map +1 -0
  115. package/dist/core/ecs/run_condition.d.cts +23 -23
  116. package/dist/core/ecs/run_condition.d.ts +23 -23
  117. package/dist/core/ecs/run_condition.d.ts.map +1 -1
  118. package/dist/core/ecs/schedule.d.cts +91 -120
  119. package/dist/core/ecs/schedule.d.ts +91 -120
  120. package/dist/core/ecs/schedule.d.ts.map +1 -1
  121. package/dist/core/ecs/schedule_plan.d.cts +33 -0
  122. package/dist/core/ecs/schedule_plan.d.ts +33 -0
  123. package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
  124. package/dist/core/ecs/snapshot.d.cts +77 -0
  125. package/dist/core/ecs/snapshot.d.ts +77 -0
  126. package/dist/core/ecs/snapshot.d.ts.map +1 -0
  127. package/dist/core/ecs/snapshot_mount.d.cts +42 -0
  128. package/dist/core/ecs/snapshot_mount.d.ts +42 -0
  129. package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
  130. package/dist/core/ecs/sparse_store.d.cts +108 -51
  131. package/dist/core/ecs/sparse_store.d.ts +108 -51
  132. package/dist/core/ecs/sparse_store.d.ts.map +1 -1
  133. package/dist/core/ecs/store.d.cts +527 -473
  134. package/dist/core/ecs/store.d.ts +527 -473
  135. package/dist/core/ecs/store.d.ts.map +1 -1
  136. package/dist/core/ecs/store_layout_listener.d.cts +6 -6
  137. package/dist/core/ecs/store_layout_listener.d.ts +6 -6
  138. package/dist/core/ecs/store_types.d.cts +122 -0
  139. package/dist/core/ecs/store_types.d.ts +122 -0
  140. package/dist/core/ecs/store_types.d.ts.map +1 -0
  141. package/dist/core/ecs/system.d.cts +146 -61
  142. package/dist/core/ecs/system.d.ts +146 -61
  143. package/dist/core/ecs/system.d.ts.map +1 -1
  144. package/dist/core/ecs/system_context.d.cts +296 -0
  145. package/dist/core/ecs/system_context.d.ts +296 -0
  146. package/dist/core/ecs/system_context.d.ts.map +1 -0
  147. package/dist/core/ecs/system_set.d.cts +48 -0
  148. package/dist/core/ecs/system_set.d.ts +48 -0
  149. package/dist/core/ecs/system_set.d.ts.map +1 -0
  150. package/dist/core/ecs/utils/arrays.d.cts +15 -1
  151. package/dist/core/ecs/utils/arrays.d.ts +15 -1
  152. package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
  153. package/dist/core/ecs/utils/error.d.cts +82 -6
  154. package/dist/core/ecs/utils/error.d.ts +82 -6
  155. package/dist/core/ecs/utils/error.d.ts.map +1 -1
  156. package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
  157. package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
  158. package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
  159. package/dist/core/restore_errors.d.cts +30 -0
  160. package/dist/core/restore_errors.d.ts +30 -0
  161. package/dist/core/restore_errors.d.ts.map +1 -0
  162. package/dist/core/store/action_ring.d.cts +44 -44
  163. package/dist/core/store/action_ring.d.ts +44 -44
  164. package/dist/core/store/action_ring.d.ts.map +1 -1
  165. package/dist/core/store/allocator.d.cts +149 -95
  166. package/dist/core/store/allocator.d.ts +149 -95
  167. package/dist/core/store/allocator.d.ts.map +1 -1
  168. package/dist/core/store/buffer_backed_column.d.cts +17 -17
  169. package/dist/core/store/buffer_backed_column.d.ts +17 -17
  170. package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
  171. package/dist/core/store/column_store.d.cts +124 -86
  172. package/dist/core/store/column_store.d.ts +124 -86
  173. package/dist/core/store/column_store.d.ts.map +1 -1
  174. package/dist/core/store/command_dispatch.d.cts +14 -15
  175. package/dist/core/store/command_dispatch.d.ts +14 -15
  176. package/dist/core/store/command_dispatch.d.ts.map +1 -1
  177. package/dist/core/store/command_ring.d.cts +36 -39
  178. package/dist/core/store/command_ring.d.ts +36 -39
  179. package/dist/core/store/command_ring.d.ts.map +1 -1
  180. package/dist/core/store/descriptor.d.cts +34 -17
  181. package/dist/core/store/descriptor.d.ts +34 -17
  182. package/dist/core/store/descriptor.d.ts.map +1 -1
  183. package/dist/core/store/entity_index.d.cts +34 -35
  184. package/dist/core/store/entity_index.d.ts +34 -35
  185. package/dist/core/store/entity_index.d.ts.map +1 -1
  186. package/dist/core/store/event_ring.d.cts +36 -38
  187. package/dist/core/store/event_ring.d.ts +36 -38
  188. package/dist/core/store/event_ring.d.ts.map +1 -1
  189. package/dist/core/store/extend.d.cts +13 -7
  190. package/dist/core/store/extend.d.ts +13 -7
  191. package/dist/core/store/extend.d.ts.map +1 -1
  192. package/dist/core/store/grow.d.cts +2 -2
  193. package/dist/core/store/grow.d.ts +2 -2
  194. package/dist/core/store/grow.d.ts.map +1 -1
  195. package/dist/core/store/header.d.cts +31 -27
  196. package/dist/core/store/header.d.ts +31 -27
  197. package/dist/core/store/header.d.ts.map +1 -1
  198. package/dist/core/store/index.d.cts +10 -10
  199. package/dist/core/store/index.d.ts +10 -10
  200. package/dist/core/store/index.d.ts.map +1 -1
  201. package/dist/core/store/layout_ops.d.cts +71 -62
  202. package/dist/core/store/layout_ops.d.ts +71 -62
  203. package/dist/core/store/layout_ops.d.ts.map +1 -1
  204. package/dist/core/store/region_table.d.cts +28 -21
  205. package/dist/core/store/region_table.d.ts +28 -21
  206. package/dist/core/store/region_table.d.ts.map +1 -1
  207. package/dist/core/store/snapshot.d.cts +31 -16
  208. package/dist/core/store/snapshot.d.ts +31 -16
  209. package/dist/core/store/snapshot.d.ts.map +1 -1
  210. package/dist/core/store/state_hash.d.cts +12 -12
  211. package/dist/core/store/state_hash.d.ts +12 -12
  212. package/dist/core/store/state_hash.d.ts.map +1 -1
  213. package/dist/core/store/store_regions.d.cts +10 -10
  214. package/dist/core/store/store_regions.d.ts +10 -10
  215. package/dist/core/store/store_regions.d.ts.map +1 -1
  216. package/dist/core/store/vendored_abi/abi.d.cts +27 -2
  217. package/dist/core/store/vendored_abi/abi.d.ts +27 -2
  218. package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
  219. package/dist/host_commands-B2KMx8O2.cjs +1 -0
  220. package/dist/host_commands-ClVPvhSa.cjs +2 -0
  221. package/dist/host_commands-CwxVQS1z.js +1524 -0
  222. package/dist/host_commands-nJvTy88E.js +1667 -0
  223. package/dist/index.cjs +1 -1
  224. package/dist/index.d.cts +15 -10
  225. package/dist/index.d.ts +15 -10
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.development.cjs +1 -1
  228. package/dist/index.development.js +5804 -5203
  229. package/dist/index.js +5323 -4764
  230. package/dist/internal.cjs +2 -2
  231. package/dist/internal.d.cts +5 -2
  232. package/dist/internal.d.ts +5 -2
  233. package/dist/internal.d.ts.map +1 -1
  234. package/dist/internal.development.cjs +1 -1
  235. package/dist/internal.development.js +70 -20
  236. package/dist/internal.js +138 -83
  237. package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
  238. package/dist/plugins/abi-NP8pNxpd.js +42 -0
  239. package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
  240. package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
  241. package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
  242. package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
  243. package/dist/{extensions → plugins}/editor/editor.d.cts +54 -54
  244. package/dist/{extensions → plugins}/editor/editor.d.ts +54 -54
  245. package/dist/plugins/editor/editor.d.ts.map +1 -0
  246. package/dist/{extensions → plugins}/editor/field_handle.d.cts +12 -12
  247. package/dist/{extensions → plugins}/editor/field_handle.d.ts +12 -12
  248. package/dist/plugins/editor/field_handle.d.ts.map +1 -0
  249. package/dist/plugins/editor/index.d.cts +22 -0
  250. package/dist/plugins/editor/index.d.ts +22 -0
  251. package/dist/plugins/editor/index.d.ts.map +1 -0
  252. package/dist/plugins/editor.cjs +1 -0
  253. package/dist/plugins/editor.d.cts +1 -0
  254. package/dist/plugins/editor.d.ts +1 -0
  255. package/dist/plugins/editor.development.cjs +1 -0
  256. package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +81 -64
  257. package/dist/{extensions/editor/index.js → plugins/editor.js} +81 -64
  258. package/dist/plugins/events/event_channel.d.cts +13 -0
  259. package/dist/plugins/events/event_channel.d.ts +13 -0
  260. package/dist/plugins/events/event_channel.d.ts.map +1 -0
  261. package/dist/plugins/events/event_registry.d.cts +22 -0
  262. package/dist/plugins/events/event_registry.d.ts +22 -0
  263. package/dist/plugins/events/event_registry.d.ts.map +1 -0
  264. package/dist/plugins/events/facade.d.cts +26 -0
  265. package/dist/plugins/events/facade.d.ts +26 -0
  266. package/dist/plugins/events/facade.d.ts.map +1 -0
  267. package/dist/plugins/events/index.d.cts +10 -0
  268. package/dist/plugins/events/index.d.ts +10 -0
  269. package/dist/plugins/events/index.d.ts.map +1 -0
  270. package/dist/plugins/events.cjs +1 -0
  271. package/dist/plugins/events.d.cts +1 -0
  272. package/dist/plugins/events.d.ts +1 -0
  273. package/dist/plugins/events.development.cjs +1 -0
  274. package/dist/plugins/events.development.js +174 -0
  275. package/dist/plugins/events.js +159 -0
  276. package/dist/plugins/observers/index.d.cts +23 -0
  277. package/dist/plugins/observers/index.d.ts +23 -0
  278. package/dist/plugins/observers/index.d.ts.map +1 -0
  279. package/dist/plugins/observers/observer_registry.d.cts +101 -0
  280. package/dist/plugins/observers/observer_registry.d.ts +101 -0
  281. package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
  282. package/dist/plugins/observers.cjs +1 -0
  283. package/dist/plugins/observers.d.cts +1 -0
  284. package/dist/plugins/observers.d.ts +1 -0
  285. package/dist/plugins/observers.development.cjs +1 -0
  286. package/dist/plugins/observers.development.js +431 -0
  287. package/dist/plugins/observers.js +403 -0
  288. package/dist/plugins/relation_store-BsoegrZh.js +313 -0
  289. package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
  290. package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
  291. package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
  292. package/dist/plugins/relations/builtin_relations.d.cts +48 -0
  293. package/dist/plugins/relations/builtin_relations.d.ts +48 -0
  294. package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
  295. package/dist/plugins/relations/facade.d.cts +73 -0
  296. package/dist/plugins/relations/facade.d.ts +73 -0
  297. package/dist/plugins/relations/facade.d.ts.map +1 -0
  298. package/dist/plugins/relations/index.d.cts +11 -0
  299. package/dist/plugins/relations/index.d.ts +11 -0
  300. package/dist/plugins/relations/index.d.ts.map +1 -0
  301. package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +85 -97
  302. package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +85 -97
  303. package/dist/plugins/relations/relation_service.d.ts.map +1 -0
  304. package/dist/plugins/relations/relation_store.d.cts +177 -0
  305. package/dist/plugins/relations/relation_store.d.ts +177 -0
  306. package/dist/plugins/relations/relation_store.d.ts.map +1 -0
  307. package/dist/plugins/relations.cjs +1 -0
  308. package/dist/plugins/relations.d.cts +1 -0
  309. package/dist/plugins/relations.d.ts +1 -0
  310. package/dist/plugins/relations.development.cjs +1 -0
  311. package/dist/plugins/relations.development.js +603 -0
  312. package/dist/plugins/relations.js +553 -0
  313. package/dist/plugins/snapshots/index.d.cts +33 -0
  314. package/dist/plugins/snapshots/index.d.ts +33 -0
  315. package/dist/plugins/snapshots/index.d.ts.map +1 -0
  316. package/dist/plugins/snapshots/resume.d.cts +57 -0
  317. package/dist/plugins/snapshots/resume.d.ts +57 -0
  318. package/dist/plugins/snapshots/resume.d.ts.map +1 -0
  319. package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
  320. package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
  321. package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
  322. package/dist/plugins/snapshots.cjs +1 -0
  323. package/dist/plugins/snapshots.d.cts +1 -0
  324. package/dist/plugins/snapshots.d.ts +1 -0
  325. package/dist/plugins/snapshots.development.cjs +1 -0
  326. package/dist/plugins/snapshots.development.js +737 -0
  327. package/dist/plugins/snapshots.js +737 -0
  328. package/dist/plugins/solid/index.d.cts +8 -0
  329. package/dist/plugins/solid/index.d.ts +8 -0
  330. package/dist/plugins/solid/index.d.ts.map +1 -0
  331. package/dist/plugins/solid/solid.d.cts +97 -0
  332. package/dist/plugins/solid/solid.d.ts +97 -0
  333. package/dist/plugins/solid/solid.d.ts.map +1 -0
  334. package/dist/plugins/solid.cjs +1 -0
  335. package/dist/plugins/solid.d.cts +1 -0
  336. package/dist/plugins/solid.d.ts +1 -0
  337. package/dist/plugins/solid.development.cjs +1 -0
  338. package/dist/plugins/solid.development.js +319 -0
  339. package/dist/plugins/solid.js +319 -0
  340. package/dist/plugins/workers/index.d.cts +75 -0
  341. package/dist/plugins/workers/index.d.ts +75 -0
  342. package/dist/plugins/workers/index.d.ts.map +1 -0
  343. package/dist/plugins/workers/node_threads.d.cts +25 -0
  344. package/dist/plugins/workers/node_threads.d.ts +25 -0
  345. package/dist/plugins/workers/node_threads.d.ts.map +1 -0
  346. package/dist/plugins/workers/plan.d.cts +61 -0
  347. package/dist/plugins/workers/plan.d.ts +61 -0
  348. package/dist/plugins/workers/plan.d.ts.map +1 -0
  349. package/dist/plugins/workers/pool.d.cts +144 -0
  350. package/dist/plugins/workers/pool.d.ts +144 -0
  351. package/dist/plugins/workers/pool.d.ts.map +1 -0
  352. package/dist/plugins/workers/protocol.d.cts +112 -0
  353. package/dist/plugins/workers/protocol.d.ts +112 -0
  354. package/dist/plugins/workers/protocol.d.ts.map +1 -0
  355. package/dist/plugins/workers/worker_bind.d.cts +64 -0
  356. package/dist/plugins/workers/worker_bind.d.ts +64 -0
  357. package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
  358. package/dist/plugins/workers/worker_loop.d.cts +14 -0
  359. package/dist/plugins/workers/worker_loop.d.ts +14 -0
  360. package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
  361. package/dist/plugins/workers.cjs +1 -0
  362. package/dist/plugins/workers.d.cts +1 -0
  363. package/dist/plugins/workers.d.ts +1 -0
  364. package/dist/plugins/workers.development.cjs +1 -0
  365. package/dist/plugins/workers.development.js +596 -0
  366. package/dist/plugins/workers.js +474 -0
  367. package/dist/primitives.cjs +1 -1
  368. package/dist/primitives.d.cts +4 -4
  369. package/dist/primitives.d.ts +4 -4
  370. package/dist/primitives.development.cjs +1 -1
  371. package/dist/primitives.development.js +66 -22
  372. package/dist/primitives.js +66 -22
  373. package/dist/shared-BKl12xF1.js +132 -0
  374. package/dist/shared-Dk-pACZT.cjs +1 -0
  375. package/dist/shared.cjs +1 -1
  376. package/dist/shared.d.cts +7 -7
  377. package/dist/shared.d.ts +7 -7
  378. package/dist/shared.d.ts.map +1 -1
  379. package/dist/shared.development.cjs +1 -1
  380. package/dist/shared.development.js +4 -3
  381. package/dist/shared.js +4 -3
  382. package/dist/topological_sort-Cc_yXqPT.js +346 -0
  383. package/dist/topological_sort-vp1imU6D.cjs +1 -0
  384. package/dist/type_primitives/assertions.d.cts +12 -16
  385. package/dist/type_primitives/assertions.d.ts +12 -16
  386. package/dist/type_primitives/assertions.d.ts.map +1 -1
  387. package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
  388. package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
  389. package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
  390. package/dist/type_primitives/bitset/bitset.d.cts +7 -11
  391. package/dist/type_primitives/bitset/bitset.d.ts +7 -11
  392. package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
  393. package/dist/type_primitives/brand.d.cts +2 -7
  394. package/dist/type_primitives/brand.d.ts +2 -7
  395. package/dist/type_primitives/brand.d.ts.map +1 -1
  396. package/dist/type_primitives/error.d.cts +1 -2
  397. package/dist/type_primitives/error.d.ts +1 -2
  398. package/dist/type_primitives/error.d.ts.map +1 -1
  399. package/dist/type_primitives/index.d.cts +1 -1
  400. package/dist/type_primitives/index.d.ts +1 -1
  401. package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
  402. package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
  403. package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
  404. package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
  405. package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
  406. package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
  407. package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
  408. package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
  409. package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
  410. package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +16 -15
  411. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +16 -15
  412. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
  413. package/dist/utils/error.d.ts.map +1 -1
  414. package/dist/version.d.cts +3 -3
  415. package/dist/version.d.ts +3 -3
  416. package/dist/worker.cjs +1 -0
  417. package/dist/worker.d.cts +17 -0
  418. package/dist/worker.d.ts +17 -0
  419. package/dist/worker.d.ts.map +1 -0
  420. package/dist/worker.development.cjs +1 -0
  421. package/dist/worker.development.js +253 -0
  422. package/dist/worker.js +253 -0
  423. package/package.json +363 -191
  424. package/dist/core/ecs/builtin_relations.d.cts +0 -43
  425. package/dist/core/ecs/builtin_relations.d.ts +0 -43
  426. package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
  427. package/dist/core/ecs/event_registry.d.cts +0 -22
  428. package/dist/core/ecs/event_registry.d.ts +0 -22
  429. package/dist/core/ecs/event_registry.d.ts.map +0 -1
  430. package/dist/core/ecs/relation_service.d.ts.map +0 -1
  431. package/dist/core/ecs/resume.d.cts +0 -85
  432. package/dist/core/ecs/resume.d.ts +0 -85
  433. package/dist/core/ecs/resume.d.ts.map +0 -1
  434. package/dist/core/ecs/snapshot_service.d.cts +0 -94
  435. package/dist/core/ecs/snapshot_service.d.ts +0 -94
  436. package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
  437. package/dist/extensions/editor/editor.d.ts.map +0 -1
  438. package/dist/extensions/editor/field_handle.d.ts.map +0 -1
  439. package/dist/extensions/editor/index.cjs +0 -1
  440. package/dist/extensions/editor/index.d.cts +0 -21
  441. package/dist/extensions/editor/index.d.ts +0 -21
  442. package/dist/extensions/editor/index.d.ts.map +0 -1
  443. package/dist/extensions/editor/index.development.cjs +0 -1
  444. package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
  445. package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
  446. package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
  447. package/dist/extensions/reactive/index.cjs +0 -1
  448. package/dist/extensions/reactive/index.d.cts +0 -23
  449. package/dist/extensions/reactive/index.d.ts +0 -23
  450. package/dist/extensions/reactive/index.d.ts.map +0 -1
  451. package/dist/extensions/reactive/index.development.cjs +0 -1
  452. package/dist/extensions/reactive/index.development.js +0 -215
  453. package/dist/extensions/reactive/index.js +0 -215
  454. package/dist/extensions/solid/index.cjs +0 -1
  455. package/dist/extensions/solid/index.d.cts +0 -6
  456. package/dist/extensions/solid/index.d.ts +0 -6
  457. package/dist/extensions/solid/index.d.ts.map +0 -1
  458. package/dist/extensions/solid/index.development.cjs +0 -1
  459. package/dist/extensions/solid/index.development.js +0 -40
  460. package/dist/extensions/solid/index.js +0 -36
  461. package/dist/extensions/solid/kernel_solid.d.cts +0 -45
  462. package/dist/extensions/solid/kernel_solid.d.ts +0 -45
  463. package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
  464. package/dist/host_commands-BlR3oZ3x.js +0 -2406
  465. package/dist/host_commands-C2cpU3yC.cjs +0 -1
  466. package/dist/internal-BoxWl4dG.js +0 -2565
  467. package/dist/internal-CGBEwfeB.cjs +0 -2
  468. package/dist/interop-CT-REx0W.cjs +0 -1
  469. package/dist/interop-CcY6ASQc.js +0 -18
  470. package/dist/interop-DqxleBo7.js +0 -18
  471. package/dist/interop-T1HZ-Dpa.cjs +0 -1
  472. package/dist/kernel-Cz2Kxlwl.js +0 -240
  473. package/dist/kernel-DgyrLFjW.js +0 -227
  474. package/dist/kernel-sw7ScKWu.cjs +0 -1
  475. package/dist/kernel-yWV3XnAb.cjs +0 -1
  476. package/dist/reactive/array.d.cts +0 -24
  477. package/dist/reactive/array.d.ts +0 -24
  478. package/dist/reactive/array.d.ts.map +0 -1
  479. package/dist/reactive/index.cjs +0 -1
  480. package/dist/reactive/index.d.cts +0 -11
  481. package/dist/reactive/index.d.ts +0 -11
  482. package/dist/reactive/index.d.ts.map +0 -1
  483. package/dist/reactive/index.development.cjs +0 -1
  484. package/dist/reactive/index.development.js +0 -18
  485. package/dist/reactive/index.js +0 -18
  486. package/dist/reactive/interop.d.cts +0 -19
  487. package/dist/reactive/interop.d.ts +0 -19
  488. package/dist/reactive/interop.d.ts.map +0 -1
  489. package/dist/reactive/kernel.d.cts +0 -73
  490. package/dist/reactive/kernel.d.ts +0 -73
  491. package/dist/reactive/kernel.d.ts.map +0 -1
  492. package/dist/reactive/map.d.cts +0 -16
  493. package/dist/reactive/map.d.ts +0 -16
  494. package/dist/reactive/map.d.ts.map +0 -1
  495. package/dist/reactive/shallow.d.cts +0 -11
  496. package/dist/reactive/shallow.d.ts +0 -11
  497. package/dist/reactive/shallow.d.ts.map +0 -1
  498. package/dist/reactive/struct.d.cts +0 -10
  499. package/dist/reactive/struct.d.ts +0 -10
  500. package/dist/reactive/struct.d.ts.map +0 -1
  501. package/dist/shallow-Bs39EPh1.js +0 -150
  502. package/dist/shallow-C5YmTbtb.cjs +0 -1
  503. package/dist/shallow-CiFC70Dz.js +0 -159
  504. package/dist/shallow-DQ8aG51_.cjs +0 -1
  505. package/dist/shared-B4v0L1cw.js +0 -109
  506. package/dist/shared-DU78k0pU.cjs +0 -1
  507. package/dist/topological_sort-BDvEyb9W.cjs +0 -1
  508. package/dist/topological_sort-DK6EjpWa.js +0 -135
  509. package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
  510. package/dist/typed_arrays-DIVwVy5_.js +0 -258
@@ -0,0 +1,313 @@
1
+ import { SparseRestoreError as u } from "../index.js";
2
+ import { u as c } from "./assertions-gtDVfbnQ.js";
3
+ const z = -1;
4
+ Object.freeze(/* @__PURE__ */ Object.create(null));
5
+ const F = 31, E = 20, p = (1 << E) - 1, R = p, $ = F - E, y = (1 << $) - 1, S = y << E | R, B = (a, r) => c(r << E | a), f = (a) => a & p, G = "orphan", C = "target", O = Object.freeze({});
6
+ class U {
7
+ /** `true` → one target per source, held in the sparse field. `false` →
8
+ * a set of targets per source. The cardinality discriminant survives as a
9
+ * field because the snapshot header and the traversal and `targetOf`
10
+ * mode guards carry it. The forward mechanics stay virtual, never branched
11
+ * on it. */
12
+ exclusive;
13
+ /** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
14
+ * multi. Carries membership (and the target, when exclusive). */
15
+ sparse;
16
+ /** Cleanup policy applied to this relation's sources when a target is
17
+ * destroyed. `orphan` (the default) is a no-op, the link dangles
18
+ * safely. `Store` reads this at destroy-flush off `sourcesOf`. */
19
+ onDeleteTarget;
20
+ /** The backing sparse store instance. Owned for registration and liveness by
21
+ * `Store`, but the relation drives the forward and membership rows on it directly.
22
+ * That is the cardinality interaction this class now encapsulates. */
23
+ _store;
24
+ /** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
25
+ * the index, so a recycled target slot can't alias a dead target's sources.
26
+ * An entry is dropped the moment its set empties (`_unlinkReverse`). */
27
+ _reverse = /* @__PURE__ */ new Map();
28
+ constructor(r, t, e, s) {
29
+ this.exclusive = r, this.sparse = t, this._store = e, this.onDeleteTarget = s;
30
+ }
31
+ // --- shared reverse index (cardinality-agnostic) ---
32
+ /** Record that `src` points at `tgt` in the reverse index. */
33
+ _linkReverse(r, t) {
34
+ let e = this._reverse.get(r);
35
+ e === void 0 && (e = /* @__PURE__ */ new Set(), this._reverse.set(r, e)), e.add(t);
36
+ }
37
+ /** Drop the `src → tgt` edge from the reverse index, removing the target's
38
+ * entry entirely once its last source is gone (so a dead-target key doesn't
39
+ * linger with an empty set). */
40
+ _unlinkReverse(r, t) {
41
+ const e = this._reverse.get(r);
42
+ e !== void 0 && (e.delete(t), e.size === 0 && this._reverse.delete(r));
43
+ }
44
+ /** Drop every reverse-index entry whose **target** is no longer alive,
45
+ * returning the count dropped. The `orphan` policy intentionally
46
+ * leaves a destroyed target's reverse entry intact (the link dangles
47
+ * safely), so a long-lived source that orphan-points at a stream of
48
+ * short-lived targets and never re-targets or dies accumulates dead-target keys
49
+ * without bound. This is the reclaim primitive behind `ecs.relations.compact`,
50
+ * a cold path the host calls at scene and snapshot boundaries. It is
51
+ * cardinality-free (reverse-index only), so it lives on the base unchanged.
52
+ *
53
+ * Pure index reclaim: the **forward** links (the exclusive sparse target
54
+ * field, the multi forward set) are left untouched, so `targetOf` and
55
+ * `targetsOf` still return the dangling dead handle exactly as `orphan`
56
+ * promises. The reverse index is derived, so dropping a dead-target entry
57
+ * changes nothing observable except `sourcesOf` on that dead handle (which
58
+ * goes from the dangling sources to `[]`, meaningless either way, the target
59
+ * is gone) and is faithfully rebuilt by snapshot and restore from the surviving
60
+ * forward links. Only the **target** role can leak here: a destroyed *source*
61
+ * is already unlinked from every reverse set by `purgeSource`, so a live
62
+ * target's set never holds a dead source. `isAlive` is supplied by `Store`,
63
+ * which owns entity liveness. Deleting during `Map` key iteration is
64
+ * well-defined, already-visited and not-yet-reached keys are unaffected. */
65
+ pruneDeadReverse(r) {
66
+ let t = 0;
67
+ for (const e of this._reverse.keys())
68
+ r(c(e)) || (this._reverse.delete(e), t++);
69
+ return t;
70
+ }
71
+ /** Sources that point at `tgt`, ascending by id (deterministic, cold-path
72
+ * sort), empty when none. */
73
+ sourcesOf(r) {
74
+ const t = this._reverse.get(r);
75
+ if (t === void 0 || t.size === 0) return [];
76
+ const e = new Array(t.size);
77
+ let s = 0;
78
+ return t.forEach((n) => {
79
+ e[s++] = c(n);
80
+ }), e.sort((n, o) => n - o), e;
81
+ }
82
+ /** Drop every derived side index, the reverse index and (for multi) the
83
+ * forward target sets. Restore path only (`restoreRelations`): the side
84
+ * indices are rebuilt from scratch, so they're cleared first to stay
85
+ * idempotent when restoring into a dirty world. The backing sparse store is
86
+ * cleared separately by `restoreSparseStores`. */
87
+ resetIndices() {
88
+ this._reverse.clear(), this._resetForward();
89
+ }
90
+ }
91
+ class M extends U {
92
+ constructor(r, t, e) {
93
+ super(!0, r, t, e);
94
+ }
95
+ _resetForward() {
96
+ }
97
+ link(r, t) {
98
+ const e = f(r), s = this._store.getField(e, 0);
99
+ if (s !== void 0) {
100
+ if (s === t) return;
101
+ this._unlinkReverse(c(s), r);
102
+ }
103
+ this._store.setRow(e, { [C]: t }), this._linkReverse(t, r);
104
+ }
105
+ unlink(r, t) {
106
+ const e = f(r), s = this._store.getField(e, 0);
107
+ s !== void 0 && (t !== void 0 && s !== t || (this._unlinkReverse(c(s), r), this._store.remove(e)));
108
+ }
109
+ purgeSource(r) {
110
+ const t = f(r), e = this._store.getField(t, 0);
111
+ e !== void 0 && this._unlinkReverse(c(e), r);
112
+ }
113
+ singleTargetAt(r) {
114
+ const t = this._store.getField(r, 0);
115
+ return t === void 0 ? void 0 : c(t);
116
+ }
117
+ targetsAt(r) {
118
+ const t = this._store.getField(r, 0);
119
+ return t === void 0 ? [] : [c(t)];
120
+ }
121
+ hasIndex(r) {
122
+ return this._store.has(r);
123
+ }
124
+ forEachCanonicalTargetSet(r) {
125
+ }
126
+ forEachCanonicalPair(r, t) {
127
+ const e = this._store.canonicalIndices();
128
+ for (let s = 0; s < e.length; s++) {
129
+ const n = e[s];
130
+ t(r(n), c(this._store.getField(n, 0)));
131
+ }
132
+ }
133
+ rebuildReverse(r) {
134
+ const t = this._store.indices;
135
+ for (let e = 0; e < t.length; e++) {
136
+ const s = t[e];
137
+ this._linkReverse(c(this._store.getField(s, 0)), r(s));
138
+ }
139
+ }
140
+ restoreAddTarget() {
141
+ throw new u(
142
+ "exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
143
+ );
144
+ }
145
+ }
146
+ class b extends U {
147
+ /** source entity **index** → set of target `EntityID`s. Keyed by source index
148
+ * so destroy-purge, which has the freed index, can drop it in O(1). An
149
+ * entry is removed the moment its set empties. */
150
+ _forward = /* @__PURE__ */ new Map();
151
+ constructor(r, t, e) {
152
+ super(!1, r, t, e);
153
+ }
154
+ _resetForward() {
155
+ this._forward.clear();
156
+ }
157
+ link(r, t) {
158
+ const e = f(r);
159
+ let s = this._forward.get(e);
160
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s), this._store.setRow(e, O)), s.add(t), this._linkReverse(t, r);
161
+ }
162
+ unlink(r, t) {
163
+ const e = f(r), s = this._forward.get(e);
164
+ if (s !== void 0) {
165
+ if (t === void 0) {
166
+ this._forward.delete(e), s.forEach((n) => this._unlinkReverse(c(n), r)), this._store.remove(e);
167
+ return;
168
+ }
169
+ s.has(t) && (s.delete(t), this._unlinkReverse(t, r), s.size === 0 && (this._forward.delete(e), this._store.remove(e)));
170
+ }
171
+ }
172
+ purgeSource(r) {
173
+ const t = f(r), e = this._forward.get(t);
174
+ e !== void 0 && (this._forward.delete(t), e.forEach((s) => this._unlinkReverse(c(s), r)));
175
+ }
176
+ singleTargetAt() {
177
+ }
178
+ targetsAt(r) {
179
+ const t = this._forward.get(r);
180
+ if (t === void 0 || t.size === 0) return [];
181
+ const e = new Array(t.size);
182
+ let s = 0;
183
+ return t.forEach((n) => {
184
+ e[s++] = c(n);
185
+ }), e.sort((n, o) => n - o), e;
186
+ }
187
+ hasIndex(r) {
188
+ return this._store.has(r);
189
+ }
190
+ forEachCanonicalTargetSet(r) {
191
+ const t = Array.from(this._forward.keys()).sort((e, s) => e - s);
192
+ for (let e = 0; e < t.length; e++) {
193
+ const s = this.targetsAt(t[e]);
194
+ s.length !== 0 && r(t[e], s);
195
+ }
196
+ }
197
+ forEachCanonicalPair(r, t) {
198
+ this.forEachCanonicalTargetSet((e, s) => {
199
+ const n = r(e);
200
+ for (let o = 0; o < s.length; o++) t(n, s[o]);
201
+ });
202
+ }
203
+ rebuildReverse() {
204
+ }
205
+ restoreAddTarget(r, t, e) {
206
+ let s = this._forward.get(r);
207
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(r, s)), s.add(t), this._linkReverse(t, e);
208
+ }
209
+ }
210
+ function Y(a, r, t, e) {
211
+ return a ? new M(r, t, e) : new b(r, t, e);
212
+ }
213
+ const k = 4, m = 4, D = 8, w = 8;
214
+ function P(a) {
215
+ const r = new Array(a.length);
216
+ let t = 4;
217
+ for (let o = 0; o < a.length; o++) {
218
+ t += k;
219
+ const h = a[o];
220
+ if (h.exclusive) {
221
+ r[o] = null;
222
+ continue;
223
+ }
224
+ const i = [];
225
+ h.forEachCanonicalTargetSet((l, d) => i.push([l, d])), r[o] = i, t += m;
226
+ for (let l = 0; l < i.length; l++)
227
+ t += D + i[l][1].length * w;
228
+ }
229
+ const e = new Uint8Array(t), s = new DataView(e.buffer);
230
+ let n = 0;
231
+ s.setUint32(n, a.length, !0), n += 4;
232
+ for (let o = 0; o < a.length; o++) {
233
+ s.setUint32(n, a[o].exclusive ? 0 : 1, !0), n += 4;
234
+ const h = r[o];
235
+ if (h !== null) {
236
+ s.setUint32(n, h.length, !0), n += 4;
237
+ for (let i = 0; i < h.length; i++) {
238
+ const l = h[i][0], d = h[i][1];
239
+ s.setUint32(n, l, !0), n += 4, s.setUint32(n, d.length, !0), n += 4;
240
+ for (let _ = 0; _ < d.length; _++)
241
+ s.setFloat64(n, d[_], !0), n += w;
242
+ }
243
+ }
244
+ }
245
+ return e;
246
+ }
247
+ function j(a, r, t) {
248
+ const e = new DataView(r.buffer, r.byteOffset, r.byteLength), s = r.byteLength;
249
+ let n = 0;
250
+ const o = (i) => {
251
+ if (n + i > s)
252
+ throw new u(
253
+ `relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s - n}`
254
+ );
255
+ };
256
+ for (let i = 0; i < a.length; i++) a[i].resetIndices();
257
+ o(4);
258
+ const h = e.getUint32(n, !0);
259
+ if (n += 4, h !== a.length)
260
+ throw new u(
261
+ `relation count mismatch: snapshot=${h}, registered=${a.length}`
262
+ );
263
+ for (let i = 0; i < a.length; i++) {
264
+ const l = a[i];
265
+ o(k);
266
+ const d = e.getUint32(n, !0);
267
+ if (n += 4, d === 1 === l.exclusive)
268
+ throw new u(
269
+ `relation ${i} cardinality mismatch: snapshot ${d ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
270
+ );
271
+ if (l.exclusive) continue;
272
+ o(m);
273
+ const _ = e.getUint32(n, !0);
274
+ n += 4;
275
+ for (let T = 0; T < _; T++) {
276
+ o(D);
277
+ const g = e.getUint32(n, !0);
278
+ n += 4;
279
+ const x = e.getUint32(n, !0);
280
+ if (n += 4, g > R)
281
+ throw new u(
282
+ `relation ${i} source index ${g} exceeds MAX_INDEX (${R})`
283
+ );
284
+ o(x * w);
285
+ const N = t(g);
286
+ for (let A = 0; A < x; A++) {
287
+ const I = c(e.getFloat64(n, !0));
288
+ n += w;
289
+ const v = I;
290
+ if (!Number.isInteger(v) || v < 0 || v > S)
291
+ throw new u(
292
+ `relation ${i} target ${v} is not a well-formed packed EntityID (expected an integer in [0, ${S}])`
293
+ );
294
+ l.restoreAddTarget(g, I, N);
295
+ }
296
+ }
297
+ }
298
+ if (n !== s)
299
+ throw new u(
300
+ `relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
301
+ );
302
+ }
303
+ export {
304
+ G as D,
305
+ R as M,
306
+ C as R,
307
+ z as U,
308
+ Y as a,
309
+ B as c,
310
+ f as g,
311
+ j as r,
312
+ P as s
313
+ };
@@ -0,0 +1 @@
1
+ "use strict";const d=require("../index.cjs"),c=require("./assertions-z5GQd_bB.cjs"),y=-1;Object.freeze(Object.create(null));const O=31,R=20,p=(1<<R)-1,v=p,L=O-R,$=(1<<L)-1,x=$<<R|v,m=(a,r)=>c.unsafeCast(r<<R|a),f=a=>a&p,M="orphan",C="target",b=Object.freeze({});class N{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(r,t,e,s){this.exclusive=r,this.sparse=t,this._store=e,this.onDeleteTarget=s}_linkReverse(r,t){let e=this._reverse.get(r);e===void 0&&(e=new Set,this._reverse.set(r,e)),e.add(t)}_unlinkReverse(r,t){const e=this._reverse.get(r);e!==void 0&&(e.delete(t),e.size===0&&this._reverse.delete(r))}pruneDeadReverse(r){let t=0;for(const e of this._reverse.keys())r(c.unsafeCast(e))||(this._reverse.delete(e),t++);return t}sourcesOf(r){const t=this._reverse.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}resetIndices(){this._reverse.clear(),this._resetForward()}}class X extends N{constructor(r,t,e){super(!0,r,t,e)}_resetForward(){}link(r,t){const e=f(r),s=this._store.getField(e,0);if(s!==void 0){if(s===t)return;this._unlinkReverse(c.unsafeCast(s),r)}this._store.setRow(e,{[C]:t}),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._store.getField(e,0);s!==void 0&&(t!==void 0&&s!==t||(this._unlinkReverse(c.unsafeCast(s),r),this._store.remove(e)))}purgeSource(r){const t=f(r),e=this._store.getField(t,0);e!==void 0&&this._unlinkReverse(c.unsafeCast(e),r)}singleTargetAt(r){const t=this._store.getField(r,0);return t===void 0?void 0:c.unsafeCast(t)}targetsAt(r){const t=this._store.getField(r,0);return t===void 0?[]:[c.unsafeCast(t)]}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){}forEachCanonicalPair(r,t){const e=this._store.canonicalIndices();for(let s=0;s<e.length;s++){const n=e[s];t(r(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(r){const t=this._store.indices;for(let e=0;e<t.length;e++){const s=t[e];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),r(s))}}restoreAddTarget(){throw new d.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class G extends N{_forward=new Map;constructor(r,t,e){super(!1,r,t,e)}_resetForward(){this._forward.clear()}link(r,t){const e=f(r);let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s),this._store.setRow(e,b)),s.add(t),this._linkReverse(t,r)}unlink(r,t){const e=f(r),s=this._forward.get(e);if(s!==void 0){if(t===void 0){this._forward.delete(e),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),r)),this._store.remove(e);return}s.has(t)&&(s.delete(t),this._unlinkReverse(t,r),s.size===0&&(this._forward.delete(e),this._store.remove(e)))}}purgeSource(r){const t=f(r),e=this._forward.get(t);e!==void 0&&(this._forward.delete(t),e.forEach(s=>this._unlinkReverse(c.unsafeCast(s),r)))}singleTargetAt(){}targetsAt(r){const t=this._forward.get(r);if(t===void 0||t.size===0)return[];const e=new Array(t.size);let s=0;return t.forEach(n=>{e[s++]=c.unsafeCast(n)}),e.sort((n,o)=>n-o),e}hasIndex(r){return this._store.has(r)}forEachCanonicalTargetSet(r){const t=Array.from(this._forward.keys()).sort((e,s)=>e-s);for(let e=0;e<t.length;e++){const s=this.targetsAt(t[e]);s.length!==0&&r(t[e],s)}}forEachCanonicalPair(r,t){this.forEachCanonicalTargetSet((e,s)=>{const n=r(e);for(let o=0;o<s.length;o++)t(n,s[o])})}rebuildReverse(){}restoreAddTarget(r,t,e){let s=this._forward.get(r);s===void 0&&(s=new Set,this._forward.set(r,s)),s.add(t),this._linkReverse(t,e)}}function z(a,r,t,e){return a?new X(r,t,e):new G(r,t,e)}const D=4,U=4,k=8,w=8;function B(a){const r=new Array(a.length);let t=4;for(let o=0;o<a.length;o++){t+=D;const u=a[o];if(u.exclusive){r[o]=null;continue}const i=[];u.forEachCanonicalTargetSet((l,h)=>i.push([l,h])),r[o]=i,t+=U;for(let l=0;l<i.length;l++)t+=k+i[l][1].length*w}const e=new Uint8Array(t),s=new DataView(e.buffer);let n=0;s.setUint32(n,a.length,!0),n+=4;for(let o=0;o<a.length;o++){s.setUint32(n,a[o].exclusive?0:1,!0),n+=4;const u=r[o];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let i=0;i<u.length;i++){const l=u[i][0],h=u[i][1];s.setUint32(n,l,!0),n+=4,s.setUint32(n,h.length,!0),n+=4;for(let _=0;_<h.length;_++)s.setFloat64(n,h[_],!0),n+=w}}}return e}function Y(a,r,t){const e=new DataView(r.buffer,r.byteOffset,r.byteLength),s=r.byteLength;let n=0;const o=i=>{if(n+i>s)throw new d.SparseRestoreError(`relation snapshot truncated: need ${i} more bytes at offset ${n}, have ${s-n}`)};for(let i=0;i<a.length;i++)a[i].resetIndices();o(4);const u=e.getUint32(n,!0);if(n+=4,u!==a.length)throw new d.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${a.length}`);for(let i=0;i<a.length;i++){const l=a[i];o(D);const h=e.getUint32(n,!0);if(n+=4,h===1===l.exclusive)throw new d.SparseRestoreError(`relation ${i} cardinality mismatch: snapshot ${h?"multi":"exclusive"}, registered ${l.exclusive?"exclusive":"multi"}`);if(l.exclusive)continue;o(U);const _=e.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){o(k);const g=e.getUint32(n,!0);n+=4;const A=e.getUint32(n,!0);if(n+=4,g>v)throw new d.SparseRestoreError(`relation ${i} source index ${g} exceeds MAX_INDEX (${v})`);o(A*w);const F=t(g);for(let S=0;S<A;S++){const I=c.unsafeCast(e.getFloat64(n,!0));n+=w;const E=I;if(!Number.isInteger(E)||E<0||E>x)throw new d.SparseRestoreError(`relation ${i} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);l.restoreAddTarget(g,I,F)}}}if(n!==s)throw new d.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=M;exports.MAX_INDEX=v;exports.RELATION_TARGET_FIELD=C;exports.UNASSIGNED=y;exports.createEntityId=m;exports.createRelationStore=z;exports.getEntityIndex=f;exports.restoreRelations=Y;exports.snapshotRelations=B;
@@ -0,0 +1 @@
1
+ "use strict";const l=require("../index.development.cjs"),c=require("./assertions-z5GQd_bB.cjs"),k=-1;Object.freeze(Object.create(null));const L=31,g=20,p=(1<<g)-1,E=p,M=L-g,N=(1<<M)-1,x=N<<g|E,m=(o,e)=>{{if(o<0||o>E)throw new l.ECSError(l.ECS_ERROR.EID_MAX_INDEX_OVERFLOW);if(e<0||e>N)throw new l.ECSError(l.ECS_ERROR.EID_MAX_GEN_OVERFLOW)}return c.unsafeCast(e<<g|o)},d=o=>o&p,C=o=>o>>g,X=(o,e,r)=>new l.ECSError(l.ECS_ERROR.ENTITY_NOT_ALIVE,`${o}: entity ${e} (index ${d(e)}, generation ${C(e)}) is not alive${r?`, ${r}`:""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,{entity:e,index:d(e),generation:C(e),op:o}),b="orphan",D="target",G=Object.freeze({});class O{exclusive;sparse;onDeleteTarget;_store;_reverse=new Map;constructor(e,r,t,s){this.exclusive=e,this.sparse=r,this._store=t,this.onDeleteTarget=s}_linkReverse(e,r){let t=this._reverse.get(e);t===void 0&&(t=new Set,this._reverse.set(e,t)),t.add(r)}_unlinkReverse(e,r){const t=this._reverse.get(e);t!==void 0&&(t.delete(r),t.size===0&&this._reverse.delete(e))}pruneDeadReverse(e){let r=0;for(const t of this._reverse.keys())e(c.unsafeCast(t))||(this._reverse.delete(t),r++);return r}sourcesOf(e){const r=this._reverse.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}resetIndices(){this._reverse.clear(),this._resetForward()}}class z extends O{constructor(e,r,t){super(!0,e,r,t)}_resetForward(){}link(e,r){const t=d(e),s=this._store.getField(t,0);if(s!==void 0){if(s===r)return;this._unlinkReverse(c.unsafeCast(s),e)}this._store.setRow(t,{[D]:r}),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._store.getField(t,0);s!==void 0&&(r!==void 0&&s!==r||(this._unlinkReverse(c.unsafeCast(s),e),this._store.remove(t)))}purgeSource(e){const r=d(e),t=this._store.getField(r,0);t!==void 0&&this._unlinkReverse(c.unsafeCast(t),e)}singleTargetAt(e){const r=this._store.getField(e,0);return r===void 0?void 0:c.unsafeCast(r)}targetsAt(e){const r=this._store.getField(e,0);return r===void 0?[]:[c.unsafeCast(r)]}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){}forEachCanonicalPair(e,r){const t=this._store.canonicalIndices();for(let s=0;s<t.length;s++){const n=t[s];r(e(n),c.unsafeCast(this._store.getField(n,0)))}}rebuildReverse(e){const r=this._store.indices;for(let t=0;t<r.length;t++){const s=r[t];this._linkReverse(c.unsafeCast(this._store.getField(s,0)),e(s))}}restoreAddTarget(){throw new l.SparseRestoreError("exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)")}}class B extends O{_forward=new Map;constructor(e,r,t){super(!1,e,r,t)}_resetForward(){this._forward.clear()}link(e,r){const t=d(e);let s=this._forward.get(t);s===void 0&&(s=new Set,this._forward.set(t,s),this._store.setRow(t,G)),s.add(r),this._linkReverse(r,e)}unlink(e,r){const t=d(e),s=this._forward.get(t);if(s!==void 0){if(r===void 0){this._forward.delete(t),s.forEach(n=>this._unlinkReverse(c.unsafeCast(n),e)),this._store.remove(t);return}s.has(r)&&(s.delete(r),this._unlinkReverse(r,e),s.size===0&&(this._forward.delete(t),this._store.remove(t)))}}purgeSource(e){const r=d(e),t=this._forward.get(r);t!==void 0&&(this._forward.delete(r),t.forEach(s=>this._unlinkReverse(c.unsafeCast(s),e)))}singleTargetAt(){}targetsAt(e){const r=this._forward.get(e);if(r===void 0||r.size===0)return[];const t=new Array(r.size);let s=0;return r.forEach(n=>{t[s++]=c.unsafeCast(n)}),t.sort((n,i)=>n-i),t}hasIndex(e){return this._store.has(e)}forEachCanonicalTargetSet(e){const r=Array.from(this._forward.keys()).sort((t,s)=>t-s);for(let t=0;t<r.length;t++){const s=this.targetsAt(r[t]);s.length!==0&&e(r[t],s)}}forEachCanonicalPair(e,r){this.forEachCanonicalTargetSet((t,s)=>{const n=e(t);for(let i=0;i<s.length;i++)r(n,s[i])})}rebuildReverse(){}restoreAddTarget(e,r,t){let s=this._forward.get(e);s===void 0&&(s=new Set,this._forward.set(e,s)),s.add(r),this._linkReverse(r,t)}}function Y(o,e,r,t){return o?new z(e,r,t):new B(e,r,t)}const y=4,U=4,$=8,R=8;function V(o){const e=new Array(o.length);let r=4;for(let i=0;i<o.length;i++){r+=y;const u=o[i];if(u.exclusive){e[i]=null;continue}const a=[];u.forEachCanonicalTargetSet((h,f)=>a.push([h,f])),e[i]=a,r+=U;for(let h=0;h<a.length;h++)r+=$+a[h][1].length*R}const t=new Uint8Array(r),s=new DataView(t.buffer);let n=0;s.setUint32(n,o.length,!0),n+=4;for(let i=0;i<o.length;i++){s.setUint32(n,o[i].exclusive?0:1,!0),n+=4;const u=e[i];if(u!==null){s.setUint32(n,u.length,!0),n+=4;for(let a=0;a<u.length;a++){const h=u[a][0],f=u[a][1];s.setUint32(n,h,!0),n+=4,s.setUint32(n,f.length,!0),n+=4;for(let _=0;_<f.length;_++)s.setFloat64(n,f[_],!0),n+=R}}}return t}function P(o,e,r){const t=new DataView(e.buffer,e.byteOffset,e.byteLength),s=e.byteLength;let n=0;const i=a=>{if(n+a>s)throw new l.SparseRestoreError(`relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s-n}`)};for(let a=0;a<o.length;a++)o[a].resetIndices();i(4);const u=t.getUint32(n,!0);if(n+=4,u!==o.length)throw new l.SparseRestoreError(`relation count mismatch: snapshot=${u}, registered=${o.length}`);for(let a=0;a<o.length;a++){const h=o[a];i(y);const f=t.getUint32(n,!0);if(n+=4,f===1===h.exclusive)throw new l.SparseRestoreError(`relation ${a} cardinality mismatch: snapshot ${f?"multi":"exclusive"}, registered ${h.exclusive?"exclusive":"multi"}`);if(h.exclusive)continue;i(U);const _=t.getUint32(n,!0);n+=4;for(let T=0;T<_;T++){i($);const v=t.getUint32(n,!0);n+=4;const A=t.getUint32(n,!0);if(n+=4,v>E)throw new l.SparseRestoreError(`relation ${a} source index ${v} exceeds MAX_INDEX (${E})`);i(A*R);const F=r(v);for(let S=0;S<A;S++){const I=c.unsafeCast(t.getFloat64(n,!0));n+=R;const w=I;if(!Number.isInteger(w)||w<0||w>x)throw new l.SparseRestoreError(`relation ${a} target ${w} is not a well-formed packed EntityID (expected an integer in [0, ${x}])`);h.restoreAddTarget(v,I,F)}}}if(n!==s)throw new l.SparseRestoreError(`relation snapshot has ${s-n} trailing bytes after the last relation (not a canonical encoding)`)}exports.DEFAULT_ON_DELETE_TARGET=b;exports.MAX_INDEX=E;exports.RELATION_TARGET_FIELD=D;exports.UNASSIGNED=k;exports.createEntityId=m;exports.createRelationStore=Y;exports.entityNotAliveError=X;exports.getEntityIndex=d;exports.restoreRelations=P;exports.snapshotRelations=V;
@@ -0,0 +1,328 @@
1
+ import { ECSError as T, ECS_ERROR as A, SparseRestoreError as f } from "../index.development.js";
2
+ import { u as c } from "./assertions-gtDVfbnQ.js";
3
+ const Y = -1;
4
+ Object.freeze(/* @__PURE__ */ Object.create(null));
5
+ const C = 31, g = 20, D = (1 << g) - 1, w = D, M = C - g, O = (1 << M) - 1, N = O << g | w, V = (o, e) => {
6
+ {
7
+ if (o < 0 || o > w)
8
+ throw new T(A.EID_MAX_INDEX_OVERFLOW);
9
+ if (e < 0 || e > O)
10
+ throw new T(A.EID_MAX_GEN_OVERFLOW);
11
+ }
12
+ return c(e << g | o);
13
+ }, d = (o) => o & D, $ = (o) => o >> g, P = (o, e, r) => new T(
14
+ A.ENTITY_NOT_ALIVE,
15
+ `${o}: entity ${e} (index ${d(e)}, generation ${$(
16
+ e
17
+ )}) is not alive${r ? `, ${r}` : ""}. It was destroyed, never created, or the handle is stale. Guard with isAlive() first`,
18
+ { entity: e, index: d(e), generation: $(e), op: o }
19
+ ), j = "orphan", L = "target", b = Object.freeze({});
20
+ class U {
21
+ /** `true` → one target per source, held in the sparse field. `false` →
22
+ * a set of targets per source. The cardinality discriminant survives as a
23
+ * field because the snapshot header and the traversal and `targetOf`
24
+ * mode guards carry it. The forward mechanics stay virtual, never branched
25
+ * on it. */
26
+ exclusive;
27
+ /** Backing sparse component def: `{ target: f64 }` when exclusive, a tag when
28
+ * multi. Carries membership (and the target, when exclusive). */
29
+ sparse;
30
+ /** Cleanup policy applied to this relation's sources when a target is
31
+ * destroyed. `orphan` (the default) is a no-op, the link dangles
32
+ * safely. `Store` reads this at destroy-flush off `sourcesOf`. */
33
+ onDeleteTarget;
34
+ /** The backing sparse store instance. Owned for registration and liveness by
35
+ * `Store`, but the relation drives the forward and membership rows on it directly.
36
+ * That is the cardinality interaction this class now encapsulates. */
37
+ _store;
38
+ /** target `EntityID` → set of source `EntityID`s. Keyed by the full id, not
39
+ * the index, so a recycled target slot can't alias a dead target's sources.
40
+ * An entry is dropped the moment its set empties (`_unlinkReverse`). */
41
+ _reverse = /* @__PURE__ */ new Map();
42
+ constructor(e, r, t, s) {
43
+ this.exclusive = e, this.sparse = r, this._store = t, this.onDeleteTarget = s;
44
+ }
45
+ // --- shared reverse index (cardinality-agnostic) ---
46
+ /** Record that `src` points at `tgt` in the reverse index. */
47
+ _linkReverse(e, r) {
48
+ let t = this._reverse.get(e);
49
+ t === void 0 && (t = /* @__PURE__ */ new Set(), this._reverse.set(e, t)), t.add(r);
50
+ }
51
+ /** Drop the `src → tgt` edge from the reverse index, removing the target's
52
+ * entry entirely once its last source is gone (so a dead-target key doesn't
53
+ * linger with an empty set). */
54
+ _unlinkReverse(e, r) {
55
+ const t = this._reverse.get(e);
56
+ t !== void 0 && (t.delete(r), t.size === 0 && this._reverse.delete(e));
57
+ }
58
+ /** Drop every reverse-index entry whose **target** is no longer alive,
59
+ * returning the count dropped. The `orphan` policy intentionally
60
+ * leaves a destroyed target's reverse entry intact (the link dangles
61
+ * safely), so a long-lived source that orphan-points at a stream of
62
+ * short-lived targets and never re-targets or dies accumulates dead-target keys
63
+ * without bound. This is the reclaim primitive behind `ecs.relations.compact`,
64
+ * a cold path the host calls at scene and snapshot boundaries. It is
65
+ * cardinality-free (reverse-index only), so it lives on the base unchanged.
66
+ *
67
+ * Pure index reclaim: the **forward** links (the exclusive sparse target
68
+ * field, the multi forward set) are left untouched, so `targetOf` and
69
+ * `targetsOf` still return the dangling dead handle exactly as `orphan`
70
+ * promises. The reverse index is derived, so dropping a dead-target entry
71
+ * changes nothing observable except `sourcesOf` on that dead handle (which
72
+ * goes from the dangling sources to `[]`, meaningless either way, the target
73
+ * is gone) and is faithfully rebuilt by snapshot and restore from the surviving
74
+ * forward links. Only the **target** role can leak here: a destroyed *source*
75
+ * is already unlinked from every reverse set by `purgeSource`, so a live
76
+ * target's set never holds a dead source. `isAlive` is supplied by `Store`,
77
+ * which owns entity liveness. Deleting during `Map` key iteration is
78
+ * well-defined, already-visited and not-yet-reached keys are unaffected. */
79
+ pruneDeadReverse(e) {
80
+ let r = 0;
81
+ for (const t of this._reverse.keys())
82
+ e(c(t)) || (this._reverse.delete(t), r++);
83
+ return r;
84
+ }
85
+ /** Sources that point at `tgt`, ascending by id (deterministic, cold-path
86
+ * sort), empty when none. */
87
+ sourcesOf(e) {
88
+ const r = this._reverse.get(e);
89
+ if (r === void 0 || r.size === 0) return [];
90
+ const t = new Array(r.size);
91
+ let s = 0;
92
+ return r.forEach((n) => {
93
+ t[s++] = c(n);
94
+ }), t.sort((n, i) => n - i), t;
95
+ }
96
+ /** Drop every derived side index, the reverse index and (for multi) the
97
+ * forward target sets. Restore path only (`restoreRelations`): the side
98
+ * indices are rebuilt from scratch, so they're cleared first to stay
99
+ * idempotent when restoring into a dirty world. The backing sparse store is
100
+ * cleared separately by `restoreSparseStores`. */
101
+ resetIndices() {
102
+ this._reverse.clear(), this._resetForward();
103
+ }
104
+ }
105
+ class X extends U {
106
+ constructor(e, r, t) {
107
+ super(!0, e, r, t);
108
+ }
109
+ _resetForward() {
110
+ }
111
+ link(e, r) {
112
+ const t = d(e), s = this._store.getField(t, 0);
113
+ if (s !== void 0) {
114
+ if (s === r) return;
115
+ this._unlinkReverse(c(s), e);
116
+ }
117
+ this._store.setRow(t, { [L]: r }), this._linkReverse(r, e);
118
+ }
119
+ unlink(e, r) {
120
+ const t = d(e), s = this._store.getField(t, 0);
121
+ s !== void 0 && (r !== void 0 && s !== r || (this._unlinkReverse(c(s), e), this._store.remove(t)));
122
+ }
123
+ purgeSource(e) {
124
+ const r = d(e), t = this._store.getField(r, 0);
125
+ t !== void 0 && this._unlinkReverse(c(t), e);
126
+ }
127
+ singleTargetAt(e) {
128
+ const r = this._store.getField(e, 0);
129
+ return r === void 0 ? void 0 : c(r);
130
+ }
131
+ targetsAt(e) {
132
+ const r = this._store.getField(e, 0);
133
+ return r === void 0 ? [] : [c(r)];
134
+ }
135
+ hasIndex(e) {
136
+ return this._store.has(e);
137
+ }
138
+ forEachCanonicalTargetSet(e) {
139
+ }
140
+ forEachCanonicalPair(e, r) {
141
+ const t = this._store.canonicalIndices();
142
+ for (let s = 0; s < t.length; s++) {
143
+ const n = t[s];
144
+ r(e(n), c(this._store.getField(n, 0)));
145
+ }
146
+ }
147
+ rebuildReverse(e) {
148
+ const r = this._store.indices;
149
+ for (let t = 0; t < r.length; t++) {
150
+ const s = r[t];
151
+ this._linkReverse(c(this._store.getField(s, 0)), e(s));
152
+ }
153
+ }
154
+ restoreAddTarget() {
155
+ throw new f(
156
+ "exclusive relation has no multi forward sources to restore (snapshot header should have guarded this)"
157
+ );
158
+ }
159
+ }
160
+ class G extends U {
161
+ /** source entity **index** → set of target `EntityID`s. Keyed by source index
162
+ * so destroy-purge, which has the freed index, can drop it in O(1). An
163
+ * entry is removed the moment its set empties. */
164
+ _forward = /* @__PURE__ */ new Map();
165
+ constructor(e, r, t) {
166
+ super(!1, e, r, t);
167
+ }
168
+ _resetForward() {
169
+ this._forward.clear();
170
+ }
171
+ link(e, r) {
172
+ const t = d(e);
173
+ let s = this._forward.get(t);
174
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(t, s), this._store.setRow(t, b)), s.add(r), this._linkReverse(r, e);
175
+ }
176
+ unlink(e, r) {
177
+ const t = d(e), s = this._forward.get(t);
178
+ if (s !== void 0) {
179
+ if (r === void 0) {
180
+ this._forward.delete(t), s.forEach((n) => this._unlinkReverse(c(n), e)), this._store.remove(t);
181
+ return;
182
+ }
183
+ s.has(r) && (s.delete(r), this._unlinkReverse(r, e), s.size === 0 && (this._forward.delete(t), this._store.remove(t)));
184
+ }
185
+ }
186
+ purgeSource(e) {
187
+ const r = d(e), t = this._forward.get(r);
188
+ t !== void 0 && (this._forward.delete(r), t.forEach((s) => this._unlinkReverse(c(s), e)));
189
+ }
190
+ singleTargetAt() {
191
+ }
192
+ targetsAt(e) {
193
+ const r = this._forward.get(e);
194
+ if (r === void 0 || r.size === 0) return [];
195
+ const t = new Array(r.size);
196
+ let s = 0;
197
+ return r.forEach((n) => {
198
+ t[s++] = c(n);
199
+ }), t.sort((n, i) => n - i), t;
200
+ }
201
+ hasIndex(e) {
202
+ return this._store.has(e);
203
+ }
204
+ forEachCanonicalTargetSet(e) {
205
+ const r = Array.from(this._forward.keys()).sort((t, s) => t - s);
206
+ for (let t = 0; t < r.length; t++) {
207
+ const s = this.targetsAt(r[t]);
208
+ s.length !== 0 && e(r[t], s);
209
+ }
210
+ }
211
+ forEachCanonicalPair(e, r) {
212
+ this.forEachCanonicalTargetSet((t, s) => {
213
+ const n = e(t);
214
+ for (let i = 0; i < s.length; i++) r(n, s[i]);
215
+ });
216
+ }
217
+ rebuildReverse() {
218
+ }
219
+ restoreAddTarget(e, r, t) {
220
+ let s = this._forward.get(e);
221
+ s === void 0 && (s = /* @__PURE__ */ new Set(), this._forward.set(e, s)), s.add(r), this._linkReverse(r, t);
222
+ }
223
+ }
224
+ function K(o, e, r, t) {
225
+ return o ? new X(e, r, t) : new G(e, r, t);
226
+ }
227
+ const k = 4, y = 4, m = 8, R = 8;
228
+ function W(o) {
229
+ const e = new Array(o.length);
230
+ let r = 4;
231
+ for (let i = 0; i < o.length; i++) {
232
+ r += k;
233
+ const h = o[i];
234
+ if (h.exclusive) {
235
+ e[i] = null;
236
+ continue;
237
+ }
238
+ const a = [];
239
+ h.forEachCanonicalTargetSet((l, u) => a.push([l, u])), e[i] = a, r += y;
240
+ for (let l = 0; l < a.length; l++)
241
+ r += m + a[l][1].length * R;
242
+ }
243
+ const t = new Uint8Array(r), s = new DataView(t.buffer);
244
+ let n = 0;
245
+ s.setUint32(n, o.length, !0), n += 4;
246
+ for (let i = 0; i < o.length; i++) {
247
+ s.setUint32(n, o[i].exclusive ? 0 : 1, !0), n += 4;
248
+ const h = e[i];
249
+ if (h !== null) {
250
+ s.setUint32(n, h.length, !0), n += 4;
251
+ for (let a = 0; a < h.length; a++) {
252
+ const l = h[a][0], u = h[a][1];
253
+ s.setUint32(n, l, !0), n += 4, s.setUint32(n, u.length, !0), n += 4;
254
+ for (let _ = 0; _ < u.length; _++)
255
+ s.setFloat64(n, u[_], !0), n += R;
256
+ }
257
+ }
258
+ }
259
+ return t;
260
+ }
261
+ function H(o, e, r) {
262
+ const t = new DataView(e.buffer, e.byteOffset, e.byteLength), s = e.byteLength;
263
+ let n = 0;
264
+ const i = (a) => {
265
+ if (n + a > s)
266
+ throw new f(
267
+ `relation snapshot truncated: need ${a} more bytes at offset ${n}, have ${s - n}`
268
+ );
269
+ };
270
+ for (let a = 0; a < o.length; a++) o[a].resetIndices();
271
+ i(4);
272
+ const h = t.getUint32(n, !0);
273
+ if (n += 4, h !== o.length)
274
+ throw new f(
275
+ `relation count mismatch: snapshot=${h}, registered=${o.length}`
276
+ );
277
+ for (let a = 0; a < o.length; a++) {
278
+ const l = o[a];
279
+ i(k);
280
+ const u = t.getUint32(n, !0);
281
+ if (n += 4, u === 1 === l.exclusive)
282
+ throw new f(
283
+ `relation ${a} cardinality mismatch: snapshot ${u ? "multi" : "exclusive"}, registered ${l.exclusive ? "exclusive" : "multi"}`
284
+ );
285
+ if (l.exclusive) continue;
286
+ i(y);
287
+ const _ = t.getUint32(n, !0);
288
+ n += 4;
289
+ for (let I = 0; I < _; I++) {
290
+ i(m);
291
+ const v = t.getUint32(n, !0);
292
+ n += 4;
293
+ const x = t.getUint32(n, !0);
294
+ if (n += 4, v > w)
295
+ throw new f(
296
+ `relation ${a} source index ${v} exceeds MAX_INDEX (${w})`
297
+ );
298
+ i(x * R);
299
+ const F = r(v);
300
+ for (let S = 0; S < x; S++) {
301
+ const p = c(t.getFloat64(n, !0));
302
+ n += R;
303
+ const E = p;
304
+ if (!Number.isInteger(E) || E < 0 || E > N)
305
+ throw new f(
306
+ `relation ${a} target ${E} is not a well-formed packed EntityID (expected an integer in [0, ${N}])`
307
+ );
308
+ l.restoreAddTarget(v, p, F);
309
+ }
310
+ }
311
+ }
312
+ if (n !== s)
313
+ throw new f(
314
+ `relation snapshot has ${s - n} trailing bytes after the last relation (not a canonical encoding)`
315
+ );
316
+ }
317
+ export {
318
+ j as D,
319
+ w as M,
320
+ L as R,
321
+ Y as U,
322
+ K as a,
323
+ V as c,
324
+ P as e,
325
+ d as g,
326
+ H as r,
327
+ W as s
328
+ };