@soundscript/soundscript 0.1.13 → 0.1.15

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 (441) hide show
  1. package/package.json +15 -6
  2. package/project-transform/index.js +2 -0
  3. package/project-transform/index.ts +8 -0
  4. package/project-transform/src/annotation_syntax.js +948 -0
  5. package/project-transform/src/annotation_syntax.ts +1217 -0
  6. package/project-transform/src/build_package.js +475 -0
  7. package/project-transform/src/build_package.ts +683 -0
  8. package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
  9. package/project-transform/src/bundled/runtime_externs.js +220 -0
  10. package/project-transform/src/bundled/runtime_externs.ts +237 -0
  11. package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
  12. package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
  13. package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
  14. package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
  15. package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
  16. package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
  17. package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
  18. package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
  19. package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
  20. package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
  21. package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
  22. package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
  23. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
  24. package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
  25. package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
  26. package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
  27. package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
  28. package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
  29. package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
  30. package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
  31. package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
  32. package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
  33. package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
  34. package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
  35. package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
  36. package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
  37. package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
  38. package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
  39. package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
  40. package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
  41. package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
  42. package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
  43. package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
  44. package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
  45. package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
  46. package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
  47. package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
  48. package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
  49. package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
  50. package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
  51. package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
  52. package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
  53. package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
  54. package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
  55. package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
  56. package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
  57. package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
  58. package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
  59. package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
  60. package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
  61. package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
  62. package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
  63. package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
  64. package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
  65. package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
  66. package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
  67. package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
  68. package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
  69. package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
  70. package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
  71. package/project-transform/src/bundled/sound_stdlib.js +142 -0
  72. package/project-transform/src/bundled/sound_stdlib.ts +180 -0
  73. package/project-transform/src/checker/analyze_project.js +1361 -0
  74. package/project-transform/src/checker/analyze_project.ts +2246 -0
  75. package/project-transform/src/checker/diagnostics.js +112 -0
  76. package/project-transform/src/checker/diagnostics.ts +222 -0
  77. package/project-transform/src/checker/engine/context.js +235 -0
  78. package/project-transform/src/checker/engine/context.ts +340 -0
  79. package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
  80. package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
  81. package/project-transform/src/checker/engine/facts.js +35 -0
  82. package/project-transform/src/checker/engine/facts.ts +48 -0
  83. package/project-transform/src/checker/engine/types.js +1 -0
  84. package/project-transform/src/checker/engine/types.ts +485 -0
  85. package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
  86. package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
  87. package/project-transform/src/checker/rules/async_surface.js +231 -0
  88. package/project-transform/src/checker/rules/async_surface.ts +335 -0
  89. package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
  90. package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
  91. package/project-transform/src/checker/rules/directive_validation.js +571 -0
  92. package/project-transform/src/checker/rules/directive_validation.ts +938 -0
  93. package/project-transform/src/checker/rules/directives.js +23 -0
  94. package/project-transform/src/checker/rules/directives.ts +25 -0
  95. package/project-transform/src/checker/rules/flow.js +202 -0
  96. package/project-transform/src/checker/rules/flow.ts +333 -0
  97. package/project-transform/src/checker/rules/flow_facts.js +601 -0
  98. package/project-transform/src/checker/rules/flow_facts.ts +978 -0
  99. package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
  100. package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
  101. package/project-transform/src/checker/rules/flow_shared.js +2822 -0
  102. package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
  103. package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
  104. package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
  105. package/project-transform/src/checker/rules/foreign_projection.js +279 -0
  106. package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
  107. package/project-transform/src/checker/rules/generated_helpers.js +13 -0
  108. package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
  109. package/project-transform/src/checker/rules/index.js +35 -0
  110. package/project-transform/src/checker/rules/index.ts +49 -0
  111. package/project-transform/src/checker/rules/namespace_object.js +845 -0
  112. package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
  113. package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
  114. package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
  115. package/project-transform/src/checker/rules/null_prototype.js +3 -0
  116. package/project-transform/src/checker/rules/null_prototype.ts +6 -0
  117. package/project-transform/src/checker/rules/overloads.js +181 -0
  118. package/project-transform/src/checker/rules/overloads.ts +317 -0
  119. package/project-transform/src/checker/rules/predicate_verification.js +691 -0
  120. package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
  121. package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
  122. package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
  123. package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
  124. package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
  125. package/project-transform/src/checker/rules/relations.js +6861 -0
  126. package/project-transform/src/checker/rules/relations.ts +12158 -0
  127. package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
  128. package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
  129. package/project-transform/src/checker/rules/trust.js +217 -0
  130. package/project-transform/src/checker/rules/trust.ts +301 -0
  131. package/project-transform/src/checker/rules/type_guards.js +173 -0
  132. package/project-transform/src/checker/rules/type_guards.ts +257 -0
  133. package/project-transform/src/checker/rules/universal.js +17 -0
  134. package/project-transform/src/checker/rules/universal.ts +22 -0
  135. package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
  136. package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
  137. package/project-transform/src/checker/rules/unsound_imports.js +218 -0
  138. package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
  139. package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
  140. package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
  141. package/project-transform/src/checker/rules/value_types.js +206 -0
  142. package/project-transform/src/checker/rules/value_types.ts +407 -0
  143. package/project-transform/src/checker/timing.js +43 -0
  144. package/project-transform/src/checker/timing.ts +78 -0
  145. package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
  146. package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
  147. package/project-transform/src/cli.js +892 -0
  148. package/project-transform/src/cli.ts +1476 -0
  149. package/project-transform/src/compiler/compile_project.js +319 -0
  150. package/project-transform/src/compiler/compile_project.ts +508 -0
  151. package/project-transform/src/compiler/errors.js +10 -0
  152. package/project-transform/src/compiler/errors.ts +29 -0
  153. package/project-transform/src/compiler/ir.js +1 -0
  154. package/project-transform/src/compiler/ir.ts +1526 -0
  155. package/project-transform/src/compiler/lower.js +30550 -0
  156. package/project-transform/src/compiler/lower.ts +43645 -0
  157. package/project-transform/src/compiler/lower_arrays.js +140 -0
  158. package/project-transform/src/compiler/lower_arrays.ts +190 -0
  159. package/project-transform/src/compiler/lower_strings.js +121 -0
  160. package/project-transform/src/compiler/lower_strings.ts +198 -0
  161. package/project-transform/src/compiler/lower_tagged.js +329 -0
  162. package/project-transform/src/compiler/lower_tagged.ts +427 -0
  163. package/project-transform/src/compiler/lower_views.js +171 -0
  164. package/project-transform/src/compiler/lower_views.ts +251 -0
  165. package/project-transform/src/compiler/object_keys.js +25 -0
  166. package/project-transform/src/compiler/object_keys.ts +35 -0
  167. package/project-transform/src/compiler/runtime_ir.js +30 -0
  168. package/project-transform/src/compiler/runtime_ir.ts +727 -0
  169. package/project-transform/src/compiler/tagged_boundary.js +18 -0
  170. package/project-transform/src/compiler/tagged_boundary.ts +37 -0
  171. package/project-transform/src/compiler/toolchain.js +170 -0
  172. package/project-transform/src/compiler/toolchain.ts +229 -0
  173. package/project-transform/src/compiler/unicode_case_data.js +2102 -0
  174. package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
  175. package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
  176. package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
  177. package/project-transform/src/compiler/wat_arrays.js +3132 -0
  178. package/project-transform/src/compiler/wat_arrays.ts +3768 -0
  179. package/project-transform/src/compiler/wat_emitter.js +17952 -0
  180. package/project-transform/src/compiler/wat_emitter.ts +22812 -0
  181. package/project-transform/src/compiler/wat_strings.js +129 -0
  182. package/project-transform/src/compiler/wat_strings.ts +187 -0
  183. package/project-transform/src/compiler/wat_tagged.js +548 -0
  184. package/project-transform/src/compiler/wat_tagged.ts +674 -0
  185. package/project-transform/src/compiler_generator_runner.js +153 -0
  186. package/project-transform/src/compiler_generator_runner.ts +171 -0
  187. package/project-transform/src/compiler_object_test_helpers.js +69 -0
  188. package/project-transform/src/compiler_object_test_helpers.ts +96 -0
  189. package/project-transform/src/compiler_promise_runner.js +2116 -0
  190. package/project-transform/src/compiler_promise_runner.ts +2184 -0
  191. package/project-transform/src/compiler_test_helpers.js +854 -0
  192. package/project-transform/src/compiler_test_helpers.ts +1087 -0
  193. package/project-transform/src/config.js +568 -0
  194. package/project-transform/src/config.ts +892 -0
  195. package/project-transform/src/diagnostic_metadata.js +67 -0
  196. package/project-transform/src/diagnostic_metadata.ts +99 -0
  197. package/project-transform/src/diagnostic_reference.js +1368 -0
  198. package/project-transform/src/diagnostic_reference.ts +1523 -0
  199. package/project-transform/src/editor_diagnostics_worker.js +176 -0
  200. package/project-transform/src/editor_diagnostics_worker.ts +250 -0
  201. package/project-transform/src/editor_projection.js +224 -0
  202. package/project-transform/src/editor_projection.ts +421 -0
  203. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
  204. package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
  205. package/project-transform/src/frontend/builtin_macro_support.js +842 -0
  206. package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
  207. package/project-transform/src/frontend/builtin_macros.js +409 -0
  208. package/project-transform/src/frontend/builtin_macros.ts +542 -0
  209. package/project-transform/src/frontend/component_poc_runtime.js +279 -0
  210. package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
  211. package/project-transform/src/frontend/css_macro.js +148 -0
  212. package/project-transform/src/frontend/css_macro.ts +222 -0
  213. package/project-transform/src/frontend/derive_macros.js +2072 -0
  214. package/project-transform/src/frontend/derive_macros.ts +3188 -0
  215. package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
  216. package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
  217. package/project-transform/src/frontend/error_normalization.js +403 -0
  218. package/project-transform/src/frontend/error_normalization.ts +832 -0
  219. package/project-transform/src/frontend/error_stdlib_support.js +1 -0
  220. package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
  221. package/project-transform/src/frontend/expand_project.js +169 -0
  222. package/project-transform/src/frontend/expand_project.ts +248 -0
  223. package/project-transform/src/frontend/format_soundscript.js +297 -0
  224. package/project-transform/src/frontend/format_soundscript.ts +582 -0
  225. package/project-transform/src/frontend/graphql_macro.js +174 -0
  226. package/project-transform/src/frontend/graphql_macro.ts +253 -0
  227. package/project-transform/src/frontend/hash_context.js +83 -0
  228. package/project-transform/src/frontend/hash_context.ts +113 -0
  229. package/project-transform/src/frontend/hkt_macro.js +448 -0
  230. package/project-transform/src/frontend/hkt_macro.ts +897 -0
  231. package/project-transform/src/frontend/import_binding_usage.js +190 -0
  232. package/project-transform/src/frontend/import_binding_usage.ts +277 -0
  233. package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
  234. package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
  235. package/project-transform/src/frontend/macro_advanced_context.js +826 -0
  236. package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
  237. package/project-transform/src/frontend/macro_advanced_output.js +21 -0
  238. package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
  239. package/project-transform/src/frontend/macro_api.js +353 -0
  240. package/project-transform/src/frontend/macro_api.ts +1722 -0
  241. package/project-transform/src/frontend/macro_api_internal.js +35 -0
  242. package/project-transform/src/frontend/macro_api_internal.ts +80 -0
  243. package/project-transform/src/frontend/macro_api_module_support.js +39 -0
  244. package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
  245. package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
  246. package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
  247. package/project-transform/src/frontend/macro_context.js +816 -0
  248. package/project-transform/src/frontend/macro_context.ts +1105 -0
  249. package/project-transform/src/frontend/macro_debug.js +99 -0
  250. package/project-transform/src/frontend/macro_debug.ts +157 -0
  251. package/project-transform/src/frontend/macro_definition_support.js +28 -0
  252. package/project-transform/src/frontend/macro_definition_support.ts +73 -0
  253. package/project-transform/src/frontend/macro_errors.js +40 -0
  254. package/project-transform/src/frontend/macro_errors.ts +70 -0
  255. package/project-transform/src/frontend/macro_expander.js +919 -0
  256. package/project-transform/src/frontend/macro_expander.ts +1611 -0
  257. package/project-transform/src/frontend/macro_factory_support.js +176 -0
  258. package/project-transform/src/frontend/macro_factory_support.ts +263 -0
  259. package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
  260. package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
  261. package/project-transform/src/frontend/macro_index.js +27 -0
  262. package/project-transform/src/frontend/macro_index.ts +50 -0
  263. package/project-transform/src/frontend/macro_loader.js +281 -0
  264. package/project-transform/src/frontend/macro_loader.ts +506 -0
  265. package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
  266. package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
  267. package/project-transform/src/frontend/macro_output.js +54 -0
  268. package/project-transform/src/frontend/macro_output.ts +123 -0
  269. package/project-transform/src/frontend/macro_parser.js +611 -0
  270. package/project-transform/src/frontend/macro_parser.ts +832 -0
  271. package/project-transform/src/frontend/macro_resolver.js +69 -0
  272. package/project-transform/src/frontend/macro_resolver.ts +125 -0
  273. package/project-transform/src/frontend/macro_rewrite.js +285 -0
  274. package/project-transform/src/frontend/macro_rewrite.ts +442 -0
  275. package/project-transform/src/frontend/macro_runtime_support.js +232 -0
  276. package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
  277. package/project-transform/src/frontend/macro_scanner.js +393 -0
  278. package/project-transform/src/frontend/macro_scanner.ts +455 -0
  279. package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
  280. package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
  281. package/project-transform/src/frontend/macro_semantic_context.js +5 -0
  282. package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
  283. package/project-transform/src/frontend/macro_semantic_output.js +24 -0
  284. package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
  285. package/project-transform/src/frontend/macro_semantic_types.js +1 -0
  286. package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
  287. package/project-transform/src/frontend/macro_semantics.js +1172 -0
  288. package/project-transform/src/frontend/macro_semantics.ts +1502 -0
  289. package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
  290. package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
  291. package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
  292. package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
  293. package/project-transform/src/frontend/macro_templates.js +57 -0
  294. package/project-transform/src/frontend/macro_templates.ts +143 -0
  295. package/project-transform/src/frontend/macro_test_helpers.js +82 -0
  296. package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
  297. package/project-transform/src/frontend/macro_types.js +1 -0
  298. package/project-transform/src/frontend/macro_types.ts +103 -0
  299. package/project-transform/src/frontend/macro_vm.js +39 -0
  300. package/project-transform/src/frontend/macro_vm.ts +113 -0
  301. package/project-transform/src/frontend/match_macro.js +885 -0
  302. package/project-transform/src/frontend/match_macro.ts +1220 -0
  303. package/project-transform/src/frontend/numeric_normalization.js +824 -0
  304. package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
  305. package/project-transform/src/frontend/numeric_prelude.js +278 -0
  306. package/project-transform/src/frontend/numeric_prelude.ts +370 -0
  307. package/project-transform/src/frontend/project_frontend.js +2396 -0
  308. package/project-transform/src/frontend/project_frontend.ts +3776 -0
  309. package/project-transform/src/frontend/project_macro_support.js +1401 -0
  310. package/project-transform/src/frontend/project_macro_support.ts +2137 -0
  311. package/project-transform/src/frontend/sql_macro.js +175 -0
  312. package/project-transform/src/frontend/sql_macro.ts +254 -0
  313. package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
  314. package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
  315. package/project-transform/src/frontend/std_package_support.js +228 -0
  316. package/project-transform/src/frontend/std_package_support.ts +400 -0
  317. package/project-transform/src/frontend/value_normalization.js +306 -0
  318. package/project-transform/src/frontend/value_normalization.ts +599 -0
  319. package/project-transform/src/lsp/project_service.js +4771 -0
  320. package/project-transform/src/lsp/project_service.ts +7580 -0
  321. package/project-transform/src/lsp/protocol.js +9 -0
  322. package/project-transform/src/lsp/protocol.ts +38 -0
  323. package/project-transform/src/lsp/server.js +355 -0
  324. package/project-transform/src/lsp/server.ts +671 -0
  325. package/project-transform/src/lsp/session.js +49 -0
  326. package/project-transform/src/lsp/session.ts +48 -0
  327. package/project-transform/src/lsp/timing.js +43 -0
  328. package/project-transform/src/lsp/timing.ts +76 -0
  329. package/project-transform/src/lsp/transport.js +205 -0
  330. package/project-transform/src/lsp/transport.ts +253 -0
  331. package/project-transform/src/lsp_main.js +5 -0
  332. package/project-transform/src/lsp_main.ts +7 -0
  333. package/project-transform/src/macros.d.ts +1 -0
  334. package/project-transform/src/macros.js +1 -0
  335. package/project-transform/src/macros.ts +1 -0
  336. package/project-transform/src/main.js +24 -0
  337. package/project-transform/src/main.ts +28 -0
  338. package/project-transform/src/platform/host.js +264 -0
  339. package/project-transform/src/platform/host.ts +343 -0
  340. package/project-transform/src/platform/path.js +8 -0
  341. package/project-transform/src/platform/path.ts +20 -0
  342. package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
  343. package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
  344. package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
  345. package/project-transform/src/run_program.js +14 -0
  346. package/project-transform/src/run_program.ts +33 -0
  347. package/project-transform/src/runtime/materialize.js +371 -0
  348. package/project-transform/src/runtime/materialize.ts +502 -0
  349. package/project-transform/src/runtime/on_demand.js +203 -0
  350. package/project-transform/src/runtime/on_demand.ts +305 -0
  351. package/project-transform/src/runtime/source_maps.js +205 -0
  352. package/project-transform/src/runtime/source_maps.ts +297 -0
  353. package/project-transform/src/runtime/transform.js +148 -0
  354. package/project-transform/src/runtime/transform.ts +295 -0
  355. package/project-transform/src/service/types.js +1 -0
  356. package/project-transform/src/service/types.ts +22 -0
  357. package/project-transform/src/soundscript_packages.js +477 -0
  358. package/project-transform/src/soundscript_packages.ts +754 -0
  359. package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
  360. package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
  361. package/project-transform/src/stdlib/async.d.ts +81 -0
  362. package/project-transform/src/stdlib/async.js +213 -0
  363. package/project-transform/src/stdlib/async.ts +315 -0
  364. package/project-transform/src/stdlib/codec.d.ts +32 -0
  365. package/project-transform/src/stdlib/codec.js +30 -0
  366. package/project-transform/src/stdlib/codec.ts +76 -0
  367. package/project-transform/src/stdlib/compare.d.ts +28 -0
  368. package/project-transform/src/stdlib/compare.js +115 -0
  369. package/project-transform/src/stdlib/compare.ts +151 -0
  370. package/project-transform/src/stdlib/css.d.ts +16 -0
  371. package/project-transform/src/stdlib/css.js +9 -0
  372. package/project-transform/src/stdlib/css.ts +28 -0
  373. package/project-transform/src/stdlib/debug.d.ts +2 -0
  374. package/project-transform/src/stdlib/debug.js +9 -0
  375. package/project-transform/src/stdlib/debug.ts +10 -0
  376. package/project-transform/src/stdlib/decode.d.ts +86 -0
  377. package/project-transform/src/stdlib/decode.js +254 -0
  378. package/project-transform/src/stdlib/decode.ts +390 -0
  379. package/project-transform/src/stdlib/derive.d.ts +6 -0
  380. package/project-transform/src/stdlib/derive.js +7 -0
  381. package/project-transform/src/stdlib/derive.ts +7 -0
  382. package/project-transform/src/stdlib/encode.d.ts +100 -0
  383. package/project-transform/src/stdlib/encode.js +130 -0
  384. package/project-transform/src/stdlib/encode.ts +259 -0
  385. package/project-transform/src/stdlib/failures.d.ts +23 -0
  386. package/project-transform/src/stdlib/failures.js +41 -0
  387. package/project-transform/src/stdlib/failures.ts +64 -0
  388. package/project-transform/src/stdlib/fetch.d.ts +67 -0
  389. package/project-transform/src/stdlib/fetch.js +5 -0
  390. package/project-transform/src/stdlib/fetch.ts +11 -0
  391. package/project-transform/src/stdlib/graphql.d.ts +16 -0
  392. package/project-transform/src/stdlib/graphql.js +9 -0
  393. package/project-transform/src/stdlib/graphql.ts +28 -0
  394. package/project-transform/src/stdlib/hash.d.ts +34 -0
  395. package/project-transform/src/stdlib/hash.js +110 -0
  396. package/project-transform/src/stdlib/hash.ts +188 -0
  397. package/project-transform/src/stdlib/hkt.d.ts +40 -0
  398. package/project-transform/src/stdlib/hkt.js +3 -0
  399. package/project-transform/src/stdlib/hkt.ts +41 -0
  400. package/project-transform/src/stdlib/index.d.ts +9 -0
  401. package/project-transform/src/stdlib/index.js +15 -0
  402. package/project-transform/src/stdlib/index.ts +23 -0
  403. package/project-transform/src/stdlib/json.d.ts +125 -0
  404. package/project-transform/src/stdlib/json.js +764 -0
  405. package/project-transform/src/stdlib/json.ts +1034 -0
  406. package/project-transform/src/stdlib/match.d.ts +11 -0
  407. package/project-transform/src/stdlib/match.js +13 -0
  408. package/project-transform/src/stdlib/match.ts +26 -0
  409. package/project-transform/src/stdlib/numerics.d.ts +523 -0
  410. package/project-transform/src/stdlib/numerics.js +1356 -0
  411. package/project-transform/src/stdlib/numerics.ts +1937 -0
  412. package/project-transform/src/stdlib/random.d.ts +19 -0
  413. package/project-transform/src/stdlib/random.js +3 -0
  414. package/project-transform/src/stdlib/random.ts +5 -0
  415. package/project-transform/src/stdlib/result.d.ts +68 -0
  416. package/project-transform/src/stdlib/result.js +139 -0
  417. package/project-transform/src/stdlib/result.ts +248 -0
  418. package/project-transform/src/stdlib/sql.d.ts +22 -0
  419. package/project-transform/src/stdlib/sql.js +23 -0
  420. package/project-transform/src/stdlib/sql.ts +53 -0
  421. package/project-transform/src/stdlib/text.d.ts +24 -0
  422. package/project-transform/src/stdlib/text.js +3 -0
  423. package/project-transform/src/stdlib/text.ts +4 -0
  424. package/project-transform/src/stdlib/thunk.d.ts +2 -0
  425. package/project-transform/src/stdlib/thunk.js +9 -0
  426. package/project-transform/src/stdlib/thunk.ts +15 -0
  427. package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
  428. package/project-transform/src/stdlib/typeclasses.js +78 -0
  429. package/project-transform/src/stdlib/typeclasses.ts +173 -0
  430. package/project-transform/src/stdlib/url.d.ts +37 -0
  431. package/project-transform/src/stdlib/url.js +3 -0
  432. package/project-transform/src/stdlib/url.ts +4 -0
  433. package/project-transform/src/stdlib/value.d.ts +9 -0
  434. package/project-transform/src/stdlib/value.js +104 -0
  435. package/project-transform/src/stdlib/value.ts +133 -0
  436. package/project-transform/src/test_installed_stdlib.js +147 -0
  437. package/project-transform/src/test_installed_stdlib.ts +245 -0
  438. package/project-transform/src/test_macro_package_fixture.js +50 -0
  439. package/project-transform/src/test_macro_package_fixture.ts +68 -0
  440. package/project-transform/src/value_deep_safe.js +191 -0
  441. package/project-transform/src/value_deep_safe.ts +273 -0
@@ -0,0 +1,315 @@
1
+ import { type Bind, type Kind2, type TypeLambda } from 'sts:hkt';
2
+ import { Failure, normalizeThrown } from 'sts:failures';
3
+ import { err, isErr, ok, type Result, resultOf } from 'sts:result';
4
+ import { type Applicative, type AsyncMonad, type Functor, type Monad } from 'sts:typeclasses';
5
+
6
+ export interface AbortSignalLike {
7
+ readonly aborted: boolean;
8
+ readonly reason?: unknown;
9
+ addEventListener(
10
+ type: 'abort',
11
+ listener: () => void,
12
+ options?: boolean | { once?: boolean },
13
+ ): void;
14
+ removeEventListener(type: 'abort', listener: () => void, options?: boolean): void;
15
+ }
16
+
17
+ export type Task<T, E = Error> = (signal?: AbortSignalLike) => Promise<Result<T, E>>;
18
+
19
+ export interface TaskF extends TypeLambda {
20
+ readonly type: Task<this['Args'][1], this['Args'][0]>;
21
+ }
22
+
23
+ export interface PromiseF extends TypeLambda {
24
+ readonly type: Promise<this['Args'][0]>;
25
+ }
26
+
27
+ export type TaskKind<E, T> = Kind2<TaskF, E, T>;
28
+ export type PromiseKind<T> = Promise<T>;
29
+
30
+ export class TimeoutFailure extends Failure {
31
+ readonly ms: number;
32
+
33
+ constructor(ms: number, cause?: unknown) {
34
+ super(`Task timed out after ${ms}ms.`, { cause });
35
+ this.ms = ms;
36
+ }
37
+ }
38
+
39
+ export function succeed<T>(value: T): Task<T, never> {
40
+ return () => Promise.resolve(ok(value));
41
+ }
42
+
43
+ export function fail<E>(error: E): Task<never, E> {
44
+ return () => Promise.resolve(err(error));
45
+ }
46
+
47
+ export function fromResult<T, E>(result: Result<T, E>): Task<T, E> {
48
+ return () => Promise.resolve(result);
49
+ }
50
+
51
+ export function fromPromise<T>(fn: (signal?: AbortSignalLike) => Promise<T>): Task<T, Error>;
52
+ export function fromPromise<T, E>(
53
+ fn: (signal?: AbortSignalLike) => Promise<T>,
54
+ mapError: (error: Error) => E,
55
+ ): Task<T, E>;
56
+ export function fromPromise<T, E>(
57
+ fn: (signal?: AbortSignalLike) => Promise<T>,
58
+ mapError?: (error: Error) => E,
59
+ ): Task<T, E | Error> {
60
+ return async (signal?: AbortSignalLike) => {
61
+ if (mapError) {
62
+ return await resultOf(() => fn(signal), mapError);
63
+ }
64
+
65
+ return await resultOf(() => fn(signal));
66
+ };
67
+ }
68
+
69
+ export function map<A, B, E>(
70
+ task: Task<A, E>,
71
+ project: (value: A) => B,
72
+ ): Task<B, E> {
73
+ return async (signal?: AbortSignalLike) => {
74
+ const result = await task(signal);
75
+ return isErr(result) ? result : ok(project(result.value));
76
+ };
77
+ }
78
+
79
+ export function mapError<A, E1, E2>(
80
+ task: Task<A, E1>,
81
+ project: (error: E1) => E2,
82
+ ): Task<A, E2 | Error> {
83
+ return async (signal?: AbortSignalLike) => {
84
+ const result = await task(signal);
85
+ if (!isErr(result)) {
86
+ return result;
87
+ }
88
+
89
+ try {
90
+ return err(project(result.error));
91
+ } catch (error) {
92
+ return err(normalizeThrown(error));
93
+ }
94
+ };
95
+ }
96
+
97
+ export function flatMap<A, B, E1, E2>(
98
+ task: Task<A, E1>,
99
+ project: (value: A) => Task<B, E2>,
100
+ ): Task<B, E1 | E2> {
101
+ return async (signal?: AbortSignalLike) => {
102
+ const result = await task(signal);
103
+ if (isErr(result)) {
104
+ return result;
105
+ }
106
+ return await project(result.value)(signal);
107
+ };
108
+ }
109
+
110
+ export function recover<A, B, E>(
111
+ task: Task<A, E>,
112
+ project: (error: E) => B | Promise<B>,
113
+ ): Task<A | B, Error> {
114
+ return async (signal?: AbortSignalLike) => {
115
+ const result = await task(signal);
116
+ if (!isErr(result)) {
117
+ return result;
118
+ }
119
+
120
+ return await resultOf(async () => await project(result.error));
121
+ };
122
+ }
123
+
124
+ export function tap<A, E>(
125
+ task: Task<A, E>,
126
+ effect: (value: A) => unknown | Promise<unknown>,
127
+ ): Task<A, E | Error> {
128
+ return async (signal?: AbortSignalLike) => {
129
+ const result = await task(signal);
130
+ if (isErr(result)) {
131
+ return result;
132
+ }
133
+
134
+ const observed = await resultOf(async () => await effect(result.value));
135
+ return isErr(observed) ? observed : result;
136
+ };
137
+ }
138
+
139
+ export function tapError<A, E>(
140
+ task: Task<A, E>,
141
+ effect: (error: E) => unknown | Promise<unknown>,
142
+ ): Task<A, E | Error> {
143
+ return async (signal?: AbortSignalLike) => {
144
+ const result = await task(signal);
145
+ if (!isErr(result)) {
146
+ return result;
147
+ }
148
+
149
+ const observed = await resultOf(async () => await effect(result.error));
150
+ return isErr(observed) ? observed : result;
151
+ };
152
+ }
153
+
154
+ export function parallel<T, E>(tasks: readonly Task<T, E>[]): Task<readonly T[], E> {
155
+ return async (signal?: AbortSignalLike) => {
156
+ const results = await Promise.all(tasks.map((task) => task(signal)));
157
+ const values: T[] = [];
158
+ for (const result of results) {
159
+ if (isErr(result)) {
160
+ return result;
161
+ }
162
+ values.push(result.value);
163
+ }
164
+ return ok(values);
165
+ };
166
+ }
167
+
168
+ export function race<T, E>(
169
+ tasks: readonly [Task<T, E>, ...Task<T, E>[]],
170
+ ): Task<T, E> {
171
+ return async (signal?: AbortSignalLike) => {
172
+ const controller = new AbortController();
173
+ const cleanup = forwardAbort(signal, controller);
174
+
175
+ try {
176
+ return await Promise.race(tasks.map(async (task) => {
177
+ const result = await task(controller.signal);
178
+ controller.abort(result);
179
+ return result;
180
+ }));
181
+ } finally {
182
+ cleanup();
183
+ }
184
+ };
185
+ }
186
+
187
+ export function timeout<T, E>(task: Task<T, E>, ms: number): Task<T, E | TimeoutFailure> {
188
+ return async (signal?: AbortSignalLike) => {
189
+ const controller = new AbortController();
190
+ const cleanup = forwardAbort(signal, controller);
191
+ let timeoutId: number | undefined;
192
+
193
+ try {
194
+ const timeoutPromise = new Promise<Result<T, E | TimeoutFailure>>((resolve) => {
195
+ timeoutId = setTimeout(() => {
196
+ const failure = new TimeoutFailure(ms);
197
+ resolve(err(failure));
198
+ controller.abort(failure);
199
+ }, ms);
200
+ });
201
+
202
+ return await Promise.race([
203
+ task(controller.signal),
204
+ timeoutPromise,
205
+ ]);
206
+ } finally {
207
+ cleanup();
208
+ if (timeoutId !== undefined) {
209
+ clearTimeout(timeoutId);
210
+ }
211
+ }
212
+ };
213
+ }
214
+
215
+ function forwardAbort(
216
+ signal: AbortSignalLike | undefined,
217
+ controller: AbortController,
218
+ ): () => void {
219
+ if (!signal) {
220
+ return () => {};
221
+ }
222
+
223
+ if (signal.aborted) {
224
+ controller.abort(signal.reason);
225
+ return () => {};
226
+ }
227
+
228
+ const onAbort = (): void => {
229
+ controller.abort(signal.reason);
230
+ };
231
+
232
+ signal.addEventListener('abort', onAbort, { once: true });
233
+ return () => signal.removeEventListener('abort', onAbort);
234
+ }
235
+
236
+ function mapTask<E, A, B>(task: Task<A, E>, project: (value: A) => B): Task<B, E> {
237
+ return map(task, project);
238
+ }
239
+
240
+ function apTask<E, A, B>(
241
+ fn: Task<(value: A) => B, E>,
242
+ value: Task<A, E>,
243
+ ): Task<B, E> {
244
+ return flatMap(fn, (resolvedFn) => map(value, resolvedFn));
245
+ }
246
+
247
+ function flatMapTask<E, A, B>(
248
+ task: Task<A, E>,
249
+ project: (value: A) => Task<B, E>,
250
+ ): Task<B, E> {
251
+ return flatMap(task, project);
252
+ }
253
+
254
+ function createTaskMonad<E>(): Monad<Bind<TaskF, [E]>> {
255
+ return {
256
+ ap: apTask,
257
+ flatMap: flatMapTask,
258
+ map: mapTask,
259
+ pure: succeed,
260
+ };
261
+ }
262
+
263
+ export function taskFunctor<E>(): Functor<Bind<TaskF, [E]>> {
264
+ return createTaskMonad<E>();
265
+ }
266
+
267
+ export function taskApplicative<E>(): Applicative<Bind<TaskF, [E]>> {
268
+ return createTaskMonad<E>();
269
+ }
270
+
271
+ export function taskMonad<E>(): Monad<Bind<TaskF, [E]>> {
272
+ return createTaskMonad<E>();
273
+ }
274
+
275
+ export function taskAsyncMonad<E>(): AsyncMonad<Bind<TaskF, [E]>> {
276
+ const monad = createTaskMonad<E>();
277
+ return {
278
+ ...monad,
279
+ fromPromise<A>(promise: Promise<A>): Task<A, E> {
280
+ return fromPromise(() => promise) as Task<A, E>;
281
+ },
282
+ };
283
+ }
284
+
285
+ export const promiseFunctor: Functor<PromiseF> = {
286
+ map<A, B>(value: Promise<A>, f: (value: A) => B): Promise<B> {
287
+ return value.then(f);
288
+ },
289
+ };
290
+
291
+ export const promiseApplicative: Applicative<PromiseF> = {
292
+ ...promiseFunctor,
293
+ ap<A, B>(fn: Promise<(value: A) => B>, value: Promise<A>): Promise<B> {
294
+ return Promise.all([fn, value]).then(([resolvedFn, resolvedValue]) =>
295
+ resolvedFn(resolvedValue)
296
+ );
297
+ },
298
+ pure<A>(value: A): Promise<A> {
299
+ return Promise.resolve(value);
300
+ },
301
+ };
302
+
303
+ export const promiseMonad: Monad<PromiseF> = {
304
+ ...promiseApplicative,
305
+ flatMap<A, B>(value: Promise<A>, f: (value: A) => Promise<B>): Promise<B> {
306
+ return value.then(f);
307
+ },
308
+ };
309
+
310
+ export const promiseAsyncMonad: AsyncMonad<PromiseF> = {
311
+ ...promiseMonad,
312
+ fromPromise<A>(promise: Promise<A>): Promise<A> {
313
+ return promise;
314
+ },
315
+ };
@@ -0,0 +1,32 @@
1
+ import type { Bind, TypeLambda } from 'sts:hkt';
2
+ import { type DecodeFailure, type Decoder } from 'sts:decode';
3
+ import { contramap, type EncodeFailure, type Encoder } from 'sts:encode';
4
+ import type { Invariant } from 'sts:typeclasses';
5
+
6
+ export { booleanEncoder, contramap, numberEncoder, stringEncoder } from 'sts:encode';
7
+ export type { EncodeFailure, Encoder } from 'sts:encode';
8
+
9
+ // #[variance(T: inout, TEncoded: out, DE: out, EE: out)]
10
+ export type Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure> =
11
+ Decoder<T, DE> & Encoder<T, TEncoded, EE>;
12
+
13
+ export interface CodecF extends TypeLambda {
14
+ readonly type: Codec<this['Args'][3], this['Args'][2], this['Args'][1], this['Args'][0]>;
15
+ }
16
+
17
+ export function codec<T, TEncoded, DE, EE>(
18
+ decoder: Decoder<T, DE>,
19
+ encoder: Encoder<T, TEncoded, EE>,
20
+ ): Codec<T, TEncoded, DE, EE>;
21
+ export function imap<A, B, TEncoded, DE, EE>(
22
+ base: Codec<A, TEncoded, DE, EE>,
23
+ decodeMap: (value: A) => B,
24
+ encodeMap: (value: B) => A,
25
+ ): Codec<B, TEncoded, DE, EE>;
26
+ export function codecInvariant<TEncoded, DE = DecodeFailure, EE = EncodeFailure>(): Invariant<
27
+ Bind<Bind<Bind<CodecF, [EE]>, [DE]>, [TEncoded]>
28
+ >;
29
+
30
+ export const stringCodec: Codec<string, string>;
31
+ export const numberCodec: Codec<number, number>;
32
+ export const booleanCodec: Codec<boolean, boolean>;
@@ -0,0 +1,30 @@
1
+ import { boolean as booleanDecoder, number as numberDecoder, string as stringDecoder, } from '@soundscript/soundscript/decode';
2
+ import { booleanEncoder as booleanEncoderValue, contramap as contramapEncoder, numberEncoder as numberEncoderValue, stringEncoder as stringEncoderValue, } from '@soundscript/soundscript/encode';
3
+ import { isErr, ok } from '@soundscript/soundscript/result';
4
+ export { booleanEncoderValue as booleanEncoder, contramapEncoder as contramap, numberEncoderValue as numberEncoder, stringEncoderValue as stringEncoder, };
5
+ export function codec(decoder, encoder) {
6
+ return {
7
+ decode(value) {
8
+ return decoder.decode(value);
9
+ },
10
+ encode(value) {
11
+ return encoder.encode(value);
12
+ },
13
+ };
14
+ }
15
+ export function imap(base, decodeMap, encodeMap) {
16
+ return codec({
17
+ decode(value) {
18
+ const decoded = base.decode(value);
19
+ return isErr(decoded) ? decoded : ok(decodeMap(decoded.value));
20
+ },
21
+ }, contramapEncoder(base, encodeMap));
22
+ }
23
+ export function codecInvariant() {
24
+ return {
25
+ imap,
26
+ };
27
+ }
28
+ export const stringCodec = codec(stringDecoder, stringEncoderValue);
29
+ export const numberCodec = codec(numberDecoder, numberEncoderValue);
30
+ export const booleanCodec = codec(booleanDecoder, booleanEncoderValue);
@@ -0,0 +1,76 @@
1
+ import { type Bind, type TypeLambda } from 'sts:hkt';
2
+ import {
3
+ boolean as booleanDecoder,
4
+ DecodeFailure,
5
+ type Decoder,
6
+ number as numberDecoder,
7
+ string as stringDecoder,
8
+ } from 'sts:decode';
9
+ import {
10
+ booleanEncoder as booleanEncoderValue,
11
+ contramap as contramapEncoder,
12
+ type EncodeFailure,
13
+ type Encoder,
14
+ numberEncoder as numberEncoderValue,
15
+ stringEncoder as stringEncoderValue,
16
+ } from 'sts:encode';
17
+ import type { Invariant } from 'sts:typeclasses';
18
+ import { isErr, ok, type Result } from 'sts:result';
19
+
20
+ export type { EncodeFailure, Encoder } from 'sts:encode';
21
+ export {
22
+ booleanEncoderValue as booleanEncoder,
23
+ contramapEncoder as contramap,
24
+ numberEncoderValue as numberEncoder,
25
+ stringEncoderValue as stringEncoder,
26
+ };
27
+
28
+ // #[variance(T: inout, TEncoded: out, DE: out, EE: out)]
29
+ export type Codec<T, TEncoded = unknown, DE = DecodeFailure, EE = EncodeFailure> =
30
+ Decoder<T, DE> & Encoder<T, TEncoded, EE>;
31
+
32
+ export interface CodecF extends TypeLambda {
33
+ readonly type: Codec<this['Args'][3], this['Args'][2], this['Args'][1], this['Args'][0]>;
34
+ }
35
+
36
+ export function codec<T, TEncoded, DE, EE>(
37
+ decoder: Decoder<T, DE>,
38
+ encoder: Encoder<T, TEncoded, EE>,
39
+ ): Codec<T, TEncoded, DE, EE> {
40
+ return {
41
+ decode(value): Result<T, DE> {
42
+ return decoder.decode(value);
43
+ },
44
+ encode(value): Result<TEncoded, EE> {
45
+ return encoder.encode(value);
46
+ },
47
+ };
48
+ }
49
+
50
+ export function imap<A, B, TEncoded, DE, EE>(
51
+ base: Codec<A, TEncoded, DE, EE>,
52
+ decodeMap: (value: A) => B,
53
+ encodeMap: (value: B) => A,
54
+ ): Codec<B, TEncoded, DE, EE> {
55
+ return codec(
56
+ {
57
+ decode(value): Result<B, DE> {
58
+ const decoded = base.decode(value);
59
+ return isErr(decoded) ? decoded : ok(decodeMap(decoded.value));
60
+ },
61
+ },
62
+ contramapEncoder(base, encodeMap),
63
+ );
64
+ }
65
+
66
+ export function codecInvariant<TEncoded, DE = DecodeFailure, EE = EncodeFailure>(): Invariant<
67
+ Bind<Bind<Bind<CodecF, [EE]>, [DE]>, [TEncoded]>
68
+ > {
69
+ return {
70
+ imap,
71
+ };
72
+ }
73
+
74
+ export const stringCodec: Codec<string, string> = codec(stringDecoder, stringEncoderValue);
75
+ export const numberCodec: Codec<number, number> = codec(numberDecoder, numberEncoderValue);
76
+ export const booleanCodec: Codec<boolean, boolean> = codec(booleanDecoder, booleanEncoderValue);
@@ -0,0 +1,28 @@
1
+ import type { Option, Result } from 'sts:result';
2
+
3
+ export type Ordering = -1 | 0 | 1;
4
+
5
+ export interface Eq<T> {
6
+ equals(left: T, right: T): boolean;
7
+ }
8
+
9
+ export interface Order<T> extends Eq<T> {
10
+ compare(left: T, right: T): Ordering;
11
+ }
12
+
13
+ type EqValue<TEq> = TEq extends Eq<infer TValue> ? TValue : never;
14
+
15
+ export const stringEq: Eq<string>;
16
+ export const numberEq: Eq<number>;
17
+ export const booleanEq: Eq<boolean>;
18
+ export const bigintEq: Eq<bigint>;
19
+ export function lazyEq<T>(getEq: () => Eq<T>): Eq<T>;
20
+ export function arrayEq<T>(itemEq: Eq<T>): Eq<readonly T[]>;
21
+ export function tupleEq<const TEqs extends readonly Eq<unknown>[]>(
22
+ ...elements: TEqs
23
+ ): Eq<{ readonly [K in keyof TEqs]: EqValue<TEqs[K]> }>;
24
+ export function optionEq<T>(itemEq: Eq<T>): Eq<Option<T>>;
25
+ export function resultEq<T, E>(okEq: Eq<T>, errEq: Eq<E>): Eq<Result<T, E>>;
26
+ export function fromCompare<T>(compare: (left: T, right: T) => number): Order<T>;
27
+ export function reverse<T>(order: Order<T>): Order<T>;
28
+ export function thenBy<T>(primary: Order<T>, secondary: Order<T>): Order<T>;
@@ -0,0 +1,115 @@
1
+ import { isErr, isNone, isOk, isSome } from '@soundscript/soundscript/result';
2
+ export const stringEq = {
3
+ equals(left, right) {
4
+ return left === right;
5
+ },
6
+ };
7
+ export const numberEq = {
8
+ equals(left, right) {
9
+ return left === right || (Number.isNaN(left) && Number.isNaN(right));
10
+ },
11
+ };
12
+ export const booleanEq = {
13
+ equals(left, right) {
14
+ return left === right;
15
+ },
16
+ };
17
+ export const bigintEq = {
18
+ equals(left, right) {
19
+ return left === right;
20
+ },
21
+ };
22
+ export function lazyEq(getEq) {
23
+ return {
24
+ equals(left, right) {
25
+ return getEq().equals(left, right);
26
+ },
27
+ };
28
+ }
29
+ export function arrayEq(itemEq) {
30
+ return {
31
+ equals(left, right) {
32
+ if (left.length !== right.length) {
33
+ return false;
34
+ }
35
+ for (let index = 0; index < left.length; index += 1) {
36
+ if (!itemEq.equals(left[index], right[index])) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ },
42
+ };
43
+ }
44
+ export function tupleEq(...elements) {
45
+ return {
46
+ equals(left, right) {
47
+ const leftValues = left;
48
+ const rightValues = right;
49
+ if (leftValues.length !== elements.length || rightValues.length !== elements.length) {
50
+ return false;
51
+ }
52
+ for (let index = 0; index < elements.length; index += 1) {
53
+ const elementEq = elements[index];
54
+ if (!elementEq) {
55
+ continue;
56
+ }
57
+ if (!elementEq.equals(leftValues[index], rightValues[index])) {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ },
63
+ };
64
+ }
65
+ export function optionEq(itemEq) {
66
+ return {
67
+ equals(left, right) {
68
+ if (isSome(left) && isSome(right)) {
69
+ return itemEq.equals(left.value, right.value);
70
+ }
71
+ return isNone(left) && isNone(right);
72
+ },
73
+ };
74
+ }
75
+ export function resultEq(okEq, errEq) {
76
+ return {
77
+ equals(left, right) {
78
+ if (isOk(left) && isOk(right)) {
79
+ return okEq.equals(left.value, right.value);
80
+ }
81
+ if (isErr(left) && isErr(right)) {
82
+ return errEq.equals(left.error, right.error);
83
+ }
84
+ return false;
85
+ },
86
+ };
87
+ }
88
+ export function fromCompare(compare) {
89
+ return {
90
+ equals(left, right) {
91
+ return normalizeOrdering(compare(left, right)) === 0;
92
+ },
93
+ compare(left, right) {
94
+ return normalizeOrdering(compare(left, right));
95
+ },
96
+ };
97
+ }
98
+ export function reverse(order) {
99
+ return fromCompare((left, right) => order.compare(right, left));
100
+ }
101
+ export function thenBy(primary, secondary) {
102
+ return fromCompare((left, right) => {
103
+ const primaryOrdering = primary.compare(left, right);
104
+ return primaryOrdering !== 0 ? primaryOrdering : secondary.compare(left, right);
105
+ });
106
+ }
107
+ function normalizeOrdering(value) {
108
+ if (value < 0) {
109
+ return -1;
110
+ }
111
+ if (value > 0) {
112
+ return 1;
113
+ }
114
+ return 0;
115
+ }