@oasys/oecs 0.3.1 → 0.4.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 (204) hide show
  1. package/README.md +196 -267
  2. package/dist/array-CxbPyiHO.cjs +1 -0
  3. package/dist/array-uFR7Q8fU.js +132 -0
  4. package/dist/core/ecs/access_check.d.ts +77 -0
  5. package/dist/core/ecs/access_check.d.ts.map +1 -0
  6. package/dist/core/ecs/archetype.d.ts +474 -0
  7. package/dist/core/ecs/archetype.d.ts.map +1 -0
  8. package/dist/core/ecs/builtin_relations.d.ts +43 -0
  9. package/dist/core/ecs/builtin_relations.d.ts.map +1 -0
  10. package/dist/core/ecs/command_log.d.ts +113 -0
  11. package/dist/core/ecs/command_log.d.ts.map +1 -0
  12. package/dist/core/ecs/component.d.ts +106 -0
  13. package/dist/core/ecs/component.d.ts.map +1 -0
  14. package/dist/core/ecs/compute_backend.d.ts +37 -0
  15. package/dist/core/ecs/compute_backend.d.ts.map +1 -0
  16. package/dist/core/ecs/dispatch_trace.d.ts +93 -0
  17. package/dist/core/ecs/dispatch_trace.d.ts.map +1 -0
  18. package/dist/core/ecs/ecs.d.ts +533 -0
  19. package/dist/core/ecs/ecs.d.ts.map +1 -0
  20. package/dist/core/ecs/ecs_memory.d.ts +179 -0
  21. package/dist/core/ecs/ecs_memory.d.ts.map +1 -0
  22. package/dist/core/ecs/entity.d.ts +28 -0
  23. package/dist/core/ecs/entity.d.ts.map +1 -0
  24. package/dist/core/ecs/event.d.ts +54 -0
  25. package/dist/core/ecs/event.d.ts.map +1 -0
  26. package/dist/core/ecs/frame_trace.d.ts +133 -0
  27. package/dist/core/ecs/frame_trace.d.ts.map +1 -0
  28. package/dist/core/ecs/host_commands.d.ts +252 -0
  29. package/dist/core/ecs/host_commands.d.ts.map +1 -0
  30. package/dist/core/ecs/index.d.ts +41 -0
  31. package/dist/core/ecs/index.d.ts.map +1 -0
  32. package/dist/core/ecs/observer.d.ts +142 -0
  33. package/dist/core/ecs/observer.d.ts.map +1 -0
  34. package/dist/core/ecs/query.d.ts +557 -0
  35. package/dist/core/ecs/query.d.ts.map +1 -0
  36. package/dist/core/ecs/ref.d.ts +31 -0
  37. package/dist/core/ecs/ref.d.ts.map +1 -0
  38. package/dist/core/ecs/relation.d.ts +231 -0
  39. package/dist/core/ecs/relation.d.ts.map +1 -0
  40. package/dist/core/ecs/resource.d.ts +33 -0
  41. package/dist/core/ecs/resource.d.ts.map +1 -0
  42. package/dist/core/ecs/resume.d.ts +85 -0
  43. package/dist/core/ecs/resume.d.ts.map +1 -0
  44. package/dist/core/ecs/run_condition.d.ts +75 -0
  45. package/dist/core/ecs/run_condition.d.ts.map +1 -0
  46. package/dist/core/ecs/schedule.d.ts +133 -0
  47. package/dist/core/ecs/schedule.d.ts.map +1 -0
  48. package/dist/core/ecs/sparse_store.d.ts +107 -0
  49. package/dist/core/ecs/sparse_store.d.ts.map +1 -0
  50. package/dist/core/ecs/store.d.ts +1149 -0
  51. package/dist/core/ecs/store.d.ts.map +1 -0
  52. package/dist/core/ecs/store_layout_listener.d.ts +23 -0
  53. package/dist/core/ecs/store_layout_listener.d.ts.map +1 -0
  54. package/dist/core/ecs/system.d.ts +134 -0
  55. package/dist/core/ecs/system.d.ts.map +1 -0
  56. package/dist/core/ecs/utils/arrays.d.ts +7 -0
  57. package/dist/core/ecs/utils/arrays.d.ts.map +1 -0
  58. package/dist/core/ecs/utils/constants.d.ts +12 -0
  59. package/dist/core/ecs/utils/constants.d.ts.map +1 -0
  60. package/dist/core/ecs/utils/error.d.ts +51 -0
  61. package/dist/core/ecs/utils/error.d.ts.map +1 -0
  62. package/dist/core/reactive/array.d.ts +24 -0
  63. package/dist/core/reactive/array.d.ts.map +1 -0
  64. package/dist/core/reactive/index.cjs +1 -0
  65. package/dist/core/reactive/index.d.ts +10 -0
  66. package/dist/core/reactive/index.d.ts.map +1 -0
  67. package/dist/core/reactive/index.js +17 -0
  68. package/dist/core/reactive/interop.d.ts +19 -0
  69. package/dist/core/reactive/interop.d.ts.map +1 -0
  70. package/dist/core/reactive/kernel.d.ts +71 -0
  71. package/dist/core/reactive/kernel.d.ts.map +1 -0
  72. package/dist/core/reactive/map.d.ts +16 -0
  73. package/dist/core/reactive/map.d.ts.map +1 -0
  74. package/dist/core/reactive/struct.d.ts +10 -0
  75. package/dist/core/reactive/struct.d.ts.map +1 -0
  76. package/dist/core/store/__generated__/abi.d.ts +43 -0
  77. package/dist/core/store/__generated__/abi.d.ts.map +1 -0
  78. package/dist/core/store/action_ring.d.ts +136 -0
  79. package/dist/core/store/action_ring.d.ts.map +1 -0
  80. package/dist/core/store/allocator.d.ts +238 -0
  81. package/dist/core/store/allocator.d.ts.map +1 -0
  82. package/dist/core/store/buffer_backed_column.d.ts +69 -0
  83. package/dist/core/store/buffer_backed_column.d.ts.map +1 -0
  84. package/dist/core/store/column_store.d.ts +265 -0
  85. package/dist/core/store/column_store.d.ts.map +1 -0
  86. package/dist/core/store/command_dispatch.d.ts +52 -0
  87. package/dist/core/store/command_dispatch.d.ts.map +1 -0
  88. package/dist/core/store/command_ring.d.ts +107 -0
  89. package/dist/core/store/command_ring.d.ts.map +1 -0
  90. package/dist/core/store/descriptor.d.ts +80 -0
  91. package/dist/core/store/descriptor.d.ts.map +1 -0
  92. package/dist/core/store/entity_index.d.ts +108 -0
  93. package/dist/core/store/entity_index.d.ts.map +1 -0
  94. package/dist/core/store/event_ring.d.ts +95 -0
  95. package/dist/core/store/event_ring.d.ts.map +1 -0
  96. package/dist/core/store/extend.d.ts +109 -0
  97. package/dist/core/store/extend.d.ts.map +1 -0
  98. package/dist/core/store/grow.d.ts +39 -0
  99. package/dist/core/store/grow.d.ts.map +1 -0
  100. package/dist/core/store/header.d.ts +64 -0
  101. package/dist/core/store/header.d.ts.map +1 -0
  102. package/dist/core/store/index.d.ts +16 -0
  103. package/dist/core/store/index.d.ts.map +1 -0
  104. package/dist/core/store/region_table.d.ts +74 -0
  105. package/dist/core/store/region_table.d.ts.map +1 -0
  106. package/dist/core/store/snapshot.d.ts +43 -0
  107. package/dist/core/store/snapshot.d.ts.map +1 -0
  108. package/dist/core/store/state_hash.d.ts +38 -0
  109. package/dist/core/store/state_hash.d.ts.map +1 -0
  110. package/dist/core/store/store_regions.d.ts +38 -0
  111. package/dist/core/store/store_regions.d.ts.map +1 -0
  112. package/dist/extensions/editor/editor.d.ts +149 -0
  113. package/dist/extensions/editor/editor.d.ts.map +1 -0
  114. package/dist/extensions/editor/field_handle.d.ts +35 -0
  115. package/dist/extensions/editor/field_handle.d.ts.map +1 -0
  116. package/dist/extensions/editor/index.cjs +1 -0
  117. package/dist/extensions/editor/index.d.ts +21 -0
  118. package/dist/extensions/editor/index.d.ts.map +1 -0
  119. package/dist/extensions/editor/index.js +209 -0
  120. package/dist/extensions/reactive/ecs_sync.d.ts +210 -0
  121. package/dist/extensions/reactive/ecs_sync.d.ts.map +1 -0
  122. package/dist/extensions/reactive/index.cjs +1 -0
  123. package/dist/extensions/reactive/index.d.ts +23 -0
  124. package/dist/extensions/reactive/index.d.ts.map +1 -0
  125. package/dist/extensions/reactive/index.js +225 -0
  126. package/dist/extensions/solid/index.cjs +1 -0
  127. package/dist/extensions/solid/index.d.ts +6 -0
  128. package/dist/extensions/solid/index.d.ts.map +1 -0
  129. package/dist/extensions/solid/index.js +32 -0
  130. package/dist/extensions/solid/kernel_solid.d.ts +42 -0
  131. package/dist/extensions/solid/kernel_solid.d.ts.map +1 -0
  132. package/dist/index.cjs +2 -1
  133. package/dist/index.d.ts +16 -12
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +8565 -1310
  136. package/dist/interop-CT-REx0W.cjs +1 -0
  137. package/dist/interop-CcY6ASQc.js +18 -0
  138. package/dist/kernel-DgyrLFjW.js +227 -0
  139. package/dist/kernel-yWV3XnAb.cjs +1 -0
  140. package/dist/log/console_sink.d.ts +4 -0
  141. package/dist/log/console_sink.d.ts.map +1 -0
  142. package/dist/log/index.d.ts +3 -0
  143. package/dist/log/index.d.ts.map +1 -0
  144. package/dist/log/logger.d.ts +27 -0
  145. package/dist/log/logger.d.ts.map +1 -0
  146. package/dist/primitives.cjs +1 -0
  147. package/dist/primitives.d.ts +18 -0
  148. package/dist/primitives.d.ts.map +1 -0
  149. package/dist/primitives.js +44 -0
  150. package/dist/shared-BXSZnxx4.cjs +1 -0
  151. package/dist/shared-C678TAPY.js +99 -0
  152. package/dist/shared.cjs +1 -0
  153. package/dist/shared.d.ts +22 -0
  154. package/dist/shared.d.ts.map +1 -0
  155. package/dist/shared.js +7 -0
  156. package/dist/topological_sort-DlRpSrxu.js +391 -0
  157. package/dist/topological_sort-WAT-VHb-.cjs +1 -0
  158. package/dist/type_primitives/assertions.d.ts +12 -8
  159. package/dist/type_primitives/assertions.d.ts.map +1 -1
  160. package/dist/type_primitives/binary_heap/binary_heap.d.ts +6 -2
  161. package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
  162. package/dist/type_primitives/bitset/bitset.d.ts +16 -4
  163. package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
  164. package/dist/type_primitives/brand.d.ts +6 -1
  165. package/dist/type_primitives/brand.d.ts.map +1 -1
  166. package/dist/type_primitives/error.d.ts +4 -0
  167. package/dist/type_primitives/error.d.ts.map +1 -1
  168. package/dist/type_primitives/index.d.ts +3 -0
  169. package/dist/type_primitives/index.d.ts.map +1 -1
  170. package/dist/type_primitives/sparse_map/sparse_map.d.ts +7 -3
  171. package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
  172. package/dist/type_primitives/sparse_set/sparse_set.d.ts +4 -0
  173. package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
  174. package/dist/type_primitives/topological_sort/topological_sort.d.ts +7 -3
  175. package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
  176. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +53 -16
  177. package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
  178. package/dist/utils/arrays.d.ts +1 -1
  179. package/dist/utils/arrays.d.ts.map +1 -1
  180. package/dist/utils/error.d.ts +2 -20
  181. package/dist/utils/error.d.ts.map +1 -1
  182. package/package.json +36 -9
  183. package/dist/archetype.d.ts +0 -108
  184. package/dist/archetype.d.ts.map +0 -1
  185. package/dist/component.d.ts +0 -45
  186. package/dist/component.d.ts.map +0 -1
  187. package/dist/ecs.d.ts +0 -104
  188. package/dist/ecs.d.ts.map +0 -1
  189. package/dist/entity.d.ts +0 -11
  190. package/dist/entity.d.ts.map +0 -1
  191. package/dist/event.d.ts +0 -30
  192. package/dist/event.d.ts.map +0 -1
  193. package/dist/query.d.ts +0 -94
  194. package/dist/query.d.ts.map +0 -1
  195. package/dist/ref.d.ts +0 -23
  196. package/dist/ref.d.ts.map +0 -1
  197. package/dist/resource.d.ts +0 -23
  198. package/dist/resource.d.ts.map +0 -1
  199. package/dist/schedule.d.ts +0 -45
  200. package/dist/schedule.d.ts.map +0 -1
  201. package/dist/store.d.ts +0 -118
  202. package/dist/store.d.ts.map +0 -1
  203. package/dist/system.d.ts +0 -16
  204. package/dist/system.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../kernel-yWV3XnAb.cjs"),p=require("../../array-CxbPyiHO.cjs");function _(a,n){if(Object.is(a,n))return!0;const s=a,r=n,i=Object.keys(s);if(i.length!==Object.keys(r).length)return!1;for(let l=0;l<i.length;l++){const u=i[l];if(!Object.prototype.hasOwnProperty.call(r,u)||!Object.is(s[u],r[u]))return!1}return!0}class v{constructor(n){this.def=n}_ctx;_eid=0;get eid(){return this._eid}field(n){return this._ctx.getField(this._eid,this.def,n)}}class w{constructor(n){this.def=n}_eid=0;_row=0;cols=new Map;arch;bind(n){this.arch=n,this.cols.clear()}get eid(){return this._eid}field(n){let s=this.cols.get(n);return s===void 0&&(s=this.arch.getColumnRead(this.def,n),this.cols.set(n,s)),s[this._row]}}class E{_ctx;_eid=0;get eid(){return this._eid}field(n,s){return this._ctx.getField(this._eid,n,s)}}function m(a,n,s,r={}){const i=p.reactiveMap(r.eq),l={...r.access,reads:[n,...r.access?.reads??[]]},u=r.grain??"entity",d=r.seedExisting??!0,b=new v(n),h=(o,t)=>{t.isDisabled(o)||(b._ctx=t,b._eid=o,i.set(o,s(b)))};let g;return f.batch(()=>{if(u==="column"){const o=new w(n);g=a.observe(n,{granularity:"archetype",onSet:t=>{o.bind(t);const c=t.entityIds;for(let e=0;e<t.entityCount;e++)o._row=e,o._eid=c[e],i.set(o._eid,s(o))},onAdd:(t,c)=>h(t,c),onRemove:t=>i.delete(t),onDisable:t=>i.delete(t),onEnable:(t,c)=>h(t,c),access:l,yieldExisting:d})}else g=a.observe(n,{granularity:"entity",onSet:(o,t)=>h(o,t),onAdd:(o,t)=>h(o,t),onRemove:o=>i.delete(o),onDisable:o=>i.delete(o),onEnable:(o,t)=>h(o,t),access:l,yieldExisting:d})}),{map:i,dispose:()=>g.dispose()}}function S(a,n,s,r={}){return m(a,n,l=>{const u={};for(let d=0;d<s.length;d++)u[s[d]]=l.field(s[d]);return u},{...r,eq:_})}function R(a,n,s,r={}){const i=p.reactiveMap(r.eq),l={...r.access,reads:[...n,...r.access?.reads??[]]},u=r.seedExisting??!0,d=new E,b=(t,c)=>{for(let e=0;e<n.length;e++)if(!t.hasComponent(c,n[e]))return!1;return!0},h=(t,c)=>{c.isDisabled(t)||b(c,t)&&(d._ctx=c,d._eid=t,i.set(t,s(d)))},g=t=>{i.delete(t)};let o;return f.batch(()=>{o=n.map(t=>a.observe(t,{granularity:"entity",onSet:h,onAdd:h,onRemove:g,onDisable:g,onEnable:h,access:l,yieldExisting:u}))}),{map:i,dispose:()=>{for(let t=0;t<o.length;t++)o[t].dispose()}}}function T(a,n,s,r,i={}){const l={};for(let e=0;e<r.length;e++)l[r[e]]=0;const[u,d]=i.into??p.reactiveStruct(l),b=f.untrack(()=>r.map(e=>u[e])),h={...i.access,reads:[n,...i.access?.reads??[]]},g=i.seedExisting??!0,o=e=>{for(let y=0;y<r.length;y++)d[r[y]](e.getField(s,n,r[y]))},t=()=>{for(let e=0;e<r.length;e++)d[r[e]](b[e])};let c;return f.batch(()=>{c=a.observe(n,{granularity:"entity",onSet:(e,y)=>{e===s&&o(y)},onAdd:(e,y)=>{e===s&&!y.isDisabled(s)&&o(y)},onRemove:e=>{e===s&&t()},onDisable:e=>{e===s&&t()},onEnable:(e,y)=>{e===s&&o(y)},access:h,yieldExisting:g})}),{struct:u,dispose:()=>c.dispose()}}function x(a,n,s,r,i={}){const l=i.into??p.reactiveArray(new Array(r.length).fill(0),i.eq),u=f.untrack(()=>l.snapshot());if(i.into!==void 0&&u.length!==r.length)throw new Error(`syncSingletonToArray: into.length (${u.length}) must equal fields.length (${r.length})`);const d={...i.access,reads:[n,...i.access?.reads??[]]},b=i.seedExisting??!0,h=new Array(r.length),g=c=>{for(let e=0;e<r.length;e++)h[e]=c.getField(s,n,r[e]);l.reconcile(h)},o=()=>l.reconcile(u);let t;return f.batch(()=>{t=a.observe(n,{granularity:"entity",onSet:(c,e)=>{c===s&&g(e)},onAdd:(c,e)=>{c===s&&!e.isDisabled(s)&&g(e)},onRemove:c=>{c===s&&o()},onDisable:c=>{c===s&&o()},onEnable:(c,e)=>{c===s&&g(e)},access:d,yieldExisting:b})}),{array:l,dispose:()=>t.dispose()}}function A(a,n){f.batch(()=>a.update(n))}exports.batchedUpdate=A;exports.shallow=_;exports.syncComponentToMap=m;exports.syncFieldsToMap=S;exports.syncJoinToMap=R;exports.syncSingletonToArray=x;exports.syncSingletonToStruct=T;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The production ECS→UI reactive bridge (#672 / ADR-0021).
3
+ *
4
+ * Drains the engine's own change detection (ADR-0013 component observers, riding
5
+ * the ADR-0012 per-row dirty list) into a `reactiveMap` — publishing O(changed),
6
+ * not O(all), each tick. Declarative selection + closure projection (the Bevy
7
+ * `ExtractComponent` / WatermelonDB `observeWithColumns` shape):
8
+ * - `syncComponentToMap(def, project)` — one component, grain `"entity"`/`"column"`.
9
+ * - `syncFieldsToMap(def, [fields])` — field-list sugar with auto `shallow` eq.
10
+ * - `syncJoinToMap([defs], project)` — multi-component join (subscribes all defs).
11
+ *
12
+ * For singleton/ephemeral UI state (net status+latency, FPS/mem, wave timer), model
13
+ * it as a component on a reserved singleton entity and read it keyless via per-field
14
+ * channels (#687 / ADR-0024) — NOT a separate reactive-resource subsystem:
15
+ * - `syncSingletonToStruct(def, eid, [fields])` — one singleton entity → `reactiveStruct`.
16
+ * - `syncSingletonToArray(def, eid, [fields])` — one singleton entity → `reactiveArray` (ordered slots).
17
+ *
18
+ * The framework-agnostic counterpart to the Solid leaf: pair the map entry points
19
+ * with `@oasys/oecs/solid`'s `fromKernelMap`, the singleton struct with
20
+ * `fromKernelStruct`, and the singleton array with `fromKernelArray`, to render.
21
+ */
22
+ export { syncComponentToMap, syncFieldsToMap, syncJoinToMap, syncSingletonToStruct, syncSingletonToArray, batchedUpdate, shallow, type Projection, type JoinProjection, type RowReader, type JoinReader, type SyncGrain, type EcsMapSync, type EcsMapSyncOptions, type SingletonStructSync, type SingletonSyncOptions, type SingletonArraySync, type SingletonArraySyncOptions } from './ecs_sync';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/reactive/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,OAAO,EACP,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,MAAM,YAAY,CAAC"}
@@ -0,0 +1,225 @@
1
+ import { b as f, u as _ } from "../../kernel-DgyrLFjW.js";
2
+ import { r as p, a as m, b as E } from "../../array-uFR7Q8fU.js";
3
+ function w(a, n) {
4
+ if (Object.is(a, n)) return !0;
5
+ const s = a, r = n, o = Object.keys(s);
6
+ if (o.length !== Object.keys(r).length) return !1;
7
+ for (let l = 0; l < o.length; l++) {
8
+ const u = o[l];
9
+ if (!Object.prototype.hasOwnProperty.call(r, u) || !Object.is(s[u], r[u])) return !1;
10
+ }
11
+ return !0;
12
+ }
13
+ class v {
14
+ constructor(n) {
15
+ this.def = n;
16
+ }
17
+ _ctx;
18
+ _eid = 0;
19
+ get eid() {
20
+ return this._eid;
21
+ }
22
+ field(n) {
23
+ return this._ctx.getField(this._eid, this.def, n);
24
+ }
25
+ }
26
+ class R {
27
+ constructor(n) {
28
+ this.def = n;
29
+ }
30
+ _eid = 0;
31
+ _row = 0;
32
+ cols = /* @__PURE__ */ new Map();
33
+ arch;
34
+ /** Bind to an archetype for one dispatch (drops the previous column cache). */
35
+ bind(n) {
36
+ this.arch = n, this.cols.clear();
37
+ }
38
+ get eid() {
39
+ return this._eid;
40
+ }
41
+ field(n) {
42
+ let s = this.cols.get(n);
43
+ return s === void 0 && (s = this.arch.getColumnRead(this.def, n), this.cols.set(n, s)), s[this._row];
44
+ }
45
+ }
46
+ class x {
47
+ _ctx;
48
+ _eid = 0;
49
+ get eid() {
50
+ return this._eid;
51
+ }
52
+ field(n, s) {
53
+ return this._ctx.getField(this._eid, n, s);
54
+ }
55
+ }
56
+ function A(a, n, s, r = {}) {
57
+ const o = p(r.eq), l = {
58
+ ...r.access,
59
+ reads: [n, ...r.access?.reads ?? []]
60
+ }, u = r.grain ?? "entity", d = r.seedExisting ?? !0, b = new v(n), h = (i, t) => {
61
+ t.isDisabled(i) || (b._ctx = t, b._eid = i, o.set(i, s(b)));
62
+ };
63
+ let g;
64
+ return f(() => {
65
+ if (u === "column") {
66
+ const i = new R(n);
67
+ g = a.observe(n, {
68
+ granularity: "archetype",
69
+ onSet: (t) => {
70
+ i.bind(t);
71
+ const c = t.entityIds;
72
+ for (let e = 0; e < t.entityCount; e++)
73
+ i._row = e, i._eid = c[e], o.set(i._eid, s(i));
74
+ },
75
+ onAdd: (t, c) => h(t, c),
76
+ onRemove: (t) => o.delete(t),
77
+ // Disable = soft remove from the channel; enable = re-add (#677). The
78
+ // column sweep is bounded by enabled rows, so a disabled row would never
79
+ // refresh — drop it on disable, republish on enable.
80
+ onDisable: (t) => o.delete(t),
81
+ onEnable: (t, c) => h(t, c),
82
+ access: l,
83
+ yieldExisting: d
84
+ });
85
+ } else
86
+ g = a.observe(n, {
87
+ granularity: "entity",
88
+ onSet: (i, t) => h(i, t),
89
+ onAdd: (i, t) => h(i, t),
90
+ onRemove: (i) => o.delete(i),
91
+ onDisable: (i) => o.delete(i),
92
+ onEnable: (i, t) => h(i, t),
93
+ access: l,
94
+ yieldExisting: d
95
+ });
96
+ }), { map: o, dispose: () => g.dispose() };
97
+ }
98
+ function j(a, n, s, r = {}) {
99
+ return A(a, n, (l) => {
100
+ const u = {};
101
+ for (let d = 0; d < s.length; d++) u[s[d]] = l.field(s[d]);
102
+ return u;
103
+ }, { ...r, eq: w });
104
+ }
105
+ function M(a, n, s, r = {}) {
106
+ const o = p(r.eq), l = {
107
+ ...r.access,
108
+ reads: [...n, ...r.access?.reads ?? []]
109
+ }, u = r.seedExisting ?? !0, d = new x(), b = (t, c) => {
110
+ for (let e = 0; e < n.length; e++) if (!t.hasComponent(c, n[e])) return !1;
111
+ return !0;
112
+ }, h = (t, c) => {
113
+ c.isDisabled(t) || b(c, t) && (d._ctx = c, d._eid = t, o.set(t, s(d)));
114
+ }, g = (t) => {
115
+ o.delete(t);
116
+ };
117
+ let i;
118
+ return f(() => {
119
+ i = n.map(
120
+ (t) => a.observe(t, {
121
+ granularity: "entity",
122
+ onSet: h,
123
+ onAdd: h,
124
+ onRemove: g,
125
+ // Disabling any joined component soft-removes the entity from the
126
+ // channel; enabling re-evaluates membership and republishes (#677). A
127
+ // disable fires once per carried joined component — `dropRow` is
128
+ // idempotent, and `publishIfMember` re-checks the full join.
129
+ onDisable: g,
130
+ onEnable: h,
131
+ access: l,
132
+ yieldExisting: u
133
+ })
134
+ );
135
+ }), {
136
+ map: o,
137
+ dispose: () => {
138
+ for (let t = 0; t < i.length; t++) i[t].dispose();
139
+ }
140
+ };
141
+ }
142
+ function O(a, n, s, r, o = {}) {
143
+ const l = {};
144
+ for (let e = 0; e < r.length; e++) l[r[e]] = 0;
145
+ const [u, d] = o.into ?? m(l), b = _(() => r.map((e) => u[e])), h = {
146
+ ...o.access,
147
+ reads: [n, ...o.access?.reads ?? []]
148
+ }, g = o.seedExisting ?? !0, i = (e) => {
149
+ for (let y = 0; y < r.length; y++) d[r[y]](e.getField(s, n, r[y]));
150
+ }, t = () => {
151
+ for (let e = 0; e < r.length; e++) d[r[e]](b[e]);
152
+ };
153
+ let c;
154
+ return f(() => {
155
+ c = a.observe(n, {
156
+ granularity: "entity",
157
+ onSet: (e, y) => {
158
+ e === s && i(y);
159
+ },
160
+ onAdd: (e, y) => {
161
+ e === s && !y.isDisabled(s) && i(y);
162
+ },
163
+ onRemove: (e) => {
164
+ e === s && t();
165
+ },
166
+ onDisable: (e) => {
167
+ e === s && t();
168
+ },
169
+ onEnable: (e, y) => {
170
+ e === s && i(y);
171
+ },
172
+ access: h,
173
+ yieldExisting: g
174
+ });
175
+ }), { struct: u, dispose: () => c.dispose() };
176
+ }
177
+ function T(a, n, s, r, o = {}) {
178
+ const l = o.into ?? E(new Array(r.length).fill(0), o.eq), u = _(() => l.snapshot());
179
+ if (o.into !== void 0 && u.length !== r.length)
180
+ throw new Error(
181
+ `syncSingletonToArray: into.length (${u.length}) must equal fields.length (${r.length})`
182
+ );
183
+ const d = {
184
+ ...o.access,
185
+ reads: [n, ...o.access?.reads ?? []]
186
+ }, b = o.seedExisting ?? !0, h = new Array(r.length), g = (c) => {
187
+ for (let e = 0; e < r.length; e++) h[e] = c.getField(s, n, r[e]);
188
+ l.reconcile(h);
189
+ }, i = () => l.reconcile(u);
190
+ let t;
191
+ return f(() => {
192
+ t = a.observe(n, {
193
+ granularity: "entity",
194
+ onSet: (c, e) => {
195
+ c === s && g(e);
196
+ },
197
+ onAdd: (c, e) => {
198
+ c === s && !e.isDisabled(s) && g(e);
199
+ },
200
+ onRemove: (c) => {
201
+ c === s && i();
202
+ },
203
+ onDisable: (c) => {
204
+ c === s && i();
205
+ },
206
+ onEnable: (c, e) => {
207
+ c === s && g(e);
208
+ },
209
+ access: d,
210
+ yieldExisting: b
211
+ });
212
+ }), { array: l, dispose: () => t.dispose() };
213
+ }
214
+ function k(a, n) {
215
+ f(() => a.update(n));
216
+ }
217
+ export {
218
+ k as batchedUpdate,
219
+ w as shallow,
220
+ A as syncComponentToMap,
221
+ j as syncFieldsToMap,
222
+ M as syncJoinToMap,
223
+ T as syncSingletonToArray,
224
+ O as syncSingletonToStruct
225
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("solid-js"),c=require("../../interop-CT-REx0W.cjs");function l(e){const[t,o]=u.createSignal(e());return u.onCleanup(c.subscribe(e,s=>o(()=>s))),t}function f(e){return{keys:l(()=>e.keys()),cell:t=>l(()=>e.get(t))}}function i(e){const t={},o=Object.keys(e),s=new Set(o);for(const n of o)t[n]=l(()=>e[n]);return new Proxy({},{get:(n,r)=>s.has(r)?t[r]():Reflect.get(n,r),has:(n,r)=>s.has(r),ownKeys:()=>o,getOwnPropertyDescriptor:(n,r)=>s.has(r)?{get:()=>t[r](),enumerable:!0,configurable:!0}:void 0})}function a(e){return l(()=>e.snapshot())}exports.fromKernel=l;exports.fromKernelArray=a;exports.fromKernelMap=f;exports.fromKernelStruct=i;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `@oasys/oecs/solid` — the SolidJS adapter plugin for oecs's reactive
3
+ * kernel (`@oasys/oecs/reactive` / `../../core/reactive`, #646 / ADR-0021).
4
+ */
5
+ export { fromKernel, fromKernelMap, fromKernelStruct, fromKernelArray, type KernelMapView } from './kernel_solid';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/solid/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,KAAK,aAAa,EAClB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { createSignal as c, onCleanup as u } from "solid-js";
2
+ import { s as a } from "../../interop-CcY6ASQc.js";
3
+ function f(e) {
4
+ const [t, o] = c(e());
5
+ return u(a(e, (s) => o(() => s))), t;
6
+ }
7
+ function g(e) {
8
+ return {
9
+ keys: f(() => e.keys()),
10
+ cell: (t) => f(() => e.get(t))
11
+ };
12
+ }
13
+ function m(e) {
14
+ const t = {}, o = Object.keys(e), s = new Set(o);
15
+ for (const n of o)
16
+ t[n] = f(() => e[n]);
17
+ return new Proxy({}, {
18
+ get: (n, r) => s.has(r) ? t[r]() : Reflect.get(n, r),
19
+ has: (n, r) => s.has(r),
20
+ ownKeys: () => o,
21
+ getOwnPropertyDescriptor: (n, r) => s.has(r) ? { get: () => t[r](), enumerable: !0, configurable: !0 } : void 0
22
+ });
23
+ }
24
+ function y(e) {
25
+ return f(() => e.snapshot());
26
+ }
27
+ export {
28
+ f as fromKernel,
29
+ y as fromKernelArray,
30
+ g as fromKernelMap,
31
+ m as fromKernelStruct
32
+ };
@@ -0,0 +1,42 @@
1
+ import { Accessor } from 'solid-js';
2
+ import { ReactiveArray, ReactiveMap } from '../../core/reactive';
3
+ /**
4
+ * Mirror a kernel accessor into a Solid accessor. The returned accessor tracks in
5
+ * Solid; it updates once per coalesced kernel change and never on an equal write.
6
+ */
7
+ export declare function fromKernel<T>(accessor: () => T): Accessor<T>;
8
+ /** A kernel `reactiveMap` projected for a keyed Solid `<For>`. */
9
+ export interface KernelMapView<K, V> {
10
+ /** The live key set — pass to a keyed Solid `<For each>`. Keyed on the id. */
11
+ readonly keys: Accessor<readonly K[]>;
12
+ /** A bridged value accessor for one key — read inside the `<For>` row. */
13
+ cell(key: K): Accessor<V | undefined>;
14
+ }
15
+ /**
16
+ * Bridge a kernel `reactiveMap` for keyed Solid rendering. `keys` drives a `<For>`
17
+ * (one row per entity, keyed on the stable id); `cell(id)` is that row's bridged
18
+ * value. Changing one entity wakes only its row; spawn/despawn add/remove one row.
19
+ */
20
+ export declare function fromKernelMap<K, V>(map: ReactiveMap<K, V>): KernelMapView<K, V>;
21
+ /**
22
+ * Bridge a kernel `reactiveStruct` proxy into a Solid-reactive proxy: reading
23
+ * `view.field` in a Solid scope tracks that field alone (one `fromKernel` per
24
+ * field), so a change to one field re-renders only its readers. Completes the
25
+ * `fromKernel` / `fromKernelMap` / `fromKernelStruct` trio — the read side for the
26
+ * singleton/ephemeral UI state `syncSingletonToStruct` publishes (ADR-0024). The
27
+ * field set is read once from the (enumerable) struct proxy; call inside a component
28
+ * or `root` so each field's `onCleanup` has an owner. The kernel struct's per-field
29
+ * `eq` and batching carry through `fromKernel` unchanged.
30
+ */
31
+ export declare function fromKernelStruct<T extends object>(struct: T): T;
32
+ /**
33
+ * Bridge a kernel `reactiveArray` into a Solid accessor of its snapshot, for a
34
+ * positional Solid `<Index each={view()}>`. `<Index>` (NOT `<For>`) is the match for
35
+ * an ordered slot list: it keys by position and hands each slot an accessor, so
36
+ * duplicate primitive values (e.g. empty army slots) don't alias and a slot change
37
+ * updates only that row. The snapshot is the array's coarse read (any slot change
38
+ * wakes it), but `<Index>` then diffs by position and touches only the changed
39
+ * index's DOM. Use `fromKernelMap` instead for an *entity* collection (keyed, `<For>`).
40
+ */
41
+ export declare function fromKernelArray<T>(arr: ReactiveArray<T>): Accessor<readonly T[]>;
42
+ //# sourceMappingURL=kernel_solid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel_solid.d.ts","sourceRoot":"","sources":["../../../src/extensions/solid/kernel_solid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAI5D;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACtC,0EAA0E;IAC1E,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAK/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAoB/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAEhF"}