@almadar/std 17.0.3 → 17.1.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 (313) hide show
  1. package/behaviors/lolo/auth/atoms/std-dev-personas.lolo +27 -2
  2. package/behaviors/lolo/cli/atoms/std-orb-goldens.lolo +6 -3
  3. package/behaviors/lolo/cli/atoms/std-orb-lint-mem-handles.lolo +54 -34
  4. package/behaviors/lolo/cli/atoms/std-orb-lint-os-grants.lolo +4 -4
  5. package/behaviors/lolo/cli/atoms/std-orb-mcp.lolo +16 -21
  6. package/behaviors/lolo/cli/atoms/std-orb-serve.lolo +24 -4
  7. package/behaviors/lolo/codec/atoms/std-lolo-kotlin.lolo +26 -3
  8. package/behaviors/lolo/codec/atoms/std-lolo-python.lolo +15 -2
  9. package/behaviors/lolo/codec/atoms/std-lolo-rust.lolo +27 -2
  10. package/behaviors/lolo/codec/atoms/std-lolo-source.lolo +251 -60
  11. package/behaviors/lolo/codec/atoms/std-lolo-swift.lolo +24 -1
  12. package/behaviors/lolo/codec/atoms/std-lolo-typescript.lolo +24 -3
  13. package/behaviors/lolo/connect/atoms/std-meta-ads.lolo +4 -4
  14. package/behaviors/lolo/connect/atoms/std-stdio-lines.lolo +7 -4
  15. package/behaviors/lolo/connect/atoms/std-youtube.lolo +9 -9
  16. package/behaviors/lolo/dev/atoms/std-guest-session.lolo +122 -10
  17. package/behaviors/lolo/dev/atoms/std-mock-seed-marks.lolo +66 -0
  18. package/behaviors/lolo/dev/organisms/std-behavior-playground.lolo +5 -2
  19. package/behaviors/lolo/dev/organisms/std-launchpad.lolo +4 -3
  20. package/behaviors/lolo/gpu/atoms/std-gpu-compute.lolo +329 -0
  21. package/behaviors/lolo/net/atoms/std-http-client.lolo +4 -4
  22. package/behaviors/lolo/net/atoms/std-http-fetch.lolo +6 -6
  23. package/behaviors/lolo/net/atoms/std-npm-lookup.lolo +1 -1
  24. package/behaviors/lolo/net/atoms/std-npm-registry.lolo +2 -2
  25. package/behaviors/lolo/spec/auth/dev-personas.replay.goldens.json +263 -2
  26. package/behaviors/lolo/spec/cli/lint-all.lolo +1 -0
  27. package/behaviors/lolo/spec/cli/lint-item-action-event.replay.goldens.json +9 -9
  28. package/behaviors/lolo/spec/cli/lint-mem-handles.replay.goldens.json +3021 -1
  29. package/behaviors/lolo/spec/cli/lint-os-grants.replay.goldens.json +284 -12
  30. package/behaviors/lolo/spec/cli/mcp-server.replay.goldens.json +51 -55
  31. package/behaviors/lolo/spec/cli/orb-compile.replay.goldens.json +10 -4
  32. package/behaviors/lolo/spec/codec/lolo-kotlin.replay.goldens.json +7496 -7497
  33. package/behaviors/lolo/spec/codec/lolo-python.replay.goldens.json +341 -3
  34. package/behaviors/lolo/spec/codec/lolo-rust.replay.goldens.json +18931 -6142
  35. package/behaviors/lolo/spec/codec/lolo-source.fixtures/compose-pair.lolo +44 -0
  36. package/behaviors/lolo/spec/codec/lolo-source.fixtures/config-read.lolo +2 -1
  37. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-default.lolo +2 -1
  38. package/behaviors/lolo/spec/codec/lolo-source.fixtures/divide-plain.lolo +2 -1
  39. package/behaviors/lolo/spec/codec/lolo-source.fixtures/get-past-end.lolo +2 -1
  40. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-call.lolo +2 -1
  41. package/behaviors/lolo/spec/codec/lolo-source.fixtures/list-plain.lolo +2 -1
  42. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-binary.lolo +2 -1
  43. package/behaviors/lolo/spec/codec/lolo-source.fixtures/minus-unary.lolo +2 -1
  44. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nested-let.lolo +2 -1
  45. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-machine.lolo +2 -1
  46. package/behaviors/lolo/spec/codec/lolo-source.fixtures/no-template.lolo +2 -1
  47. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-past-end.lolo +2 -1
  48. package/behaviors/lolo/spec/codec/lolo-source.fixtures/nth-raw.lolo +2 -1
  49. package/behaviors/lolo/spec/codec/lolo-source.fixtures/ports-call.lolo +2 -1
  50. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-one.lolo +2 -1
  51. package/behaviors/lolo/spec/codec/lolo-source.fixtures/range-two.lolo +2 -1
  52. package/behaviors/lolo/spec/codec/lolo-source.fixtures/router-trio.lolo +88 -0
  53. package/behaviors/lolo/spec/codec/lolo-source.fixtures/store-pair.lolo +62 -0
  54. package/behaviors/lolo/spec/codec/lolo-source.fixtures/string-literal.lolo +2 -1
  55. package/behaviors/lolo/spec/codec/lolo-source.gen/knobs.py +27 -1
  56. package/behaviors/lolo/spec/codec/lolo-source.gen/src_assemble.in +54 -2
  57. package/behaviors/lolo/spec/codec/lolo-source.gen/src_finish.in +1 -1
  58. package/behaviors/lolo/spec/codec/lolo-source.gen/src_fold.in +24 -4
  59. package/behaviors/lolo/spec/codec/lolo-source.gen/src_head.in +8 -3
  60. package/behaviors/lolo/spec/codec/lolo-source.gen/src_prepare.in +6 -2
  61. package/behaviors/lolo/spec/codec/lolo-source.gen/src_trait.in +12 -2
  62. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.lolo +2 -1
  63. package/behaviors/lolo/spec/codec/lolo-source.parity/agent-step.server.lolo +1 -0
  64. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.lolo +2 -1
  65. package/behaviors/lolo/spec/codec/lolo-source.parity/chunk.server.lolo +1 -0
  66. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.events.json +36 -0
  67. package/behaviors/lolo/spec/codec/lolo-source.parity/compose-pair.replay.goldens.json +91 -0
  68. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.lolo +2 -1
  69. package/behaviors/lolo/spec/codec/lolo-source.parity/cosine.server.lolo +1 -0
  70. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/compose-pair.kt +31 -0
  71. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/router-trio.kt +31 -0
  72. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/kotlin/store-pair.kt +31 -0
  73. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/compose-pair.py +18 -0
  74. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/router-trio.py +18 -0
  75. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/python/store-pair.py +17 -0
  76. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/compose-pair.rs +37 -0
  77. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/router-trio.rs +37 -0
  78. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/rust/store-pair.rs +36 -0
  79. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/compose-pair.swift +24 -0
  80. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/router-trio.swift +24 -0
  81. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/swift/store-pair.swift +23 -0
  82. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/compose-pair.mts +24 -0
  83. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/router-trio.mts +24 -0
  84. package/behaviors/lolo/spec/codec/lolo-source.parity/drivers/typescript/store-pair.mts +22 -0
  85. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.lolo +2 -1
  86. package/behaviors/lolo/spec/codec/lolo-source.parity/recall-at-k.server.lolo +1 -0
  87. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.events.json +18 -0
  88. package/behaviors/lolo/spec/codec/lolo-source.parity/router-trio.replay.goldens.json +87 -0
  89. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.events.json +58 -0
  90. package/behaviors/lolo/spec/codec/lolo-source.parity/store-pair.replay.goldens.json +238 -0
  91. package/behaviors/lolo/spec/codec/lolo-swift.replay.goldens.json +15599 -2204
  92. package/behaviors/lolo/spec/codec/lolo-typescript.replay.goldens.json +28930 -28929
  93. package/behaviors/lolo/spec/connect/bearer-api.replay.goldens.json +1 -1
  94. package/behaviors/lolo/spec/connect/esign.replay.goldens.json +3 -3
  95. package/behaviors/lolo/spec/connect/github.replay.goldens.json +13 -13
  96. package/behaviors/lolo/spec/connect/google-calendar.replay.goldens.json +2 -2
  97. package/behaviors/lolo/spec/connect/image.replay.goldens.json +1 -1
  98. package/behaviors/lolo/spec/connect/meta-ads.replay.goldens.json +2 -2
  99. package/behaviors/lolo/spec/connect/stdio-lines.replay.goldens.json +90 -0
  100. package/behaviors/lolo/spec/connect/twilio.replay.goldens.json +2 -2
  101. package/behaviors/lolo/spec/connect/youtube.replay.goldens.json +1 -1
  102. package/behaviors/lolo/spec/dev/guest-session.replay.goldens.json +824 -0
  103. package/behaviors/lolo/spec/dev/mock-seed-marks.replay.goldens.json +365 -0
  104. package/behaviors/lolo/spec/dev/verify-walk.replay.goldens.json +2 -1
  105. package/behaviors/lolo/spec/gpu/gpu-compute.replay.goldens.json +784 -0
  106. package/behaviors/lolo/spec/mem/mem-buffer.replay.goldens.json +97 -1
  107. package/behaviors/lolo/spec/ml/vector-write.goldens.json +1 -1
  108. package/behaviors/lolo/spec/ml/vector-write.replay.goldens.json +2 -2
  109. package/behaviors/lolo/spec/net/http-client-call-host.replay.goldens.json +3 -3
  110. package/behaviors/lolo/spec/net/http-client-env-host.replay.goldens.json +3 -3
  111. package/behaviors/lolo/spec/net/http-client.replay.goldens.json +56 -56
  112. package/behaviors/lolo/spec/net/http-fetch.replay.goldens.json +2 -2
  113. package/behaviors/lolo/spec/net/npm-lookup.replay.goldens.json +1 -1
  114. package/behaviors/lolo/spec/net/npm-registry.replay.goldens.json +2 -2
  115. package/behaviors/lolo/spec/net/server-declared-traits.replay.goldens.json +6 -3
  116. package/behaviors/lolo/spec/net/server-external-inputs.replay.goldens.json +16 -8
  117. package/behaviors/lolo/spec/net/server-retargeted-leg.replay.goldens.json +4 -2
  118. package/behaviors/lolo/spec/net/server-untargeted-discovery.replay.goldens.json +50 -45
  119. package/behaviors/lolo/spec/ops/llm-spend-board.replay.goldens.json +112 -16
  120. package/behaviors/lolo/spec/store/firestore-twin.replay.goldens.json +1 -1
  121. package/behaviors/lolo/spec/store/row-store-postgres.gen/record_real_sql.py +1 -1
  122. package/behaviors/lolo/spec/ui/game/fx-particles.replay.goldens.json +37 -0
  123. package/behaviors/lolo/ui/avl/atoms/std-avl-cosmic-zoom.lolo +2 -2
  124. package/behaviors/lolo/ui/game/atoms/std-fx-particles.lolo +10 -1
  125. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +4 -4
  126. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +9 -9
  127. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +4 -4
  128. package/behaviors/lolo/ui/game/organisms/std-dungeon-board-2d.lolo +5 -5
  129. package/behaviors/lolo/ui/game/organisms/std-market-board-3d.lolo +9 -9
  130. package/behaviors/lolo/ui/game/organisms/std-objective-board-3d.lolo +9 -9
  131. package/behaviors/lolo/ui/game/organisms/std-platformer-board-2d.lolo +5 -5
  132. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +4 -4
  133. package/behaviors/lolo/ui/game/organisms/std-survival-board-3d.lolo +9 -9
  134. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +5 -5
  135. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +9 -9
  136. package/behaviors/registry/auth/atoms/std-dev-personas.orb +1 -1
  137. package/behaviors/registry/cli/atoms/std-orb-goldens.orb +1 -1
  138. package/behaviors/registry/cli/atoms/std-orb-lint-mem-handles.orb +1 -1
  139. package/behaviors/registry/cli/atoms/std-orb-lint-os-grants.orb +1 -1
  140. package/behaviors/registry/cli/atoms/std-orb-mcp.orb +1 -1
  141. package/behaviors/registry/cli/atoms/std-orb-serve.orb +1 -1
  142. package/behaviors/registry/codec/atoms/std-lolo-kotlin.orb +1 -1
  143. package/behaviors/registry/codec/atoms/std-lolo-python.orb +1 -1
  144. package/behaviors/registry/codec/atoms/std-lolo-rust.orb +1 -1
  145. package/behaviors/registry/codec/atoms/std-lolo-source.orb +1 -1
  146. package/behaviors/registry/codec/atoms/std-lolo-swift.orb +1 -1
  147. package/behaviors/registry/codec/atoms/std-lolo-typescript.orb +1 -1
  148. package/behaviors/registry/connect/atoms/std-meta-ads.orb +1 -1
  149. package/behaviors/registry/connect/atoms/std-stdio-lines.orb +1 -1
  150. package/behaviors/registry/connect/atoms/std-youtube.orb +1 -1
  151. package/behaviors/registry/dev/atoms/std-guest-session.orb +1 -1
  152. package/behaviors/registry/dev/atoms/std-mock-seed-marks.orb +1 -0
  153. package/behaviors/registry/dev/organisms/std-behavior-playground.orb +37 -0
  154. package/behaviors/registry/dev/organisms/std-launchpad.orb +25 -0
  155. package/behaviors/registry/gpu/atoms/std-gpu-compute.orb +1 -0
  156. package/behaviors/registry/net/atoms/std-http-client.orb +1 -1
  157. package/behaviors/registry/net/atoms/std-http-fetch.orb +1 -1
  158. package/behaviors/registry/net/atoms/std-npm-lookup.orb +1 -1
  159. package/behaviors/registry/net/atoms/std-npm-registry.orb +1 -1
  160. package/behaviors/registry/spec/cli/lint-all.orb +1 -1
  161. package/behaviors/registry/spec/codec/lolo-source.fixtures/compose-pair.orb +1 -0
  162. package/behaviors/registry/spec/codec/lolo-source.fixtures/config-read.orb +1 -1
  163. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-default.orb +1 -1
  164. package/behaviors/registry/spec/codec/lolo-source.fixtures/divide-plain.orb +1 -1
  165. package/behaviors/registry/spec/codec/lolo-source.fixtures/get-past-end.orb +1 -1
  166. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-call.orb +1 -1
  167. package/behaviors/registry/spec/codec/lolo-source.fixtures/list-plain.orb +1 -1
  168. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-binary.orb +1 -1
  169. package/behaviors/registry/spec/codec/lolo-source.fixtures/minus-unary.orb +1 -1
  170. package/behaviors/registry/spec/codec/lolo-source.fixtures/nested-let.orb +1 -1
  171. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-machine.orb +1 -1
  172. package/behaviors/registry/spec/codec/lolo-source.fixtures/no-template.orb +1 -1
  173. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-past-end.orb +1 -1
  174. package/behaviors/registry/spec/codec/lolo-source.fixtures/nth-raw.orb +1 -1
  175. package/behaviors/registry/spec/codec/lolo-source.fixtures/ports-call.orb +1 -1
  176. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-one.orb +1 -1
  177. package/behaviors/registry/spec/codec/lolo-source.fixtures/range-two.orb +1 -1
  178. package/behaviors/registry/spec/codec/lolo-source.fixtures/router-trio.orb +1 -0
  179. package/behaviors/registry/spec/codec/lolo-source.fixtures/store-pair.orb +1 -0
  180. package/behaviors/registry/spec/codec/lolo-source.fixtures/string-literal.orb +1 -1
  181. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.orb +1 -1
  182. package/behaviors/registry/spec/codec/lolo-source.parity/agent-step.server.orb +1 -1
  183. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.orb +1 -1
  184. package/behaviors/registry/spec/codec/lolo-source.parity/chunk.server.orb +1 -1
  185. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.orb +1 -1
  186. package/behaviors/registry/spec/codec/lolo-source.parity/cosine.server.orb +1 -1
  187. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.orb +1 -1
  188. package/behaviors/registry/spec/codec/lolo-source.parity/recall-at-k.server.orb +1 -1
  189. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  190. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  191. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  192. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +20 -13
  193. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +9 -5
  194. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +17 -7
  195. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +19 -15
  196. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +15 -12
  197. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +17 -7
  198. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +4 -0
  199. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +15 -12
  200. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +13 -6
  201. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +14 -12
  202. package/canonical-operators.json +1426 -103
  203. package/dist/{chunk-EK22WRB6.js → chunk-2UGHBVU2.js} +2 -2
  204. package/dist/{chunk-GDMH5T4J.js → chunk-3DK7GI2C.js} +2 -2
  205. package/dist/chunk-3MDASC5C.js +26 -0
  206. package/dist/{chunk-K5ZI27PB.js → chunk-3PHO4RRF.js} +1 -1
  207. package/dist/{chunk-7IEMMYM6.js → chunk-4MJCLAZW.js} +1 -1
  208. package/dist/{chunk-W4IEV4BY.js → chunk-55JPIL7A.js} +2 -2
  209. package/dist/{chunk-RUGBZTV3.js → chunk-66BLZLFI.js} +1 -1
  210. package/dist/{chunk-YWFISV7L.js → chunk-66RAJFOD.js} +1 -1
  211. package/dist/{chunk-JWOWWGNZ.js → chunk-6ED4SUC6.js} +1 -1
  212. package/dist/{chunk-LL7P6EII.js → chunk-6KFCHNE2.js} +2 -2
  213. package/dist/{chunk-GFBL2TW6.js → chunk-A4QB3Y6L.js} +1 -1
  214. package/dist/chunk-BVWMLS32.js +123 -0
  215. package/dist/{chunk-5KQCGSNC.js → chunk-CRKVDCY7.js} +1 -1
  216. package/dist/{chunk-WHQDLLC3.js → chunk-EKWEY4OJ.js} +1 -1
  217. package/dist/{chunk-Y3BRVNYK.js → chunk-EU22GCGV.js} +2 -2
  218. package/dist/{chunk-XQPYTDZ4.js → chunk-FB6PKNRS.js} +1 -1
  219. package/dist/{chunk-UX3MDFX6.js → chunk-FSVOJQLP.js} +1 -1
  220. package/dist/{chunk-LDBD2FBQ.js → chunk-GAKLBWBR.js} +1 -1
  221. package/dist/{chunk-C3IEMPRZ.js → chunk-GO3FKBV2.js} +2 -2
  222. package/dist/{chunk-LZSPEHSM.js → chunk-GPDTJHYY.js} +1 -1
  223. package/dist/{chunk-W5ABMOXU.js → chunk-JQBWLH5V.js} +1 -1
  224. package/dist/{chunk-63X6RNY6.js → chunk-KKW3JHTC.js} +1 -1
  225. package/dist/{chunk-5PLJE42Q.js → chunk-LF2EZVAM.js} +1 -1
  226. package/dist/{chunk-RXWBYWQB.js → chunk-LGCKOZP3.js} +2 -2
  227. package/dist/{chunk-JJEADYP7.js → chunk-LMZ6XJFB.js} +2 -2
  228. package/dist/{chunk-CWYSQZJU.js → chunk-M2YQNSAZ.js} +2 -2
  229. package/dist/{chunk-GNCKJV3P.js → chunk-MKWHYBIS.js} +1 -1
  230. package/dist/{chunk-ZB2CLGEG.js → chunk-MXBGYTYF.js} +1 -1
  231. package/dist/{chunk-UN76TRSK.js → chunk-NH6MXHZR.js} +41 -41
  232. package/dist/{chunk-II2VW7T6.js → chunk-ODBIX4DB.js} +1 -1
  233. package/dist/{chunk-3F3CNWOG.js → chunk-OYDQR6DT.js} +2 -2
  234. package/dist/{chunk-FVL6BT6L.js → chunk-PD6POR44.js} +1 -1
  235. package/dist/{chunk-U6USXZ5M.js → chunk-PHFT3QNS.js} +2 -2
  236. package/dist/{chunk-RJYKIZMS.js → chunk-PQZ6PVKG.js} +2 -2
  237. package/dist/{chunk-TQPQXCSZ.js → chunk-Q6NHXIOZ.js} +2 -2
  238. package/dist/{chunk-KYGWVCTM.js → chunk-QMDVYTB7.js} +1 -1
  239. package/dist/{chunk-XKTATY45.js → chunk-RW2KMSG5.js} +4 -4
  240. package/dist/{chunk-UHNSPTFT.js → chunk-SA2ZS24W.js} +1 -1
  241. package/dist/{chunk-6YPUQK36.js → chunk-SFWP4UMK.js} +2 -2
  242. package/dist/{chunk-ZZYLFHBU.js → chunk-TLNEQA4D.js} +1 -1
  243. package/dist/{chunk-RGTBRWWA.js → chunk-TOODE5AD.js} +2 -2
  244. package/dist/{chunk-QGWAHOFR.js → chunk-U57GY7SM.js} +2 -2
  245. package/dist/{chunk-FDJZKB7J.js → chunk-UIDQQJSX.js} +1 -1
  246. package/dist/{chunk-LLH3WXM3.js → chunk-UVFP2B7I.js} +1 -1
  247. package/dist/{chunk-4OF7727E.js → chunk-VEGZPCTZ.js} +2 -2
  248. package/dist/{chunk-73YUPNIT.js → chunk-VXN4V7LC.js} +1 -1
  249. package/dist/{chunk-4D3W6AAE.js → chunk-YHQVZWPG.js} +1 -1
  250. package/dist/{chunk-XXYBHYLM.js → chunk-YQO3TO66.js} +2 -2
  251. package/dist/{chunk-YZAYFR5A.js → chunk-ZSJ3GEOJ.js} +1 -1
  252. package/dist/index.d.ts +3 -3
  253. package/dist/index.js +50 -50
  254. package/dist/modules/anim.js +2 -2
  255. package/dist/modules/array.js +2 -2
  256. package/dist/modules/auth.js +3 -3
  257. package/dist/modules/behavior.js +2 -2
  258. package/dist/modules/bit.js +2 -2
  259. package/dist/modules/browser.js +2 -2
  260. package/dist/modules/bytes.js +2 -2
  261. package/dist/modules/codec.js +3 -3
  262. package/dist/modules/composition.js +2 -2
  263. package/dist/modules/core.js +2 -2
  264. package/dist/modules/csv.js +2 -2
  265. package/dist/modules/ffi.js +3 -3
  266. package/dist/modules/format.js +2 -2
  267. package/dist/modules/geo.js +2 -2
  268. package/dist/modules/gpu.d.ts +12 -0
  269. package/dist/modules/gpu.js +3 -0
  270. package/dist/modules/grid.js +2 -2
  271. package/dist/modules/i18n.js +2 -2
  272. package/dist/modules/index.d.ts +1 -2
  273. package/dist/modules/index.js +45 -46
  274. package/dist/modules/json.js +2 -2
  275. package/dist/modules/kernel.js +3 -3
  276. package/dist/modules/kv.js +3 -3
  277. package/dist/modules/llm.js +2 -2
  278. package/dist/modules/math.js +2 -2
  279. package/dist/modules/mem.js +3 -3
  280. package/dist/modules/object.js +2 -2
  281. package/dist/modules/os-common.d.ts +1 -1
  282. package/dist/modules/os-common.js +2 -2
  283. package/dist/modules/os-desktop.js +3 -3
  284. package/dist/modules/os-dev.js +3 -3
  285. package/dist/modules/os-dir.js +3 -3
  286. package/dist/modules/os-env-stdio.js +3 -3
  287. package/dist/modules/os-fs.js +3 -3
  288. package/dist/modules/os-net.js +3 -3
  289. package/dist/modules/os-path.js +3 -3
  290. package/dist/modules/os-process.js +3 -3
  291. package/dist/modules/os-sys.js +3 -3
  292. package/dist/modules/os-time-users.js +3 -3
  293. package/dist/modules/os.js +13 -13
  294. package/dist/modules/path.js +2 -2
  295. package/dist/modules/prob.js +2 -2
  296. package/dist/modules/program.js +2 -2
  297. package/dist/modules/session.js +2 -2
  298. package/dist/modules/str.js +2 -2
  299. package/dist/modules/time.js +2 -2
  300. package/dist/modules/validate.js +2 -2
  301. package/dist/modules/vector.js +2 -2
  302. package/dist/modules/workspace.js +2 -2
  303. package/dist/modules/xml.js +2 -2
  304. package/dist/modules/yaml.js +2 -2
  305. package/dist/registry.d.ts +2 -2
  306. package/dist/registry.js +49 -49
  307. package/dist/{types-BA4LkhNJ.d.ts → types-CgiGhK6t.d.ts} +17 -3
  308. package/package.json +5 -5
  309. package/dist/chunk-F5TP25JA.js +0 -26
  310. package/dist/chunk-NE4WSTN7.js +0 -26
  311. package/dist/modules/trace.d.ts +0 -15
  312. package/dist/modules/trace.js +0 -2
  313. /package/dist/{chunk-SHSBTDDX.js → chunk-QUQ33UXH.js} +0 -0
@@ -1 +1 @@
1
- {"typeContractVersion":1,"name":"std-lolo-rust","version":"2.0.0","description":"std-lolo-rust — renders .lolo source as Rust text, so a learner who reads an exercise written in .lolo can see the same program as Rust that compiles against the Rust shell's generated models and gives the kernel's answers. It is std-lolo-source with the Rust vocabulary in config and nothing else: LOLO_TO_RUST { source, path } answers RUST_RENDERED { text, warnings }, or RUST_RENDER_FAILED { error } when the source cannot be read or the request carries no path (the checker's types are required). Each trait becomes a struct holding state, entity, a ports callback and the emitted events, with one on_<event>(&mut self, payload: &<Trait><EVENT>Payload) method per event: an if / else if branch per transition (the from-state and the guard), the effects, then the new state; an emit records (event, the serde_json value of the payload built as the shell's generated payload type) in self.emitted. The entity and payload types are imported from crate::generated::entities and crate::generated::events, the modules the Rust shell generates. Numbers are f64. A failable operator (division, modulo, sqrt, ln, log10, pow, acos, asin, nth, first, last, to-int, avg, max, min) answers Option<f64> and default unwraps it. A set and every payload field convert the value with clone().into(), so a defaulted entity field (Option<T> in the shell's model) and a required one are written the same way, and a read of a defaulted entity field unwraps to its declared default. Kernel answers that are null or errors come from small helper functions written once, and only the ones the output uses; string length, slicing and padding count characters, and a count or index that is not a whole number panics as the kernel errors. An operator with no Rust template is a named warning and a stub that panics when run. persist, fetch, notify, navigate and call-service are called on the injected ports callback with the effect name and their arguments as JSON, and each is listed in warnings; render-ui is a comment. Limits: a trait's config knobs are not rendered; fields the checker types int are i64 in the shell's models and are not converted from f64; a literal dotted path in object/get is read as one flat key; array/zip needs two lists of one type; object/keys, values and entries have no template because the shell's maps are ordered by key while the kernel keeps insertion order. See std-lolo-source for the config knobs and the type placeholders.","orbitals":[{"name":"LoloRustOrbital","id":"orb_X00PV738MGMA8B8NN4V82TVQ1T","uses":[{"from":"almadar-std/lolo-rust","as":"Spec"},{"from":"std/behaviors/std-lolo-source","as":"Src"}],"entity":{"name":"LoloRustRun","id":"ent_K05G2RCBC65P36HPE1RMHT9T5A","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Src.traits.LoloSource","id":"trt_93N67H7PNRVAWBDYCH3GEMCJR2","name":"LoloRust","config":{"language":{"type":"unknown","default":"Rust","wired":true},"requiresTypes":{"type":"unknown","default":true,"wired":true},"operators":{"type":"unknown","default":{"/":"_div({{0}}, {{1}})","%":"_mod({{0}}, {{1}})","math/mod":"_mod({{0}}, {{1}})","str/len":"({{0}}.chars().count() as f64)","str/upper":"{{0}}.to_uppercase()","str/lower":"{{0}}.to_lowercase()","str/trim":"{{0}}.trim().to_string()","str/trimStart":"{{0}}.trim_start().to_string()","str/trimEnd":"{{0}}.trim_end().to_string()","str/capitalize":"_capitalize(&{{0}})","str/split":"_split(&{{0}}, &{{1}})","str/join":"_join(&{{0}}, &{{1}})","str/concat":"_concat!({{*}})","str/includes":"{{0}}.contains(&{{1}})","str/startsWith":"{{0}}.starts_with(&{{1}})","str/endsWith":"{{0}}.ends_with(&{{1}})","str/replace":"{{0}}.replacen(&{{1}}, &{{2}}, 1)","str/replaceAll":"{{0}}.replace(&{{1}}, &{{2}})","str/repeat":"_repeat(&{{0}}, {{1}})","str/reverse":"{{0}}.chars().rev().collect::<String>()","str/slice#2":"_str_slice(&{{0}}, {{1}}, None)","str/slice#3":"_str_slice(&{{0}}, {{1}}, Some({{2}}))","str/padStart#2":"_pad_start(&{{0}}, {{1}}, \" \")","str/padStart#3":"_pad_start(&{{0}}, {{1}}, &{{2}})","str/padEnd#2":"_pad_end(&{{0}}, {{1}}, \" \")","str/padEnd#3":"_pad_end(&{{0}}, {{1}}, &{{2}})","str/truncate#2":"_truncate(&{{0}}, {{1}}, \"...\")","str/truncate#3":"_truncate(&{{0}}, {{1}}, &{{2}})","str/to-int":"_to_int(&{{0}})","array/len":"({{0}}.len() as f64)","array/avg#1":"_avg(&{{0}})","array/max#1":"_amax(&{{0}})","array/min#1":"_amin(&{{0}})","array/first":"_first(&{{0}})","array/last":"_last(&{{0}})","array/nth":"_nth(&{{0}}, {{1}})","array/range#2":"_range({{0}}, {{1}}, 1_f64)","array/range#3":"_range({{0}}, {{1}}, {{2}})","array/slice#2":"_slice(&{{0}}, {{1}}, None)","array/slice#3":"_slice(&{{0}}, {{1}}, Some({{2}}))","array/take":"_take(&{{0}}, {{1}})","array/drop":"_drop(&{{0}}, {{1}})","array/takeLast":"_take_last(&{{0}}, {{1}})","array/dropLast":"_drop_last(&{{0}}, {{1}})","array/append":"_append(&{{0}}, {{1}}.clone())","array/prepend":"_prepend(&{{0}}, {{1}}.clone())","array/includes":"{{0}}.contains(&{{1}})","array/indexOf":"_index_of(&{{0}}, &{{1}})","array/reverse":"{{0}}.iter().rev().cloned().collect::<Vec<_>>()","array/unique":"_unique(&{{0}})","array/flatten":"_flatten(&{{0}})","array/zip":"_zip(&{{0}}, &{{1}})","array/concat":"_vconcat!({{*}})","array/reduce":"_reduce(&{{0}}, ({{1}}).clone(), {{2}})","list":"_list!({{*}})","object/get#2":"_get(&{{0}}, &{{1}})","object/get#3":"_get(&{{0}}, &{{1}}).unwrap_or(({{2}}).clone())","object/has":"{{0}}.contains_key(&{{1}})","object/merge#2":"_merge(&{{0}}, &{{1}})","object/pick":"_pick(&{{0}}, &{{1}})","object/omit":"_omit(&{{0}}, &{{1}})","math/abs":"({{0}}).abs()","math/ceil":"({{0}}).ceil()","math/floor":"({{0}}).floor()","math/sin":"({{0}}).sin()","math/cos":"({{0}}).cos()","math/tan":"({{0}}).tan()","math/atan":"({{0}}).atan()","math/atan2":"({{0}}).atan2({{1}})","math/hypot":"({{0}}).hypot({{1}})","math/max":"[{{*}}].iter().cloned().fold(f64::NEG_INFINITY, f64::max)","math/min":"[{{*}}].iter().cloned().fold(f64::INFINITY, f64::min)","math/round#2":"_round({{0}}, {{1}})","math/acos":"_acos({{0}})","math/asin":"_asin({{0}})","math/deg-rad":"({{0}}).to_radians()","math/rad-deg":"({{0}}).to_degrees()","math/lerp":"(({{0}}) + (({{1}}) - ({{0}})) * ({{2}}))","math/approach":"_approach({{0}}, {{1}}, {{2}})","math/map":"_map({{0}}, {{1}}, {{2}}, {{3}}, {{4}})","math/wrap":"_wrap({{0}}, {{1}}, {{2}})","array/insert":"_insert(&{{0}}, {{1}}, ({{2}}).clone())","array/remove":"_remove(&{{0}}, {{1}})","array/removeItem":"_remove_item(&{{0}}, &{{1}})","math/sqrt":"_sqrt({{0}})","math/ln":"_ln({{0}})","math/log10":"_log10({{0}})","math/pow":"_pow({{0}}, {{1}})","math/sign":"_sign({{0}})","math/clamp":"({{0}}).max({{1}}).min({{2}})","default":"_default(({{0}}).clone(), ({{1}}).clone())","as":"{{0}}","validate/min":"({{0}} >= {{1}})","validate/max":"({{0}} <= {{1}})","validate/range":"(({{1}} <= {{0}}) && ({{0}} <= {{2}}))","validate/oneOf":"{{1}}.contains(&{{0}})","validate/equals":"({{0}} == {{1}})"},"wired":true},"unary":{"type":"unknown","default":{"-":"(-{{0}})","not":"(!{{0}})","array/range":"_range(0_f64, {{0}}, 1_f64)","array/sum":"_sum(&{{0}})","array/count":"({{0}}.len() as f64)","array/sort":"_sort(&{{0}})","math/round":"_round({{0}}, 0_f64)","array/concat":"{{0}}.clone()","object/merge":"{{0}}.clone()"},"wired":true},"infix":{"type":"unknown","default":{"+":"+","-":"-","*":"*","=":"==","==":"==","!=":"!=","<":"<","<=":"<=",">":">",">=":">=","and":"&&","or":"||"},"wired":true},"infixForm":{"type":"unknown","default":"({{*}})","wired":true},"lambdaOperators":{"type":"unknown","default":{"array/map":"{{src}}.clone().into_iter().map(|{{vars}}| ({{body}}).clone()).collect::<Vec<_>>()","array/filter":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if {{body}} { Some({{item}}) } else { None }).collect::<Vec<_>>()","array/reject":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if !({{body}}) { Some({{item}}) } else { None }).collect::<Vec<_>>()","array/some":"{{src}}.clone().into_iter().any(|{{vars}}| {{body}})","array/every":"{{src}}.clone().into_iter().all(|{{vars}}| {{body}})","array/count":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if {{body}} { Some(1.0_f64) } else { None }).fold(0.0_f64, |s, x| s + x)","array/find":"{{src}}.clone().into_iter().find_map(|{{vars}}| if {{body}} { Some({{item}}) } else { None })","array/findIndex":"{{src}}.clone().into_iter().enumerate().find_map(|(i_, {{vars}})| if {{body}} { Some(i_ as f64) } else { None }).unwrap_or(-1.0_f64)"},"wired":true},"lambdaForm":{"type":"unknown","default":"|{{params}}| {{body}}","wired":true},"indexedSource":{"type":"unknown","default":"{{src}}.clone().into_iter().enumerate().map(|(i_, x_)| (i_ as f64, x_))","wired":true},"indexedVars":{"type":"unknown","default":"({{index}}, {{item}})","wired":true},"unsupportedForm":{"type":"unknown","default":"_unsupported(&{{op}})","wired":true},"unsupportedWarn":{"type":"unknown","default":"no {{language}} template for operator {{op}}","wired":true},"helpers":{"type":"unknown","default":{"/":["fn _div(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a / b) } }"],"%":["fn _mod(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a % b) } }"],"math/mod":["fn _mod(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a % b) } }"],"default":["trait _OrDefault<T> { fn _or_default(self, d: T) -> T; }\nimpl<T> _OrDefault<T> for Option<T> { fn _or_default(self, d: T) -> T { self.unwrap_or(d) } }\nimpl<T> _OrDefault<T> for T { fn _or_default(self, _d: T) -> T { self } }\nfn _default<T, V: _OrDefault<T>>(v: V, d: T) -> T { v._or_default(d) }"],"str/concat":["fn _num_text(x: f64) -> String {\n if x.is_nan() { return \"NaN\".to_string(); }\n if x.is_infinite() { return (if x > 0.0 { \"Infinity\" } else { \"-Infinity\" }).to_string(); }\n if x == 0.0 { return \"0\".to_string(); }\n let a = x.abs();\n if a >= 1e21 || a < 1e-6 {\n let s = format!(\"{:e}\", x);\n return match s.split_once('e') {\n Some((m, e)) => if e.starts_with('-') { format!(\"{}e{}\", m, e) } else { format!(\"{}e+{}\", m, e) },\n None => s,\n };\n }\n format!(\"{}\", x)\n}","trait _Text { fn _text(&self) -> String; }\nimpl _Text for String { fn _text(&self) -> String { self.clone() } }\nimpl _Text for bool { fn _text(&self) -> String { (if *self { \"true\" } else { \"false\" }).to_string() } }\nimpl _Text for f64 { fn _text(&self) -> String { _num_text(*self) } }","macro_rules! _concat {\n ($($x:expr),+ $(,)?) => {{\n let mut s_ = String::new();\n $( s_.push_str(&_Text::_text(&$x)); )+\n s_\n }};\n}"],"str/join":["fn _num_text(x: f64) -> String {\n if x.is_nan() { return \"NaN\".to_string(); }\n if x.is_infinite() { return (if x > 0.0 { \"Infinity\" } else { \"-Infinity\" }).to_string(); }\n if x == 0.0 { return \"0\".to_string(); }\n let a = x.abs();\n if a >= 1e21 || a < 1e-6 {\n let s = format!(\"{:e}\", x);\n return match s.split_once('e') {\n Some((m, e)) => if e.starts_with('-') { format!(\"{}e{}\", m, e) } else { format!(\"{}e+{}\", m, e) },\n None => s,\n };\n }\n format!(\"{}\", x)\n}","trait _Text { fn _text(&self) -> String; }\nimpl _Text for String { fn _text(&self) -> String { self.clone() } }\nimpl _Text for bool { fn _text(&self) -> String { (if *self { \"true\" } else { \"false\" }).to_string() } }\nimpl _Text for f64 { fn _text(&self) -> String { _num_text(*self) } }","fn _join<T: _Text>(a: &[T], d: &str) -> String { a.iter().map(|x| x._text()).collect::<Vec<_>>().join(d) }"],"str/split":["fn _split(s: &str, d: &str) -> Vec<String> {\n if d.is_empty() { s.chars().map(|c| c.to_string()).collect() } else { s.split(d).map(|p| p.to_string()).collect() }\n}"],"str/slice":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _str_slice(s: &str, a: f64, b: Option<f64>) -> String {\n let c: Vec<char> = s.chars().collect();\n let n = c.len() as i64;\n let norm = |i: i64| -> i64 { if i < 0 { (n + i).max(0) } else { i.min(n) } };\n let st = norm(_whole(a));\n let en = match b { Some(v) => norm(_whole(v)), None => n };\n if en <= st { String::new() } else { c[st as usize..en as usize].iter().collect() }\n}"],"str/padStart":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _pad_start(s: &str, n: f64, p: &str) -> String {\n if p.chars().count() != 1 { panic!(\"expected a single padding character, got {:?}\", p); }\n let w = _whole(n);\n let len = s.chars().count() as i64;\n if w <= len { return s.to_string(); }\n let pad: String = std::iter::repeat(p).take((w - len) as usize).collect();\n format!(\"{}{}\", pad, s)\n}"],"str/padEnd":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _pad_end(s: &str, n: f64, p: &str) -> String {\n if p.chars().count() != 1 { panic!(\"expected a single padding character, got {:?}\", p); }\n let w = _whole(n);\n let len = s.chars().count() as i64;\n if w <= len { return s.to_string(); }\n let pad: String = std::iter::repeat(p).take((w - len) as usize).collect();\n format!(\"{}{}\", s, pad)\n}"],"str/truncate":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _truncate(s: &str, n: f64, suffix: &str) -> String {\n let w = _whole(n);\n if (s.chars().count() as i64) <= w { return s.to_string(); }\n let head: String = s.chars().take(w.max(0) as usize).collect();\n format!(\"{}{}\", head, suffix)\n}"],"str/repeat":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _repeat(s: &str, n: f64) -> String { s.repeat(_count(n)) }"],"str/capitalize":["fn _capitalize(s: &str) -> String {\n let mut c = s.chars();\n match c.next() {\n Some(f) => f.to_uppercase().collect::<String>() + &c.as_str().to_lowercase(),\n None => String::new(),\n }\n}"],"str/to-int":["fn _to_int(s: &str) -> Option<f64> { s.parse::<i64>().ok().map(|v| v as f64) }"],"array/sum":["fn _sum(a: &[f64]) -> f64 { a.iter().fold(0.0_f64, |s, x| s + x) }"],"array/avg":["fn _avg(a: &[f64]) -> Option<f64> { if a.is_empty() { None } else { Some(a.iter().fold(0.0_f64, |s, x| s + x) / a.len() as f64) } }"],"array/max":["fn _amax(a: &[f64]) -> Option<f64> { a.iter().cloned().fold(None, |m, x| Some(match m { Some(y) => if x > y { x } else { y }, None => x })) }"],"array/min":["fn _amin(a: &[f64]) -> Option<f64> { a.iter().cloned().fold(None, |m, x| Some(match m { Some(y) => if x < y { x } else { y }, None => x })) }"],"array/first":["fn _first<T: Clone>(a: &[T]) -> Option<T> { a.first().cloned() }"],"array/last":["fn _last<T: Clone>(a: &[T]) -> Option<T> { a.last().cloned() }"],"array/nth":["fn _nth<T: Clone>(a: &[T], i: f64) -> Option<T> {\n if !i.is_finite() || i != i.trunc() || i < 0.0 { panic!(\"nth: index {} is not a whole number from 0\", i); }\n a.get(i as usize).cloned()\n}"],"array/range":["fn _range(a: f64, b: f64, step: f64) -> Vec<f64> {\n if step == 0.0 || !step.is_finite() { panic!(\"range: step 0 must be a non-zero finite number\"); }\n let mut out = Vec::new();\n let mut x = a;\n while if step > 0.0 { x < b } else { x > b } { out.push(x); x += step; }\n out\n}"],"array/slice":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _slice<T: Clone>(a: &[T], s: f64, e: Option<f64>) -> Vec<T> {\n let st = _whole(s);\n let en = e.map(_whole);\n if st < 0 || en.map_or(false, |v| v < 0) { panic!(\"slice: not a whole number from 0\"); }\n let st = (st as usize).min(a.len());\n let en = en.map_or(a.len(), |v| (v as usize).min(a.len()));\n if en <= st { Vec::new() } else { a[st..en].to_vec() }\n}"],"array/take":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _take<T: Clone>(a: &[T], n: f64) -> Vec<T> { a.iter().take(_count(n)).cloned().collect() }"],"array/drop":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _drop<T: Clone>(a: &[T], n: f64) -> Vec<T> { a.iter().skip(_count(n)).cloned().collect() }"],"array/takeLast":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _take_last<T: Clone>(a: &[T], n: f64) -> Vec<T> { let k = _count(n).min(a.len()); a[a.len() - k..].to_vec() }"],"array/dropLast":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _drop_last<T: Clone>(a: &[T], n: f64) -> Vec<T> { let k = _count(n).min(a.len()); a[..a.len() - k].to_vec() }"],"array/append":["fn _append<T: Clone>(a: &[T], x: T) -> Vec<T> { let mut v = a.to_vec(); v.push(x); v }"],"array/prepend":["fn _prepend<T: Clone>(a: &[T], x: T) -> Vec<T> { let mut v = vec![x]; v.extend(a.iter().cloned()); v }"],"array/indexOf":["fn _index_of<T: PartialEq>(a: &[T], x: &T) -> f64 { a.iter().position(|y| y == x).map_or(-1.0, |i| i as f64) }"],"array/unique":["fn _unique<T: Clone + PartialEq>(a: &[T]) -> Vec<T> {\n let mut out: Vec<T> = Vec::new();\n for x in a { if !out.contains(x) { out.push(x.clone()); } }\n out\n}"],"array/flatten":["fn _flatten<T: Clone>(a: &[Vec<T>]) -> Vec<T> { a.iter().flat_map(|v| v.iter().cloned()).collect() }"],"array/zip":["fn _zip<T: Clone>(a: &[T], b: &[T]) -> Vec<Vec<T>> { a.iter().cloned().zip(b.iter().cloned()).map(|(x, y)| vec![x, y]).collect() }"],"array/concat":["macro_rules! _vconcat {\n ($($x:expr),+ $(,)?) => {{\n let mut v_ = Vec::new();\n $( v_.extend($x.iter().cloned()); )+\n v_\n }};\n}"],"array/sort":["fn _sort<T: Clone + PartialOrd>(a: &[T]) -> Vec<T> {\n let mut v = a.to_vec();\n v.sort_by(|x, y| x.partial_cmp(y).unwrap_or(std::cmp::Ordering::Equal));\n v\n}"],"array/reduce":["fn _reduce<T: Clone, A>(a: &[T], init: A, f: impl Fn(A, T) -> A) -> A { a.iter().cloned().fold(init, f) }"],"math/round":["fn _round(x: f64, d: f64) -> f64 {\n let m = 10.0_f64.powf(d);\n let r = (x.abs() * m + 0.5).floor() / m;\n if x < 0.0 { -r } else { r }\n}"],"math/acos":["fn _acos(x: f64) -> Option<f64> { if (-1.0..=1.0).contains(&x) { Some(x.acos()) } else { None } }"],"math/asin":["fn _asin(x: f64) -> Option<f64> { if (-1.0..=1.0).contains(&x) { Some(x.asin()) } else { None } }"],"math/approach":["fn _approach(c: f64, t: f64, d: f64) -> f64 { if (t - c).abs() <= d { t } else { c + (t - c).signum() * d } }"],"math/map":["fn _map(v: f64, a: f64, b: f64, c: f64, d: f64) -> f64 { if b == a { c } else { c + (v - a) / (b - a) * (d - c) } }"],"math/wrap":["fn _wrap(v: f64, lo: f64, hi: f64) -> f64 {\n let r = hi - lo;\n if r <= 0.0 { lo } else { ((v - lo) % r + r) % r + lo }\n}"],"array/insert":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _insert<T: Clone>(a: &[T], i: f64, x: T) -> Vec<T> {\n let k = _whole(i);\n if k < 0 || k as usize > a.len() { panic!(\"insert: index {} is not within a {}-item array\", k, a.len()); }\n let mut v = a.to_vec();\n v.insert(k as usize, x);\n v\n}"],"array/remove":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _remove<T: Clone>(a: &[T], i: f64) -> Vec<T> {\n let k = _whole(i);\n if k < 0 || k as usize >= a.len() { panic!(\"remove: index {} is outside a {}-item array\", k, a.len()); }\n let mut v = a.to_vec();\n v.remove(k as usize);\n v\n}"],"array/removeItem":["fn _remove_item<T: Clone + PartialEq>(a: &[T], x: &T) -> Vec<T> {\n let mut v = a.to_vec();\n if let Some(p) = v.iter().position(|y| y == x) { v.remove(p); }\n v\n}"],"math/sqrt":["fn _sqrt(x: f64) -> Option<f64> { if x < 0.0 { None } else { Some(x.sqrt()) } }"],"math/ln":["fn _ln(x: f64) -> Option<f64> { if x <= 0.0 { None } else { Some(x.ln()) } }"],"math/log10":["fn _log10(x: f64) -> Option<f64> { if x <= 0.0 { None } else { Some(x.log10()) } }"],"math/pow":["fn _pow(a: f64, b: f64) -> Option<f64> { let r = a.powf(b); if r.is_finite() { Some(r) } else { None } }"],"math/sign":["fn _sign(x: f64) -> f64 { if x > 0.0 { 1.0 } else if x < 0.0 { -1.0 } else { 0.0 } }"],"object/get":["fn _get<V: Clone>(m: &std::collections::BTreeMap<String, V>, k: &str) -> Option<V> { m.get(k).cloned() }"],"object/merge":["fn _merge<V: Clone>(a: &std::collections::BTreeMap<String, V>, b: &std::collections::BTreeMap<String, V>) -> std::collections::BTreeMap<String, V> {\n let mut m = a.clone();\n for (k, v) in b { m.insert(k.clone(), v.clone()); }\n m\n}"],"object/pick":["fn _pick<V: Clone>(m: &std::collections::BTreeMap<String, V>, ks: &[String]) -> std::collections::BTreeMap<String, V> {\n m.iter().filter(|(k, _)| ks.contains(k)).map(|(k, v)| (k.clone(), v.clone())).collect()\n}"],"object/omit":["fn _omit<V: Clone>(m: &std::collections::BTreeMap<String, V>, ks: &[String]) -> std::collections::BTreeMap<String, V> {\n m.iter().filter(|(k, _)| !ks.contains(k)).map(|(k, v)| (k.clone(), v.clone())).collect()\n}"],"unsupported":["#[derive(Clone)]\nstruct _U;\nfn _unsupported(op: &str) -> _U { panic!(\"no native template for operator {}\", op) }\nimpl From<_U> for f64 { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for String { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for bool { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<f64> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<String> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<bool> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<T> From<_U> for Vec<T> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<T> From<_U> for Option<Vec<T>> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<K: Ord, V> From<_U> for std::collections::BTreeMap<K, V> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<K: Ord, V> From<_U> for Option<std::collections::BTreeMap<K, V>> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }"]},"wired":true},"helperGap":{"type":"unknown","default":"\n","wired":true},"portEffects":{"type":"unknown","default":["list","persist","fetch","fetch-stream","notify","navigate","navigate-back","call-service","cancel-call","send-server","spawn","despawn","log"],"wired":true},"portCall":{"type":"unknown","default":"(self.ports)(\"{{name}}\", serde_json::json!([{{*}}]))","wired":true},"portCase":{"type":"unknown","default":"lower","wired":true},"portWarn":{"type":"unknown","default":"{{op}} is called on the ports object","wired":true},"attributeRoots":{"type":"unknown","default":{"entity":"self.entity","state":"self.state","payload":"payload","config":"self.config"},"wired":true},"attrAccess":{"type":"unknown","default":".{{name}}","wired":true},"indexAccess":{"type":"unknown","default":"[{{0}}]","wired":true},"localAccess":{"type":"unknown","default":"attr","wired":true},"entityReadDefault":{"type":"unknown","default":"{{read}}.clone().unwrap_or({{default}})","wired":true},"nullLit":{"type":"unknown","default":"None","wired":true},"trueLit":{"type":"unknown","default":"true","wired":true},"falseLit":{"type":"unknown","default":"false","wired":true},"stringForm":{"type":"unknown","default":"{{json}}.to_string()","wired":true},"numberForm":{"type":"unknown","default":"{{json}}_f64","wired":true},"numberIntForm":{"type":"unknown","default":"{{json}}_f64","wired":true},"listForm":{"type":"unknown","default":"_list!({{*}})","wired":true},"mapOpen":{"type":"unknown","default":"std::collections::BTreeMap::from([","wired":true},"mapClose":{"type":"unknown","default":"])","wired":true},"mapEmpty":{"type":"unknown","default":"std::collections::BTreeMap::new()","wired":true},"mapPair":{"type":"unknown","default":"({{key}}, ({{value}}).clone())","wired":true},"mapSep":{"type":"unknown","default":", ","wired":true},"letStmt":{"type":"unknown","default":"let {{name}} = ({{value}}).clone()","wired":true},"letExpr":{"type":"unknown","default":"{ let {{name}} = ({{value}}).clone(); {{body}} }","wired":true},"condExpr":{"type":"unknown","default":"(if {{cond}} { ({{then}}).clone() } else { ({{else}}).clone() })","wired":true},"ifOpen":{"type":"unknown","default":"if {{cond}} {","wired":true},"elseOpen":{"type":"unknown","default":"} else {","wired":true},"blockClose":{"type":"unknown","default":"}","wired":true},"emptyBody":{"type":"unknown","default":"","wired":true},"setStyle":{"type":"unknown","default":"assign","wired":true},"setAssign":{"type":"unknown","default":"{{target}} = ({{value}}).clone().into()","wired":true},"emitForm":{"type":"unknown","default":"self.emit({{event}}, {{payload}})","wired":true},"payloadType":{"type":"unknown","default":"{{trait}}{{event}}Payload","wired":true},"configType":{"type":"unknown","default":"{{trait}}Config","wired":true},"payloadCtor":{"type":"unknown","default":"serde_json::to_value({{type}} { {{fields}} }).ok()","wired":true},"payloadField":{"type":"unknown","default":"{{name}}: ({{value}}).clone().into()","wired":true},"payloadSep":{"type":"unknown","default":", ","wired":true},"commentForm":{"type":"unknown","default":"// {{text}}","wired":true},"indent":{"type":"unknown","default":" ","wired":true},"terminator":{"type":"unknown","default":";","wired":true},"classCase":{"type":"unknown","default":"keep","wired":true},"fieldCase":{"type":"unknown","default":"keep","wired":true},"localCase":{"type":"unknown","default":"keep","wired":true},"methodCase":{"type":"unknown","default":"lower","wired":true},"methodName":{"type":"unknown","default":"on_{{event}}","wired":true},"modelImports":{"type":"unknown","default":{"entity":"use crate::generated::entities::{{name}};","payload":"use crate::generated::events::{{name}};"},"wired":true},"recordForm":{"type":"unknown","default":"{{type}} { {{fields}} }","wired":true},"recordField":{"type":"unknown","default":"{{name}}: ({{value}}).clone().into()","wired":true},"unionArmForm":{"type":"unknown","default":"{{union}}::{{arm}}({{inner}})","wired":true},"enumForm":{"type":"unknown","default":"{{enum}}::{{member}}","wired":true},"enumMemberCase":{"type":"unknown","default":"split-pascal","wired":true},"fieldNames":{"type":"unknown","default":{"type":"type_"},"wired":true},"modelImportEach":{"type":"unknown","default":true,"wired":true},"fileHeader":{"type":"unknown","default":"#![allow(dead_code, unused_macros, unused_parens, unused_variables)]","wired":true},"sectionGap":{"type":"unknown","default":"\n\n","wired":true},"classOpen":{"type":"unknown","default":"macro_rules! _list {\n ($($x:expr),* $(,)?) => { vec![$(($x).clone()),*] };\n}\n\npub struct {{class}} {","wired":true},"classClose":{"type":"unknown","default":"}","wired":true},"classEmpty":{"type":"unknown","default":"","wired":true},"constructor":{"type":"unknown","default":["{{i}}pub state: String,","{{i}}pub entity: {{entity}},","{{i}}pub config: {{configType}},","{{i}}pub ports: Box<dyn FnMut(&str, serde_json::Value)>,","{{i}}pub emitted: Vec<(String, Option<serde_json::Value>)>,","}","","impl {{class}} {","{{i}}pub fn new(entity: {{entity}}) -> Self {","{{i}}{{i}}Self { state: {{initial}}, entity, config: {{configType}}::default(), ports: Box::new(|_, _| {}), emitted: Vec::new() }","{{noConfig}}{{i}}{{i}}Self { state: {{initial}}, entity, ports: Box::new(|_, _| {}), emitted: Vec::new() }","{{i}}}","","{{i}}pub fn with_config(mut self, config: {{configType}}) -> Self {","{{withConfig}}{{i}}{{i}}self.config = config;","{{withConfig}}{{i}}{{i}}self","{{withConfig}}{{i}}}","{{withConfig}}","{{i}}pub fn with_ports(mut self, ports: impl FnMut(&str, serde_json::Value) + 'static) -> Self {","{{i}}{{i}}self.ports = Box::new(ports);","{{i}}{{i}}self","{{i}}}"],"wired":true},"emitMethod":{"type":"unknown","default":["{{i}}fn emit(&mut self, event: String, payload: Option<serde_json::Value>) {","{{i}}{{i}}self.emitted.push((event, payload));","{{i}}}"],"wired":true},"methodOpen":{"type":"unknown","default":"{{i}}pub fn {{method}}(&mut self, payload: &{{payloadType}}) {","wired":true},"methodOpenPlain":{"type":"unknown","default":"{{i}}pub fn {{method}}(&mut self) {","wired":true},"methodClose":{"type":"unknown","default":"{{i}}}","wired":true},"branchFirst":{"type":"unknown","default":"{{i}}{{i}}if {{test}} {","wired":true},"branchNext":{"type":"unknown","default":"{{i}}{{i}}} else if {{test}} {","wired":true},"branchClose":{"type":"unknown","default":"{{i}}{{i}}}","wired":true},"branchTest":{"type":"unknown","default":"{{stateTest}} && {{guard}}","wired":true},"branchTestPlain":{"type":"unknown","default":"{{stateTest}}","wired":true},"stateTest":{"type":"unknown","default":"self.state == {{state}}","wired":true},"stateAssign":{"type":"unknown","default":"self.state = {{state}}","wired":true},"bodyPrefix":{"type":"unknown","default":"{{i}}{{i}}{{i}}","wired":true},"renderModels":{"type":"unknown","default":false,"wired":true}},"events":{"LOLO_TO_SOURCE":"LOLO_TO_RUST","SOURCE_RENDERED":"RUST_RENDERED","SOURCE_RENDER_FAILED":"RUST_RENDER_FAILED"}}],"pages":[{"name":"LoloRustStart","id":"pag_DX3C9B7FE3QQ1P3080X7M1YNFX","path":"","protocol":"boot","traits":[{"ref":"LoloRust","refId":"trt_93N67H7PNRVAWBDYCH3GEMCJR2"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_K05G2RCBC65P36HPE1RMHT9T5A":{"id":"ent_K05G2RCBC65P36HPE1RMHT9T5A","kind":"entity","bakedName":"LoloRustRun","curName":"LoloRustRun","renames":[],"owner":"workspace"},"orb_X00PV738MGMA8B8NN4V82TVQ1T":{"id":"orb_X00PV738MGMA8B8NN4V82TVQ1T","kind":"orbital","bakedName":"LoloRustOrbital","curName":"LoloRustOrbital","renames":[],"owner":"workspace"},"pag_DX3C9B7FE3QQ1P3080X7M1YNFX":{"id":"pag_DX3C9B7FE3QQ1P3080X7M1YNFX","kind":"page","bakedName":"LoloRustStart","curName":"LoloRustStart","renames":[],"owner":"workspace"},"trt_93N67H7PNRVAWBDYCH3GEMCJR2":{"id":"trt_93N67H7PNRVAWBDYCH3GEMCJR2","kind":"trait","bakedName":"LoloRust","curName":"LoloRust","renames":[],"owner":"workspace"}}}}
1
+ {"typeContractVersion":1,"name":"std-lolo-rust","version":"2.0.0","description":"std-lolo-rust — renders .lolo source as Rust text, so a learner who reads an exercise written in .lolo can see the same program as Rust that compiles against the Rust shell's generated models and gives the kernel's answers. It is std-lolo-source with the Rust vocabulary in config and nothing else: LOLO_TO_RUST { source, path } answers RUST_RENDERED { text, warnings }, or RUST_RENDER_FAILED { error } when the source cannot be read or the request carries no path (the checker's types are required). Each trait becomes a struct holding state, entity, a ports callback and the emitted events, with one on_<event>(&mut self, payload: &<Trait><EVENT>Payload) method per event: an if / else if branch per transition (the from-state and the guard), the effects, then the new state; an emit records (event, the serde_json value of the payload built as the shell's generated payload type) in self.emitted. The entity and payload types are imported from crate::generated::entities and crate::generated::events, the modules the Rust shell generates. Numbers are f64. A failable operator (division, modulo, sqrt, ln, log10, pow, acos, asin, nth, first, last, to-int, avg, max, min) answers Option<f64> and default unwraps it. A set and every payload field convert the value with clone().into(), so a defaulted entity field (Option<T> in the shell's model) and a required one are written the same way, and a read of a defaulted entity field unwraps to its declared default. Kernel answers that are null or errors come from small helper functions written once, and only the ones the output uses; string length, slicing and padding count characters, and a count or index that is not a whole number panics as the kernel errors. An operator with no Rust template is a named warning and a stub that panics when run. persist, fetch, notify, navigate and call-service are called on the injected ports callback with the effect name and their arguments as JSON, and each is listed in warnings; render-ui is a comment. Limits: a trait's config knobs are not rendered; fields the checker types int are i64 in the shell's models and are not converted from f64; a literal dotted path in object/get is read as one flat key; array/zip needs two lists of one type; object/keys, values and entries have no template because the shell's maps are ordered by key while the kernel keeps insertion order. See std-lolo-source for the config knobs and the type placeholders.","orbitals":[{"name":"LoloRustOrbital","id":"orb_X00PV738MGMA8B8NN4V82TVQ1T","uses":[{"from":"almadar-std/lolo-rust","as":"Spec"},{"from":"std/behaviors/std-lolo-source","as":"Src"}],"entity":{"name":"LoloRustRun","id":"ent_K05G2RCBC65P36HPE1RMHT9T5A","persistence":"runtime","fields":[{"nullable":false,"name":"id","type":"string","required":true}]},"traits":[{"ref":"Src.traits.LoloSource","id":"trt_93N67H7PNRVAWBDYCH3GEMCJR2","name":"LoloRust","config":{"language":{"type":"unknown","default":"Rust","wired":true},"requiresTypes":{"type":"unknown","default":true,"wired":true},"operators":{"type":"unknown","default":{"/":"_div({{0}}, {{1}})","%":"_mod({{0}}, {{1}})","math/mod":"_mod({{0}}, {{1}})","str/len":"({{0}}.chars().count() as f64)","str/upper":"{{0}}.to_uppercase()","str/lower":"{{0}}.to_lowercase()","str/trim":"{{0}}.trim().to_string()","str/trimStart":"{{0}}.trim_start().to_string()","str/trimEnd":"{{0}}.trim_end().to_string()","str/capitalize":"_capitalize(&{{0}})","str/split":"_split(&{{0}}, &{{1}})","str/join":"_join(&{{0}}, &{{1}})","str/concat":"_concat!({{*}})","str/includes":"{{0}}.contains(&{{1}})","str/startsWith":"{{0}}.starts_with(&{{1}})","str/endsWith":"{{0}}.ends_with(&{{1}})","str/replace":"{{0}}.replacen(&{{1}}, &{{2}}, 1)","str/replaceAll":"{{0}}.replace(&{{1}}, &{{2}})","str/repeat":"_repeat(&{{0}}, {{1}})","str/reverse":"{{0}}.chars().rev().collect::<String>()","str/slice#2":"_str_slice(&{{0}}, {{1}}, None)","str/slice#3":"_str_slice(&{{0}}, {{1}}, Some({{2}}))","str/padStart#2":"_pad_start(&{{0}}, {{1}}, \" \")","str/padStart#3":"_pad_start(&{{0}}, {{1}}, &{{2}})","str/padEnd#2":"_pad_end(&{{0}}, {{1}}, \" \")","str/padEnd#3":"_pad_end(&{{0}}, {{1}}, &{{2}})","str/truncate#2":"_truncate(&{{0}}, {{1}}, \"...\")","str/truncate#3":"_truncate(&{{0}}, {{1}}, &{{2}})","str/to-int":"_to_int(&{{0}})","array/len":"({{0}}.len() as f64)","array/avg#1":"_avg(&{{0}})","array/max#1":"_amax(&{{0}})","array/min#1":"_amin(&{{0}})","array/first":"_first(&{{0}})","array/last":"_last(&{{0}})","array/nth":"_nth(&{{0}}, {{1}})","array/range#2":"_range({{0}}, {{1}}, 1_f64)","array/range#3":"_range({{0}}, {{1}}, {{2}})","array/slice#2":"_slice(&{{0}}, {{1}}, None)","array/slice#3":"_slice(&{{0}}, {{1}}, Some({{2}}))","array/take":"_take(&{{0}}, {{1}})","array/drop":"_drop(&{{0}}, {{1}})","array/takeLast":"_take_last(&{{0}}, {{1}})","array/dropLast":"_drop_last(&{{0}}, {{1}})","array/append":"_append(&{{0}}, {{1}}.clone())","array/prepend":"_prepend(&{{0}}, {{1}}.clone())","array/includes":"{{0}}.contains(&{{1}})","array/indexOf":"_index_of(&{{0}}, &{{1}})","array/reverse":"{{0}}.iter().rev().cloned().collect::<Vec<_>>()","array/unique":"_unique(&{{0}})","array/flatten":"_flatten(&{{0}})","array/zip":"_zip(&{{0}}, &{{1}})","array/concat":"_vconcat!({{*}})","array/reduce":"_reduce(&{{0}}, ({{1}}).clone(), {{2}})","list":"_list!({{*}})","object/get#2":"_get(&{{0}}, &{{1}})","object/get#3":"_get(&{{0}}, &{{1}}).unwrap_or(({{2}}).clone())","object/has":"{{0}}.contains_key(&{{1}})","object/merge#2":"_merge(&{{0}}, &{{1}})","object/pick":"_pick(&{{0}}, &{{1}})","object/omit":"_omit(&{{0}}, &{{1}})","math/abs":"({{0}}).abs()","math/ceil":"({{0}}).ceil()","math/floor":"({{0}}).floor()","math/sin":"({{0}}).sin()","math/cos":"({{0}}).cos()","math/tan":"({{0}}).tan()","math/atan":"({{0}}).atan()","math/atan2":"({{0}}).atan2({{1}})","math/hypot":"({{0}}).hypot({{1}})","math/max":"[{{*}}].iter().cloned().fold(f64::NEG_INFINITY, f64::max)","math/min":"[{{*}}].iter().cloned().fold(f64::INFINITY, f64::min)","math/round#2":"_round({{0}}, {{1}})","math/acos":"_acos({{0}})","math/asin":"_asin({{0}})","math/deg-rad":"({{0}}).to_radians()","math/rad-deg":"({{0}}).to_degrees()","math/lerp":"(({{0}}) + (({{1}}) - ({{0}})) * ({{2}}))","math/approach":"_approach({{0}}, {{1}}, {{2}})","math/map":"_map({{0}}, {{1}}, {{2}}, {{3}}, {{4}})","math/wrap":"_wrap({{0}}, {{1}}, {{2}})","array/insert":"_insert(&{{0}}, {{1}}, ({{2}}).clone())","array/remove":"_remove(&{{0}}, {{1}})","array/removeItem":"_remove_item(&{{0}}, &{{1}})","math/sqrt":"_sqrt({{0}})","math/ln":"_ln({{0}})","math/log10":"_log10({{0}})","math/pow":"_pow({{0}}, {{1}})","math/sign":"_sign({{0}})","math/clamp":"({{0}}).max({{1}}).min({{2}})","default":"_default(({{0}}).clone(), ({{1}}).clone())","as":"{{0}}","validate/min":"({{0}} >= {{1}})","validate/max":"({{0}} <= {{1}})","validate/range":"(({{1}} <= {{0}}) && ({{0}} <= {{2}}))","validate/oneOf":"{{1}}.contains(&{{0}})","validate/equals":"({{0}} == {{1}})"},"wired":true},"unary":{"type":"unknown","default":{"-":"(-{{0}})","not":"(!{{0}})","array/range":"_range(0_f64, {{0}}, 1_f64)","array/sum":"_sum(&{{0}})","array/count":"({{0}}.len() as f64)","array/sort":"_sort(&{{0}})","math/round":"_round({{0}}, 0_f64)","array/concat":"{{0}}.clone()","object/merge":"{{0}}.clone()"},"wired":true},"infix":{"type":"unknown","default":{"+":"+","-":"-","*":"*","=":"==","==":"==","!=":"!=","<":"<","<=":"<=",">":">",">=":">=","and":"&&","or":"||"},"wired":true},"infixForm":{"type":"unknown","default":"({{*}})","wired":true},"lambdaOperators":{"type":"unknown","default":{"array/map":"{{src}}.clone().into_iter().map(|{{vars}}| ({{body}}).clone()).collect::<Vec<_>>()","array/filter":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if {{body}} { Some({{item}}) } else { None }).collect::<Vec<_>>()","array/reject":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if !({{body}}) { Some({{item}}) } else { None }).collect::<Vec<_>>()","array/some":"{{src}}.clone().into_iter().any(|{{vars}}| {{body}})","array/every":"{{src}}.clone().into_iter().all(|{{vars}}| {{body}})","array/count":"{{src}}.clone().into_iter().filter_map(|{{vars}}| if {{body}} { Some(1.0_f64) } else { None }).fold(0.0_f64, |s, x| s + x)","array/find":"{{src}}.clone().into_iter().find_map(|{{vars}}| if {{body}} { Some({{item}}) } else { None })","array/findIndex":"{{src}}.clone().into_iter().enumerate().find_map(|(i_, {{vars}})| if {{body}} { Some(i_ as f64) } else { None }).unwrap_or(-1.0_f64)"},"wired":true},"lambdaForm":{"type":"unknown","default":"|{{params}}| {{body}}","wired":true},"indexedSource":{"type":"unknown","default":"{{src}}.clone().into_iter().enumerate().map(|(i_, x_)| (i_ as f64, x_))","wired":true},"indexedVars":{"type":"unknown","default":"({{index}}, {{item}})","wired":true},"unsupportedForm":{"type":"unknown","default":"_unsupported(&{{op}})","wired":true},"unsupportedWarn":{"type":"unknown","default":"no {{language}} template for operator {{op}}","wired":true},"helpers":{"type":"unknown","default":{"store":["pub trait Store {\n fn persist(&mut self, op: &str, entity: &str, data: serde_json::Value) -> (bool, serde_json::Value);\n fn fetch(&mut self, entity: &str, keep: Option<&dyn Fn(&serde_json::Map<String, serde_json::Value>) -> bool>) -> (bool, serde_json::Value);\n}\n\nfn _order(a: &serde_json::Map<String, serde_json::Value>, b: &serde_json::Map<String, serde_json::Value>) -> std::cmp::Ordering {\n let (sa, sb) = (a.get(\"createdAt\").filter(|v| !v.is_null()), b.get(\"createdAt\").filter(|v| !v.is_null()));\n let by_stamp = match (sa, sb) {\n (Some(_), None) => std::cmp::Ordering::Less,\n (None, Some(_)) => std::cmp::Ordering::Greater,\n (Some(x), Some(y)) => match (x.as_f64(), y.as_f64(), x.as_str(), y.as_str()) {\n (Some(p), Some(q), _, _) => p.partial_cmp(&q).unwrap_or(std::cmp::Ordering::Equal),\n (_, _, Some(p), Some(q)) => p.cmp(q),\n _ => std::cmp::Ordering::Equal,\n },\n (None, None) => std::cmp::Ordering::Equal,\n };\n let id = |m: &serde_json::Map<String, serde_json::Value>| m.get(\"id\").and_then(|v| v.as_str()).unwrap_or(\"\").to_string();\n by_stamp.then_with(|| id(a).cmp(&id(b)))\n}\n\n#[derive(Default)]\npub struct MemoryStore {\n tables: std::collections::BTreeMap<String, Vec<(String, serde_json::Map<String, serde_json::Value>)>>,\n minted: u64,\n}\n\nimpl Store for MemoryStore {\n fn persist(&mut self, op: &str, entity: &str, data: serde_json::Value) -> (bool, serde_json::Value) {\n let rows = self.tables.entry(entity.to_string()).or_default();\n if op == \"create\" {\n let mut row = data.as_object().cloned().unwrap_or_default();\n let id = match row.get(\"id\").and_then(|v| v.as_str()).filter(|v| !v.is_empty()) {\n Some(v) => v.to_string(),\n None => {\n self.minted += 1;\n format!(\"{}-{}\", entity, self.minted)\n }\n };\n row.insert(\"id\".to_string(), serde_json::Value::String(id.clone()));\n rows.push((id, row.clone()));\n return (true, serde_json::Value::Object(row));\n }\n let key = match &data {\n serde_json::Value::String(v) => v.clone(),\n v => v.get(\"id\").and_then(|x| x.as_str()).unwrap_or(\"\").to_string(),\n };\n let Some(pos) = rows.iter().position(|(k, _)| *k == key) else {\n return (false, serde_json::json!({ \"error\": format!(\"{} {} not found\", entity, key), \"code\": \"not-found\" }));\n };\n if op == \"delete\" {\n rows.remove(pos);\n return (true, serde_json::json!({ \"id\": key, \"deleted\": true }));\n }\n if let Some(obj) = data.as_object() {\n for (k, v) in obj {\n rows[pos].1.insert(k.clone(), v.clone());\n }\n }\n (true, serde_json::Value::Object(rows[pos].1.clone()))\n }\n\n fn fetch(&mut self, entity: &str, keep: Option<&dyn Fn(&serde_json::Map<String, serde_json::Value>) -> bool>) -> (bool, serde_json::Value) {\n let mut rows: Vec<serde_json::Map<String, serde_json::Value>> = self.tables.get(entity).map_or_else(Vec::new, |t| t.iter().map(|(_, r)| r.clone()).collect());\n rows.retain(|r| keep.map_or(true, |k| k(r)));\n rows.sort_by(_order);\n let n = rows.len();\n (true, serde_json::json!({ \"data\": rows, \"totalCount\": n }))\n }\n}\n\nmacro_rules! _routed_store {\n ($t:ty) => {\n impl _Routed for $t {\n fn state(&self) -> String { self.state.clone() }\n fn entity_json(&self) -> serde_json::Value { serde_json::to_value(&self.entity).unwrap_or(serde_json::Value::Null) }\n fn emitted_len(&self) -> usize { self.emitted.len() }\n fn emitted_from(&self, n: usize) -> Vec<(String, serde_json::Value, bool)> {\n self.emitted[n..].iter().enumerate().map(|(j, (e, p))| (e.clone(), p.clone().unwrap_or_else(|| serde_json::json!({})), self.completed.contains(&(n + j)))).collect()\n }\n fn as_any(&mut self) -> &mut dyn std::any::Any { self }\n }\n };\n}"],"router":["trait _Routed {\n fn state(&self) -> String;\n fn entity_json(&self) -> serde_json::Value;\n fn emitted_len(&self) -> usize;\n fn emitted_from(&self, n: usize) -> Vec<(String, serde_json::Value, bool)>;\n fn as_any(&mut self) -> &mut dyn std::any::Any;\n}\n\nmacro_rules! _routed {\n ($t:ty) => {\n impl _Routed for $t {\n fn state(&self) -> String { self.state.clone() }\n fn entity_json(&self) -> serde_json::Value { serde_json::to_value(&self.entity).unwrap_or(serde_json::Value::Null) }\n fn emitted_len(&self) -> usize { self.emitted.len() }\n fn emitted_from(&self, n: usize) -> Vec<(String, serde_json::Value, bool)> {\n self.emitted[n..].iter().map(|(e, p)| (e.clone(), p.clone().unwrap_or_else(|| serde_json::json!({})), false)).collect()\n }\n fn as_any(&mut self) -> &mut dyn std::any::Any { self }\n }\n };\n}\n\nfn _decode<T: serde::de::DeserializeOwned>(payload: &serde_json::Value) -> T {\n serde_json::from_value(payload.clone()).expect(\"a payload of the declared shape\")\n}\n\ntype _Guard = fn(&serde_json::Value) -> bool;\ntype _Map = fn(&serde_json::Value) -> serde_json::Value;\n\nstruct _Item {\n target: String,\n event: String,\n payload: serde_json::Value,\n source: serde_json::Value,\n guard: Option<_Guard>,\n fans: bool,\n completion: bool,\n}\n\n#[derive(Default)]\npub struct _Router {\n traits: Vec<(String, Box<dyn _Routed>)>,\n pub handles: std::collections::HashMap<String, std::collections::BTreeMap<String, Vec<String>>>,\n rows: Vec<(String, String, String, String, Option<_Guard>, Option<_Map>)>,\n pub log: Vec<(String, String, serde_json::Value)>,\n}\n\nimpl _Router {\n fn add(&mut self, key: String, trait_: Box<dyn _Routed>) {\n self.traits.push((key, trait_));\n }\n\n fn row(&mut self, source: String, event: String, target: String, trigger: String, guard: Option<_Guard>, mapping: Option<_Map>) {\n self.rows.push((source, event, target, trigger, guard, mapping));\n }\n\n fn find(&mut self, key: &str) -> Option<&mut Box<dyn _Routed>> {\n self.traits.iter_mut().find(|(k, _)| k == key).map(|(_, t)| t)\n }\n\n pub fn entity_of(&mut self, key: &str) -> serde_json::Value {\n self.find(key).map_or(serde_json::Value::Null, |t| t.entity_json())\n }\n\n fn get<T: 'static>(&mut self, key: &str) -> Option<&mut T> {\n self.find(key).and_then(|t| t.as_any().downcast_mut::<T>())\n }\n\n fn targets(&self, source: &str, event: &str, payload: &serde_json::Value, completion: bool) -> Vec<_Item> {\n self.rows\n .iter()\n .filter(|(s, e, ..)| s == source && e == event)\n .map(|(_, _, target, trigger, guard, mapping)| _Item {\n target: target.clone(),\n event: trigger.clone(),\n payload: mapping.map_or_else(|| payload.clone(), |m| m(payload)),\n source: payload.clone(),\n guard: *guard,\n fans: false,\n completion,\n })\n .collect()\n }\n}\n\ntrait _Program {\n fn router(&mut self) -> &mut _Router;\n fn deliver(&mut self, target: &str, event: &str, payload: &serde_json::Value);\n}\n\nfn _dispatch<P: _Program>(program: &mut P, trait_: &str, event: &str, payload: serde_json::Value) {\n let mut queue = std::collections::VecDeque::from(vec![_Item {\n target: trait_.to_string(),\n event: event.to_string(),\n payload: payload.clone(),\n source: payload,\n guard: None,\n fans: true,\n completion: false,\n }]);\n let mut seen = std::collections::HashSet::new();\n let mut steps = 0;\n while let Some(item) = queue.pop_front() {\n let Some((state, entity)) = program.router().find(&item.target).map(|t| (t.state(), t.entity_json())) else { continue };\n let key = serde_json::json!([item.target, item.event, state, item.payload, entity]).to_string();\n if !item.completion && seen.contains(&key) {\n continue;\n }\n if let Some(guard) = item.guard {\n if !guard(&item.source) {\n continue;\n }\n }\n if steps >= 2000 {\n break;\n }\n steps += 1;\n seen.insert(key);\n let n = program.router().find(&item.target).map_or(0, |t| t.emitted_len());\n program.deliver(&item.target, &item.event, &item.payload);\n let router = program.router();\n let mut fanned = if item.fans { router.targets(&item.target, &item.event, &item.payload, false) } else { Vec::new() };\n let (new_state, emits) = router.find(&item.target).map_or((String::new(), Vec::new()), |t| (t.state(), t.emitted_from(n)));\n let mut own = Vec::new();\n for (ev, out, completion) in emits {\n router.log.push((item.target.clone(), ev.clone(), out.clone()));\n if router.handles.get(&item.target).and_then(|h| h.get(&new_state)).is_some_and(|evs| evs.contains(&ev)) {\n own.push(_Item { target: item.target.clone(), event: ev.clone(), payload: out.clone(), source: out.clone(), guard: None, fans: false, completion });\n }\n fanned.extend(router.targets(&item.target, &ev, &out, completion));\n }\n for x in own.into_iter().rev() {\n queue.push_front(x);\n }\n queue.extend(fanned);\n }\n}"],"/":["fn _div(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a / b) } }"],"%":["fn _mod(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a % b) } }"],"math/mod":["fn _mod(a: f64, b: f64) -> Option<f64> { if b == 0.0 { None } else { Some(a % b) } }"],"default":["trait _OrDefault<T> { fn _or_default(self, d: T) -> T; }\nimpl<T> _OrDefault<T> for Option<T> { fn _or_default(self, d: T) -> T { self.unwrap_or(d) } }\nimpl<T> _OrDefault<T> for T { fn _or_default(self, _d: T) -> T { self } }\nfn _default<T, V: _OrDefault<T>>(v: V, d: T) -> T { v._or_default(d) }"],"str/concat":["fn _num_text(x: f64) -> String {\n if x.is_nan() { return \"NaN\".to_string(); }\n if x.is_infinite() { return (if x > 0.0 { \"Infinity\" } else { \"-Infinity\" }).to_string(); }\n if x == 0.0 { return \"0\".to_string(); }\n let a = x.abs();\n if a >= 1e21 || a < 1e-6 {\n let s = format!(\"{:e}\", x);\n return match s.split_once('e') {\n Some((m, e)) => if e.starts_with('-') { format!(\"{}e{}\", m, e) } else { format!(\"{}e+{}\", m, e) },\n None => s,\n };\n }\n format!(\"{}\", x)\n}","trait _Text { fn _text(&self) -> String; }\nimpl _Text for String { fn _text(&self) -> String { self.clone() } }\nimpl _Text for bool { fn _text(&self) -> String { (if *self { \"true\" } else { \"false\" }).to_string() } }\nimpl _Text for f64 { fn _text(&self) -> String { _num_text(*self) } }","macro_rules! _concat {\n ($($x:expr),+ $(,)?) => {{\n let mut s_ = String::new();\n $( s_.push_str(&_Text::_text(&$x)); )+\n s_\n }};\n}"],"str/join":["fn _num_text(x: f64) -> String {\n if x.is_nan() { return \"NaN\".to_string(); }\n if x.is_infinite() { return (if x > 0.0 { \"Infinity\" } else { \"-Infinity\" }).to_string(); }\n if x == 0.0 { return \"0\".to_string(); }\n let a = x.abs();\n if a >= 1e21 || a < 1e-6 {\n let s = format!(\"{:e}\", x);\n return match s.split_once('e') {\n Some((m, e)) => if e.starts_with('-') { format!(\"{}e{}\", m, e) } else { format!(\"{}e+{}\", m, e) },\n None => s,\n };\n }\n format!(\"{}\", x)\n}","trait _Text { fn _text(&self) -> String; }\nimpl _Text for String { fn _text(&self) -> String { self.clone() } }\nimpl _Text for bool { fn _text(&self) -> String { (if *self { \"true\" } else { \"false\" }).to_string() } }\nimpl _Text for f64 { fn _text(&self) -> String { _num_text(*self) } }","fn _join<T: _Text>(a: &[T], d: &str) -> String { a.iter().map(|x| x._text()).collect::<Vec<_>>().join(d) }"],"str/split":["fn _split(s: &str, d: &str) -> Vec<String> {\n if d.is_empty() { s.chars().map(|c| c.to_string()).collect() } else { s.split(d).map(|p| p.to_string()).collect() }\n}"],"str/slice":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _str_slice(s: &str, a: f64, b: Option<f64>) -> String {\n let c: Vec<char> = s.chars().collect();\n let n = c.len() as i64;\n let norm = |i: i64| -> i64 { if i < 0 { (n + i).max(0) } else { i.min(n) } };\n let st = norm(_whole(a));\n let en = match b { Some(v) => norm(_whole(v)), None => n };\n if en <= st { String::new() } else { c[st as usize..en as usize].iter().collect() }\n}"],"str/padStart":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _pad_start(s: &str, n: f64, p: &str) -> String {\n if p.chars().count() != 1 { panic!(\"expected a single padding character, got {:?}\", p); }\n let w = _whole(n);\n let len = s.chars().count() as i64;\n if w <= len { return s.to_string(); }\n let pad: String = std::iter::repeat(p).take((w - len) as usize).collect();\n format!(\"{}{}\", pad, s)\n}"],"str/padEnd":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _pad_end(s: &str, n: f64, p: &str) -> String {\n if p.chars().count() != 1 { panic!(\"expected a single padding character, got {:?}\", p); }\n let w = _whole(n);\n let len = s.chars().count() as i64;\n if w <= len { return s.to_string(); }\n let pad: String = std::iter::repeat(p).take((w - len) as usize).collect();\n format!(\"{}{}\", s, pad)\n}"],"str/truncate":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _truncate(s: &str, n: f64, suffix: &str) -> String {\n let w = _whole(n);\n if (s.chars().count() as i64) <= w { return s.to_string(); }\n let head: String = s.chars().take(w.max(0) as usize).collect();\n format!(\"{}{}\", head, suffix)\n}"],"str/repeat":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _repeat(s: &str, n: f64) -> String { s.repeat(_count(n)) }"],"str/capitalize":["fn _capitalize(s: &str) -> String {\n let mut c = s.chars();\n match c.next() {\n Some(f) => f.to_uppercase().collect::<String>() + &c.as_str().to_lowercase(),\n None => String::new(),\n }\n}"],"str/to-int":["fn _to_int(s: &str) -> Option<f64> { s.parse::<i64>().ok().map(|v| v as f64) }"],"array/sum":["fn _sum(a: &[f64]) -> f64 { a.iter().fold(0.0_f64, |s, x| s + x) }"],"array/avg":["fn _avg(a: &[f64]) -> Option<f64> { if a.is_empty() { None } else { Some(a.iter().fold(0.0_f64, |s, x| s + x) / a.len() as f64) } }"],"array/max":["fn _amax(a: &[f64]) -> Option<f64> { a.iter().cloned().fold(None, |m, x| Some(match m { Some(y) => if x > y { x } else { y }, None => x })) }"],"array/min":["fn _amin(a: &[f64]) -> Option<f64> { a.iter().cloned().fold(None, |m, x| Some(match m { Some(y) => if x < y { x } else { y }, None => x })) }"],"array/first":["fn _first<T: Clone>(a: &[T]) -> Option<T> { a.first().cloned() }"],"array/last":["fn _last<T: Clone>(a: &[T]) -> Option<T> { a.last().cloned() }"],"array/nth":["fn _nth<T: Clone>(a: &[T], i: f64) -> Option<T> {\n if !i.is_finite() || i != i.trunc() || i < 0.0 { panic!(\"nth: index {} is not a whole number from 0\", i); }\n a.get(i as usize).cloned()\n}"],"array/range":["fn _range(a: f64, b: f64, step: f64) -> Vec<f64> {\n if step == 0.0 || !step.is_finite() { panic!(\"range: step 0 must be a non-zero finite number\"); }\n let mut out = Vec::new();\n let mut x = a;\n while if step > 0.0 { x < b } else { x > b } { out.push(x); x += step; }\n out\n}"],"array/slice":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _slice<T: Clone>(a: &[T], s: f64, e: Option<f64>) -> Vec<T> {\n let st = _whole(s);\n let en = e.map(_whole);\n if st < 0 || en.map_or(false, |v| v < 0) { panic!(\"slice: not a whole number from 0\"); }\n let st = (st as usize).min(a.len());\n let en = en.map_or(a.len(), |v| (v as usize).min(a.len()));\n if en <= st { Vec::new() } else { a[st..en].to_vec() }\n}"],"array/take":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _take<T: Clone>(a: &[T], n: f64) -> Vec<T> { a.iter().take(_count(n)).cloned().collect() }"],"array/drop":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _drop<T: Clone>(a: &[T], n: f64) -> Vec<T> { a.iter().skip(_count(n)).cloned().collect() }"],"array/takeLast":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _take_last<T: Clone>(a: &[T], n: f64) -> Vec<T> { let k = _count(n).min(a.len()); a[a.len() - k..].to_vec() }"],"array/dropLast":["fn _count(x: f64) -> usize {\n if !x.is_finite() || x != x.trunc() || x < 0.0 { panic!(\"count is not a whole number from 0\"); }\n x as usize\n}","fn _drop_last<T: Clone>(a: &[T], n: f64) -> Vec<T> { let k = _count(n).min(a.len()); a[..a.len() - k].to_vec() }"],"array/append":["fn _append<T: Clone>(a: &[T], x: T) -> Vec<T> { let mut v = a.to_vec(); v.push(x); v }"],"array/prepend":["fn _prepend<T: Clone>(a: &[T], x: T) -> Vec<T> { let mut v = vec![x]; v.extend(a.iter().cloned()); v }"],"array/indexOf":["fn _index_of<T: PartialEq>(a: &[T], x: &T) -> f64 { a.iter().position(|y| y == x).map_or(-1.0, |i| i as f64) }"],"array/unique":["fn _unique<T: Clone + PartialEq>(a: &[T]) -> Vec<T> {\n let mut out: Vec<T> = Vec::new();\n for x in a { if !out.contains(x) { out.push(x.clone()); } }\n out\n}"],"array/flatten":["fn _flatten<T: Clone>(a: &[Vec<T>]) -> Vec<T> { a.iter().flat_map(|v| v.iter().cloned()).collect() }"],"array/zip":["fn _zip<T: Clone>(a: &[T], b: &[T]) -> Vec<Vec<T>> { a.iter().cloned().zip(b.iter().cloned()).map(|(x, y)| vec![x, y]).collect() }"],"array/concat":["macro_rules! _vconcat {\n ($($x:expr),+ $(,)?) => {{\n let mut v_ = Vec::new();\n $( v_.extend($x.iter().cloned()); )+\n v_\n }};\n}"],"array/sort":["fn _sort<T: Clone + PartialOrd>(a: &[T]) -> Vec<T> {\n let mut v = a.to_vec();\n v.sort_by(|x, y| x.partial_cmp(y).unwrap_or(std::cmp::Ordering::Equal));\n v\n}"],"array/reduce":["fn _reduce<T: Clone, A>(a: &[T], init: A, f: impl Fn(A, T) -> A) -> A { a.iter().cloned().fold(init, f) }"],"math/round":["fn _round(x: f64, d: f64) -> f64 {\n let m = 10.0_f64.powf(d);\n let r = (x.abs() * m + 0.5).floor() / m;\n if x < 0.0 { -r } else { r }\n}"],"math/acos":["fn _acos(x: f64) -> Option<f64> { if (-1.0..=1.0).contains(&x) { Some(x.acos()) } else { None } }"],"math/asin":["fn _asin(x: f64) -> Option<f64> { if (-1.0..=1.0).contains(&x) { Some(x.asin()) } else { None } }"],"math/approach":["fn _approach(c: f64, t: f64, d: f64) -> f64 { if (t - c).abs() <= d { t } else { c + (t - c).signum() * d } }"],"math/map":["fn _map(v: f64, a: f64, b: f64, c: f64, d: f64) -> f64 { if b == a { c } else { c + (v - a) / (b - a) * (d - c) } }"],"math/wrap":["fn _wrap(v: f64, lo: f64, hi: f64) -> f64 {\n let r = hi - lo;\n if r <= 0.0 { lo } else { ((v - lo) % r + r) % r + lo }\n}"],"array/insert":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _insert<T: Clone>(a: &[T], i: f64, x: T) -> Vec<T> {\n let k = _whole(i);\n if k < 0 || k as usize > a.len() { panic!(\"insert: index {} is not within a {}-item array\", k, a.len()); }\n let mut v = a.to_vec();\n v.insert(k as usize, x);\n v\n}"],"array/remove":["fn _whole(x: f64) -> i64 {\n if !x.is_finite() || x != x.trunc() { panic!(\"expected a whole number, got {}\", x); }\n x as i64\n}","fn _remove<T: Clone>(a: &[T], i: f64) -> Vec<T> {\n let k = _whole(i);\n if k < 0 || k as usize >= a.len() { panic!(\"remove: index {} is outside a {}-item array\", k, a.len()); }\n let mut v = a.to_vec();\n v.remove(k as usize);\n v\n}"],"array/removeItem":["fn _remove_item<T: Clone + PartialEq>(a: &[T], x: &T) -> Vec<T> {\n let mut v = a.to_vec();\n if let Some(p) = v.iter().position(|y| y == x) { v.remove(p); }\n v\n}"],"math/sqrt":["fn _sqrt(x: f64) -> Option<f64> { if x < 0.0 { None } else { Some(x.sqrt()) } }"],"math/ln":["fn _ln(x: f64) -> Option<f64> { if x <= 0.0 { None } else { Some(x.ln()) } }"],"math/log10":["fn _log10(x: f64) -> Option<f64> { if x <= 0.0 { None } else { Some(x.log10()) } }"],"math/pow":["fn _pow(a: f64, b: f64) -> Option<f64> { let r = a.powf(b); if r.is_finite() { Some(r) } else { None } }"],"math/sign":["fn _sign(x: f64) -> f64 { if x > 0.0 { 1.0 } else if x < 0.0 { -1.0 } else { 0.0 } }"],"object/get":["trait _Lookup {\n type Out;\n fn lookup(&self, k: &str) -> Self::Out;\n}\nimpl<V: Clone> _Lookup for std::collections::BTreeMap<String, V> {\n type Out = Option<V>;\n fn lookup(&self, k: &str) -> Option<V> { self.get(k).cloned() }\n}\nimpl _Lookup for serde_json::Map<String, serde_json::Value> {\n type Out = _Json;\n fn lookup(&self, k: &str) -> _Json { _Json(self.get(k).cloned().filter(|v| !v.is_null())) }\n}\nimpl<T: _Lookup + ?Sized> _Lookup for &T {\n type Out = T::Out;\n fn lookup(&self, k: &str) -> T::Out { (**self).lookup(k) }\n}\n#[derive(Clone, Debug)]\nstruct _Json(Option<serde_json::Value>);\nimpl PartialEq<String> for _Json {\n fn eq(&self, o: &String) -> bool { self.0.as_ref().and_then(|v| v.as_str()) == Some(o.as_str()) }\n}\nimpl PartialEq<f64> for _Json {\n fn eq(&self, o: &f64) -> bool { self.0.as_ref().and_then(|v| v.as_f64()) == Some(*o) }\n}\nimpl PartialEq<bool> for _Json {\n fn eq(&self, o: &bool) -> bool { self.0.as_ref().and_then(|v| v.as_bool()) == Some(*o) }\n}\nfn _get<M: _Lookup>(m: &M, k: &str) -> M::Out { m.lookup(k) }"],"object/merge":["fn _merge<V: Clone>(a: &std::collections::BTreeMap<String, V>, b: &std::collections::BTreeMap<String, V>) -> std::collections::BTreeMap<String, V> {\n let mut m = a.clone();\n for (k, v) in b { m.insert(k.clone(), v.clone()); }\n m\n}"],"object/pick":["fn _pick<V: Clone>(m: &std::collections::BTreeMap<String, V>, ks: &[String]) -> std::collections::BTreeMap<String, V> {\n m.iter().filter(|(k, _)| ks.contains(k)).map(|(k, v)| (k.clone(), v.clone())).collect()\n}"],"object/omit":["fn _omit<V: Clone>(m: &std::collections::BTreeMap<String, V>, ks: &[String]) -> std::collections::BTreeMap<String, V> {\n m.iter().filter(|(k, _)| !ks.contains(k)).map(|(k, v)| (k.clone(), v.clone())).collect()\n}"],"unsupported":["#[derive(Clone)]\nstruct _U;\nfn _unsupported(op: &str) -> _U { panic!(\"no native template for operator {}\", op) }\nimpl From<_U> for f64 { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for String { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for bool { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<f64> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<String> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl From<_U> for Option<bool> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<T> From<_U> for Vec<T> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<T> From<_U> for Option<Vec<T>> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<K: Ord, V> From<_U> for std::collections::BTreeMap<K, V> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }\nimpl<K: Ord, V> From<_U> for Option<std::collections::BTreeMap<K, V>> { fn from(_: _U) -> Self { panic!(\"unsupported\") } }"]},"wired":true},"helperGap":{"type":"unknown","default":"\n","wired":true},"portEffects":{"type":"unknown","default":["list","persist","fetch","fetch-stream","notify","navigate","navigate-back","call-service","cancel-call","send-server","spawn","despawn","log"],"wired":true},"portCall":{"type":"unknown","default":"(self.ports)(\"{{name}}\", serde_json::json!([{{*}}]))","wired":true},"portCase":{"type":"unknown","default":"lower","wired":true},"portWarn":{"type":"unknown","default":"{{op}} is called on the ports object","wired":true},"attributeRoots":{"type":"unknown","default":{"entity":"self.entity","state":"self.state","payload":"payload","config":"self.config"},"wired":true},"attrAccess":{"type":"unknown","default":".{{name}}","wired":true},"indexAccess":{"type":"unknown","default":"[{{0}}]","wired":true},"localAccess":{"type":"unknown","default":"attr","wired":true},"entityReadDefault":{"type":"unknown","default":"{{read}}.clone().unwrap_or({{default}})","wired":true},"nullLit":{"type":"unknown","default":"None","wired":true},"trueLit":{"type":"unknown","default":"true","wired":true},"falseLit":{"type":"unknown","default":"false","wired":true},"stringForm":{"type":"unknown","default":"{{json}}.to_string()","wired":true},"numberForm":{"type":"unknown","default":"{{json}}_f64","wired":true},"numberIntForm":{"type":"unknown","default":"{{json}}_f64","wired":true},"listForm":{"type":"unknown","default":"_list!({{*}})","wired":true},"mapOpen":{"type":"unknown","default":"std::collections::BTreeMap::from([","wired":true},"mapClose":{"type":"unknown","default":"])","wired":true},"mapEmpty":{"type":"unknown","default":"std::collections::BTreeMap::new()","wired":true},"mapPair":{"type":"unknown","default":"({{key}}, ({{value}}).clone())","wired":true},"mapSep":{"type":"unknown","default":", ","wired":true},"letStmt":{"type":"unknown","default":"let {{name}} = ({{value}}).clone()","wired":true},"letExpr":{"type":"unknown","default":"{ let {{name}} = ({{value}}).clone(); {{body}} }","wired":true},"condExpr":{"type":"unknown","default":"(if {{cond}} { ({{then}}).clone() } else { ({{else}}).clone() })","wired":true},"ifOpen":{"type":"unknown","default":"if {{cond}} {","wired":true},"elseOpen":{"type":"unknown","default":"} else {","wired":true},"blockClose":{"type":"unknown","default":"}","wired":true},"emptyBody":{"type":"unknown","default":"","wired":true},"setStyle":{"type":"unknown","default":"assign","wired":true},"setAssign":{"type":"unknown","default":"{{target}} = ({{value}}).clone().into()","wired":true},"emitForm":{"type":"unknown","default":"self.emit({{event}}, {{payload}})","wired":true},"payloadType":{"type":"unknown","default":"{{trait}}{{event}}Payload","wired":true},"configType":{"type":"unknown","default":"{{trait}}Config","wired":true},"payloadCtor":{"type":"unknown","default":"serde_json::to_value({{type}} { {{fields}} }).ok()","wired":true},"payloadField":{"type":"unknown","default":"{{name}}: ({{value}}).clone().into()","wired":true},"payloadSep":{"type":"unknown","default":", ","wired":true},"commentForm":{"type":"unknown","default":"// {{text}}","wired":true},"indent":{"type":"unknown","default":" ","wired":true},"terminator":{"type":"unknown","default":";","wired":true},"classCase":{"type":"unknown","default":"keep","wired":true},"fieldCase":{"type":"unknown","default":"keep","wired":true},"localCase":{"type":"unknown","default":"keep","wired":true},"methodCase":{"type":"unknown","default":"lower","wired":true},"methodName":{"type":"unknown","default":"on_{{event}}","wired":true},"modelImports":{"type":"unknown","default":{"entity":"use crate::generated::entities::{{name}};","payload":"use crate::generated::events::{{name}};"},"wired":true},"recordForm":{"type":"unknown","default":"{{type}} { {{fields}} }","wired":true},"recordField":{"type":"unknown","default":"{{name}}: ({{value}}).clone().into()","wired":true},"unionArmForm":{"type":"unknown","default":"{{union}}::{{arm}}({{inner}})","wired":true},"enumForm":{"type":"unknown","default":"{{enum}}::{{member}}","wired":true},"enumMemberCase":{"type":"unknown","default":"split-pascal","wired":true},"fieldNames":{"type":"unknown","default":{"type":"type_"},"wired":true},"programOpen":{"type":"unknown","default":["pub struct Program {","{{i}}pub router: _Router,","}","","impl Program {","{{i}}pub fn new(entities: ({{entities}},){{store}}) -> Self {","{{i}}{{i}}let mut router = _Router::default();"],"wired":true},"programEntity":{"type":"unknown","default":"{{entity}}","wired":true},"programEntitySep":{"type":"unknown","default":", ","wired":true},"programTrait":{"type":"unknown","default":"{{i}}{{i}}_routed!({{class}}); router.add({{key}}, Box::new({{class}}::new(entities.{{n}})));","wired":true},"programHandles":{"type":"unknown","default":"{{i}}{{i}}router.handles.insert({{key}}, {{table}});","wired":true},"programRow":{"type":"unknown","default":"{{i}}{{i}}router.row({{source}}, {{event}}, {{target}}, {{trigger}}, {{guard}}, {{map}});","wired":true},"deliverOpen":{"type":"unknown","default":["{{i}}{{i}}Program { router }","{{i}}}","","{{i}}pub fn dispatch(&mut self, trait_: &str, event: &str, payload: serde_json::Value) {","{{i}}{{i}}_dispatch(self, trait_, event, payload)","{{i}}}","}","","impl _Program for Program {","{{i}}fn router(&mut self) -> &mut _Router {","{{i}}{{i}}&mut self.router","{{i}}}","","{{i}}fn deliver(&mut self, target: &str, event: &str, payload: &serde_json::Value) {"],"wired":true},"deliverCase":{"type":"unknown","default":"{{i}}{{i}}if target == {{target}} && event == {{event}} { if let Some(t) = self.router.get::<{{class}}>(target) { t.{{method}}({{arg}}); } return; }","wired":true},"deliverCasePlain":{"type":"unknown","default":"{{i}}{{i}}if target == {{target}} && event == {{event}} { if let Some(t) = self.router.get::<{{class}}>(target) { t.{{method}}(); } return; }","wired":true},"deliverClose":{"type":"unknown","default":["{{i}}}","}"],"wired":true},"programClose":{"type":"unknown","default":[],"wired":true},"payloadDecode":{"type":"unknown","default":"&_decode::<{{type}}>({{value}})","wired":true},"guardForm":{"type":"unknown","default":["","fn {{name}}(payload_json: &serde_json::Value) -> bool {","{{i}}let payload = {{decode}};","{{i}}{{expr}}","}"],"wired":true},"mapForm":{"type":"unknown","default":["","fn {{name}}(payload_json: &serde_json::Value) -> serde_json::Value {","{{i}}let payload = {{decode}};","{{i}}serde_json::to_value({{expr}}).expect(\"a mapped payload\")","}"],"wired":true},"guardName":{"type":"unknown","default":"_guard_{{n}}","wired":true},"mapName":{"type":"unknown","default":"_map_{{n}}","wired":true},"guardRef":{"type":"unknown","default":"Some({{name}})","wired":true},"mapRef":{"type":"unknown","default":"Some({{name}})","wired":true},"modelImportEach":{"type":"unknown","default":true,"wired":true},"fileHeader":{"type":"unknown","default":"#![allow(dead_code, unused_macros, unused_parens, unused_variables)]","wired":true},"sectionGap":{"type":"unknown","default":"\n\n","wired":true},"classOpen":{"type":"unknown","default":"macro_rules! _list {\n ($($x:expr),* $(,)?) => { vec![$(($x).clone()),*] };\n}\n\npub struct {{class}} {","wired":true},"classClose":{"type":"unknown","default":"}","wired":true},"classEmpty":{"type":"unknown","default":"","wired":true},"constructor":{"type":"unknown","default":["{{i}}pub state: String,","{{i}}pub entity: {{entity}},","{{i}}pub config: {{configType}},","{{i}}pub ports: Box<dyn FnMut(&str, serde_json::Value)>,","{{i}}pub emitted: Vec<(String, Option<serde_json::Value>)>,","{{withStore}}{{i}}pub store: Option<std::rc::Rc<std::cell::RefCell<dyn Store>>>,","{{withStore}}{{i}}pub completed: Vec<usize>,","}","","impl {{class}} {","{{i}}pub fn new(entity: {{entity}}) -> Self {","{{noStore}}{{i}}{{i}}Self { state: {{initial}}, entity, config: {{configType}}::default(), ports: Box::new(|_, _| {}), emitted: Vec::new() }","{{noStore}}{{noConfig}}{{i}}{{i}}Self { state: {{initial}}, entity, ports: Box::new(|_, _| {}), emitted: Vec::new() }","{{withStore}}{{i}}{{i}}Self { state: {{initial}}, entity, config: {{configType}}::default(), ports: Box::new(|_, _| {}), emitted: Vec::new(), store: None, completed: Vec::new() }","{{withStore}}{{noConfig}}{{i}}{{i}}Self { state: {{initial}}, entity, ports: Box::new(|_, _| {}), emitted: Vec::new(), store: None, completed: Vec::new() }","{{i}}}","","{{i}}pub fn with_config(mut self, config: {{configType}}) -> Self {","{{withConfig}}{{i}}{{i}}self.config = config;","{{withConfig}}{{i}}{{i}}self","{{withConfig}}{{i}}}","{{withConfig}}","{{i}}pub fn with_ports(mut self, ports: impl FnMut(&str, serde_json::Value) + 'static) -> Self {","{{i}}{{i}}self.ports = Box::new(ports);","{{i}}{{i}}self","{{i}}}"],"wired":true},"emitMethod":{"type":"unknown","default":["{{i}}fn emit(&mut self, event: String, payload: Option<serde_json::Value>) {","{{i}}{{i}}self.emitted.push((event, payload));","{{i}}}"],"wired":true},"completeMethod":{"type":"unknown","default":["","{{i}}fn complete(&mut self, answer: (bool, serde_json::Value), success: Option<String>, failure: Option<String>) {","{{i}}{{i}}let (ok, payload) = answer;","{{i}}{{i}}if let Some(route) = if ok { success } else { failure } {","{{i}}{{i}}{{i}}self.completed.push(self.emitted.len());","{{i}}{{i}}{{i}}self.emitted.push((route, Some(payload)));","{{i}}{{i}}}","{{i}}}","","{{i}}fn use_store(&self) -> std::rc::Rc<std::cell::RefCell<dyn Store>> {","{{i}}{{i}}self.store.clone().expect(\"no store\")","{{i}}}"],"wired":true},"routedEffects":{"type":"unknown","default":{"persist":"self.complete(self.use_store().borrow_mut().persist(&{{0}}, &{{1}}, serde_json::to_value(&{{2}}).expect(\"a row\")), {{success}}, {{failure}})","fetch":"self.complete(self.use_store().borrow_mut().fetch(&{{entity}}, {{filter}}), {{success}}, {{failure}})"},"wired":true},"fetchAll":{"type":"unknown","default":"None","wired":true},"routeForm":{"type":"unknown","default":"Some({{route}})","wired":true},"filterForm":{"type":"unknown","default":"Some(&({{lambda}}))","wired":true},"programStoreParam":{"type":"unknown","default":", store: std::rc::Rc<std::cell::RefCell<dyn Store>>","wired":true},"programTraitStore":{"type":"unknown","default":"{{i}}{{i}}_routed_store!({{class}}); let mut t{{n}} = {{class}}::new(entities.{{n}}); t{{n}}.store = Some(store.clone()); router.add({{key}}, Box::new(t{{n}}));","wired":true},"methodOpen":{"type":"unknown","default":"{{i}}pub fn {{method}}(&mut self, payload: &{{payloadType}}) {","wired":true},"methodOpenPlain":{"type":"unknown","default":"{{i}}pub fn {{method}}(&mut self) {","wired":true},"methodClose":{"type":"unknown","default":"{{i}}}","wired":true},"branchFirst":{"type":"unknown","default":"{{i}}{{i}}if {{test}} {","wired":true},"branchNext":{"type":"unknown","default":"{{i}}{{i}}} else if {{test}} {","wired":true},"branchClose":{"type":"unknown","default":"{{i}}{{i}}}","wired":true},"branchTest":{"type":"unknown","default":"{{stateTest}} && {{guard}}","wired":true},"branchTestPlain":{"type":"unknown","default":"{{stateTest}}","wired":true},"stateTest":{"type":"unknown","default":"self.state == {{state}}","wired":true},"stateAssign":{"type":"unknown","default":"self.state = {{state}}","wired":true},"bodyPrefix":{"type":"unknown","default":"{{i}}{{i}}{{i}}","wired":true},"renderModels":{"type":"unknown","default":false,"wired":true}},"events":{"LOLO_TO_SOURCE":"LOLO_TO_RUST","SOURCE_RENDERED":"RUST_RENDERED","SOURCE_RENDER_FAILED":"RUST_RENDER_FAILED"}}],"pages":[{"name":"LoloRustStart","id":"pag_DX3C9B7FE3QQ1P3080X7M1YNFX","path":"","protocol":"boot","traits":[{"ref":"LoloRust","refId":"trt_93N67H7PNRVAWBDYCH3GEMCJR2"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_K05G2RCBC65P36HPE1RMHT9T5A":{"id":"ent_K05G2RCBC65P36HPE1RMHT9T5A","kind":"entity","bakedName":"LoloRustRun","curName":"LoloRustRun","renames":[],"owner":"workspace"},"orb_X00PV738MGMA8B8NN4V82TVQ1T":{"id":"orb_X00PV738MGMA8B8NN4V82TVQ1T","kind":"orbital","bakedName":"LoloRustOrbital","curName":"LoloRustOrbital","renames":[],"owner":"workspace"},"pag_DX3C9B7FE3QQ1P3080X7M1YNFX":{"id":"pag_DX3C9B7FE3QQ1P3080X7M1YNFX","kind":"page","bakedName":"LoloRustStart","curName":"LoloRustStart","renames":[],"owner":"workspace"},"trt_93N67H7PNRVAWBDYCH3GEMCJR2":{"id":"trt_93N67H7PNRVAWBDYCH3GEMCJR2","kind":"trait","bakedName":"LoloRust","curName":"LoloRust","renames":[],"owner":"workspace"}}}}