goscript 0.1.0 → 0.1.2

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 (495) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +286 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/cmd_compile.go +9 -0
  5. package/cmd/goscript/main.go +1 -0
  6. package/compiler/build-flags.go +38 -0
  7. package/compiler/compile-request.go +33 -0
  8. package/compiler/compiler.go +1 -1
  9. package/compiler/compliance_test.go +0 -10
  10. package/compiler/config.go +2 -0
  11. package/compiler/gotest/owner.go +24 -0
  12. package/compiler/gotest/package-result.go +69 -0
  13. package/compiler/gotest/request.go +210 -0
  14. package/compiler/gotest/result.go +28 -0
  15. package/compiler/gotest/runner.go +1225 -0
  16. package/compiler/gotest/runner_test.go +1271 -0
  17. package/compiler/gotest/test.go +9 -0
  18. package/compiler/index.test.ts +1 -1
  19. package/compiler/lowered-program.go +80 -21
  20. package/compiler/lowering.go +6754 -602
  21. package/compiler/override-facts.go +357 -0
  22. package/compiler/override-registry.go +52 -190
  23. package/compiler/override-registry_test.go +182 -0
  24. package/compiler/package-graph.go +50 -27
  25. package/compiler/package-graph_test.go +99 -9
  26. package/compiler/package-test-function.go +9 -0
  27. package/compiler/package-test-graph-package.go +40 -0
  28. package/compiler/package-test-graph-variant.go +129 -0
  29. package/compiler/package-test-graph.go +112 -0
  30. package/compiler/package-test-graph_test.go +202 -0
  31. package/compiler/runtime-contract.go +229 -29
  32. package/compiler/runtime-contract_test.go +44 -30
  33. package/compiler/semantic-model-types.go +25 -6
  34. package/compiler/semantic-model.go +819 -74
  35. package/compiler/semantic-model_test.go +104 -0
  36. package/compiler/service.go +10 -4
  37. package/compiler/skeleton_test.go +2777 -524
  38. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  39. package/compiler/tsworkspace/owner.go +342 -0
  40. package/compiler/tsworkspace/owner_test.go +93 -0
  41. package/compiler/tsworkspace/result.go +17 -0
  42. package/compiler/tsworkspace/tool-process-other.go +14 -0
  43. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  44. package/compiler/typescript-emitter.go +576 -86
  45. package/compiler/wasm/compile.go +1 -1
  46. package/compiler/wasm/compile_test.go +61 -11
  47. package/compiler/wasm_api.go +172 -7
  48. package/dist/gs/builtin/builtin.d.ts +40 -3
  49. package/dist/gs/builtin/builtin.js +430 -22
  50. package/dist/gs/builtin/builtin.js.map +1 -1
  51. package/dist/gs/builtin/channel.d.ts +32 -10
  52. package/dist/gs/builtin/channel.js +119 -25
  53. package/dist/gs/builtin/channel.js.map +1 -1
  54. package/dist/gs/builtin/defer.d.ts +1 -0
  55. package/dist/gs/builtin/defer.js +12 -2
  56. package/dist/gs/builtin/defer.js.map +1 -1
  57. package/dist/gs/builtin/hostio.d.ts +9 -0
  58. package/dist/gs/builtin/hostio.js +25 -0
  59. package/dist/gs/builtin/hostio.js.map +1 -1
  60. package/dist/gs/builtin/map.js +40 -6
  61. package/dist/gs/builtin/map.js.map +1 -1
  62. package/dist/gs/builtin/print.js.map +1 -1
  63. package/dist/gs/builtin/slice.d.ts +64 -10
  64. package/dist/gs/builtin/slice.js +619 -244
  65. package/dist/gs/builtin/slice.js.map +1 -1
  66. package/dist/gs/builtin/type.d.ts +7 -2
  67. package/dist/gs/builtin/type.js +128 -29
  68. package/dist/gs/builtin/type.js.map +1 -1
  69. package/dist/gs/builtin/varRef.d.ts +7 -0
  70. package/dist/gs/builtin/varRef.js +23 -0
  71. package/dist/gs/builtin/varRef.js.map +1 -1
  72. package/dist/gs/bytes/buffer.gs.js +74 -70
  73. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  74. package/dist/gs/bytes/iter.gs.js +13 -13
  75. package/dist/gs/bytes/iter.gs.js.map +1 -1
  76. package/dist/gs/bytes/reader.gs.js +20 -18
  77. package/dist/gs/bytes/reader.gs.js.map +1 -1
  78. package/dist/gs/compress/zlib/index.d.ts +26 -0
  79. package/dist/gs/compress/zlib/index.js +168 -0
  80. package/dist/gs/compress/zlib/index.js.map +1 -0
  81. package/dist/gs/context/context.d.ts +6 -5
  82. package/dist/gs/context/context.js +17 -12
  83. package/dist/gs/context/context.js.map +1 -1
  84. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  85. package/dist/gs/crypto/ecdh/index.js +226 -0
  86. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  87. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  88. package/dist/gs/crypto/ed25519/index.js +160 -0
  89. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  90. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  91. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  92. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  93. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  94. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  95. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  96. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  97. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  98. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  99. package/dist/gs/crypto/rand/index.d.ts +2 -0
  100. package/dist/gs/crypto/rand/index.js +85 -0
  101. package/dist/gs/crypto/rand/index.js.map +1 -1
  102. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  103. package/dist/gs/crypto/sha256/index.js +118 -0
  104. package/dist/gs/crypto/sha256/index.js.map +1 -0
  105. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  106. package/dist/gs/crypto/sha512/index.js +129 -0
  107. package/dist/gs/crypto/sha512/index.js.map +1 -0
  108. package/dist/gs/embed/index.d.ts +7 -0
  109. package/dist/gs/embed/index.js +16 -0
  110. package/dist/gs/embed/index.js.map +1 -0
  111. package/dist/gs/encoding/json/index.d.ts +4 -0
  112. package/dist/gs/encoding/json/index.js +33 -0
  113. package/dist/gs/encoding/json/index.js.map +1 -1
  114. package/dist/gs/errors/errors.d.ts +4 -0
  115. package/dist/gs/errors/errors.js +108 -4
  116. package/dist/gs/errors/errors.js.map +1 -1
  117. package/dist/gs/fmt/fmt.d.ts +4 -4
  118. package/dist/gs/fmt/fmt.js +42 -11
  119. package/dist/gs/fmt/fmt.js.map +1 -1
  120. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
  121. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
  122. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  123. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  124. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
  125. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  126. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
  127. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
  128. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  129. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  130. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  131. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  132. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  133. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  134. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  135. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  136. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  137. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
  138. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  139. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  140. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  141. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  142. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  143. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  144. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  145. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  146. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  147. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  148. package/dist/gs/go/scanner/index.d.ts +13 -0
  149. package/dist/gs/go/scanner/index.js +35 -0
  150. package/dist/gs/go/scanner/index.js.map +1 -1
  151. package/dist/gs/go/token/index.d.ts +156 -0
  152. package/dist/gs/go/token/index.js +507 -4
  153. package/dist/gs/go/token/index.js.map +1 -1
  154. package/dist/gs/hash/fnv/index.d.ts +57 -0
  155. package/dist/gs/hash/fnv/index.js +299 -0
  156. package/dist/gs/hash/fnv/index.js.map +1 -0
  157. package/dist/gs/hash/index.d.ts +17 -0
  158. package/dist/gs/hash/index.js +94 -0
  159. package/dist/gs/hash/index.js.map +1 -0
  160. package/dist/gs/internal/abi/index.d.ts +4 -0
  161. package/dist/gs/internal/abi/index.js +10 -0
  162. package/dist/gs/internal/abi/index.js.map +1 -1
  163. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  164. package/dist/gs/internal/bytealg/index.js +14 -0
  165. package/dist/gs/internal/bytealg/index.js.map +1 -1
  166. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  167. package/dist/gs/internal/byteorder/index.js +56 -25
  168. package/dist/gs/internal/byteorder/index.js.map +1 -1
  169. package/dist/gs/internal/godebug/index.d.ts +12 -0
  170. package/dist/gs/internal/godebug/index.js +30 -0
  171. package/dist/gs/internal/godebug/index.js.map +1 -0
  172. package/dist/gs/io/fs/index.d.ts +1 -0
  173. package/dist/gs/io/fs/index.js +1 -0
  174. package/dist/gs/io/fs/index.js.map +1 -1
  175. package/dist/gs/io/fs/readlink.d.ts +8 -0
  176. package/dist/gs/io/fs/readlink.js +60 -0
  177. package/dist/gs/io/fs/readlink.js.map +1 -0
  178. package/dist/gs/io/fs/walk.d.ts +3 -3
  179. package/dist/gs/io/fs/walk.js +7 -7
  180. package/dist/gs/io/fs/walk.js.map +1 -1
  181. package/dist/gs/io/io.d.ts +40 -6
  182. package/dist/gs/io/io.js +151 -26
  183. package/dist/gs/io/io.js.map +1 -1
  184. package/dist/gs/iter/iter.d.ts +3 -2
  185. package/dist/gs/iter/iter.js.map +1 -1
  186. package/dist/gs/maps/iter.d.ts +5 -5
  187. package/dist/gs/maps/iter.js +48 -21
  188. package/dist/gs/maps/iter.js.map +1 -1
  189. package/dist/gs/maps/maps.d.ts +6 -6
  190. package/dist/gs/maps/maps.js +1 -1
  191. package/dist/gs/maps/maps.js.map +1 -1
  192. package/dist/gs/math/bits/index.d.ts +13 -4
  193. package/dist/gs/math/bits/index.js +70 -48
  194. package/dist/gs/math/bits/index.js.map +1 -1
  195. package/dist/gs/math/const.gs.d.ts +5 -5
  196. package/dist/gs/math/const.gs.js +4 -4
  197. package/dist/gs/math/const.gs.js.map +1 -1
  198. package/dist/gs/mime/index.d.ts +1 -0
  199. package/dist/gs/mime/index.js +52 -0
  200. package/dist/gs/mime/index.js.map +1 -0
  201. package/dist/gs/net/http/httptest/index.d.ts +30 -0
  202. package/dist/gs/net/http/httptest/index.js +101 -0
  203. package/dist/gs/net/http/httptest/index.js.map +1 -0
  204. package/dist/gs/net/http/index.d.ts +131 -0
  205. package/dist/gs/net/http/index.js +307 -0
  206. package/dist/gs/net/http/index.js.map +1 -0
  207. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  208. package/dist/gs/net/http/pprof/index.js +59 -0
  209. package/dist/gs/net/http/pprof/index.js.map +1 -0
  210. package/dist/gs/os/dir_unix.gs.js +2 -2
  211. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  212. package/dist/gs/os/error.gs.js +9 -7
  213. package/dist/gs/os/error.gs.js.map +1 -1
  214. package/dist/gs/os/types_js.gs.js +95 -15
  215. package/dist/gs/os/types_js.gs.js.map +1 -1
  216. package/dist/gs/path/filepath/match.js +165 -3
  217. package/dist/gs/path/filepath/match.js.map +1 -1
  218. package/dist/gs/path/filepath/path.d.ts +8 -4
  219. package/dist/gs/path/filepath/path.js +192 -8
  220. package/dist/gs/path/filepath/path.js.map +1 -1
  221. package/dist/gs/path/path.d.ts +4 -1
  222. package/dist/gs/path/path.js +16 -4
  223. package/dist/gs/path/path.js.map +1 -1
  224. package/dist/gs/reflect/index.d.ts +4 -3
  225. package/dist/gs/reflect/index.js +3 -2
  226. package/dist/gs/reflect/index.js.map +1 -1
  227. package/dist/gs/reflect/iter.js +2 -2
  228. package/dist/gs/reflect/iter.js.map +1 -1
  229. package/dist/gs/reflect/map.js +29 -0
  230. package/dist/gs/reflect/map.js.map +1 -1
  231. package/dist/gs/reflect/type.d.ts +31 -9
  232. package/dist/gs/reflect/type.js +536 -43
  233. package/dist/gs/reflect/type.js.map +1 -1
  234. package/dist/gs/reflect/types.d.ts +1 -0
  235. package/dist/gs/reflect/types.js +3 -1
  236. package/dist/gs/reflect/types.js.map +1 -1
  237. package/dist/gs/reflect/value.d.ts +4 -1
  238. package/dist/gs/reflect/value.js +39 -1
  239. package/dist/gs/reflect/value.js.map +1 -1
  240. package/dist/gs/reflect/visiblefields.js +1 -1
  241. package/dist/gs/reflect/visiblefields.js.map +1 -1
  242. package/dist/gs/runtime/debug/index.d.ts +41 -0
  243. package/dist/gs/runtime/debug/index.js +66 -0
  244. package/dist/gs/runtime/debug/index.js.map +1 -0
  245. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  246. package/dist/gs/runtime/pprof/index.js +85 -0
  247. package/dist/gs/runtime/pprof/index.js.map +1 -0
  248. package/dist/gs/runtime/runtime.d.ts +35 -3
  249. package/dist/gs/runtime/runtime.js +72 -0
  250. package/dist/gs/runtime/runtime.js.map +1 -1
  251. package/dist/gs/runtime/trace/index.d.ts +19 -0
  252. package/dist/gs/runtime/trace/index.js +64 -0
  253. package/dist/gs/runtime/trace/index.js.map +1 -0
  254. package/dist/gs/slices/slices.d.ts +42 -8
  255. package/dist/gs/slices/slices.js +425 -11
  256. package/dist/gs/slices/slices.js.map +1 -1
  257. package/dist/gs/sort/slice.gs.d.ts +5 -3
  258. package/dist/gs/sort/slice.gs.js +60 -22
  259. package/dist/gs/sort/slice.gs.js.map +1 -1
  260. package/dist/gs/sort/sort.gs.d.ts +4 -4
  261. package/dist/gs/sort/sort.gs.js +11 -8
  262. package/dist/gs/sort/sort.gs.js.map +1 -1
  263. package/dist/gs/strings/builder.d.ts +1 -1
  264. package/dist/gs/strings/builder.js +29 -19
  265. package/dist/gs/strings/builder.js.map +1 -1
  266. package/dist/gs/strings/iter.js +140 -75
  267. package/dist/gs/strings/iter.js.map +1 -1
  268. package/dist/gs/strings/replace.js +2 -2
  269. package/dist/gs/strings/replace.js.map +1 -1
  270. package/dist/gs/strings/strings.js +52 -6
  271. package/dist/gs/strings/strings.js.map +1 -1
  272. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  273. package/dist/gs/sync/atomic/type.gs.js +0 -2
  274. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  275. package/dist/gs/sync/sync.d.ts +8 -3
  276. package/dist/gs/sync/sync.js +66 -11
  277. package/dist/gs/sync/sync.js.map +1 -1
  278. package/dist/gs/syscall/constants.d.ts +36 -24
  279. package/dist/gs/syscall/constants.js +12 -0
  280. package/dist/gs/syscall/constants.js.map +1 -1
  281. package/dist/gs/syscall/errors.d.ts +117 -111
  282. package/dist/gs/syscall/errors.js +45 -0
  283. package/dist/gs/syscall/errors.js.map +1 -1
  284. package/dist/gs/syscall/fs.d.ts +37 -0
  285. package/dist/gs/syscall/fs.js +102 -0
  286. package/dist/gs/syscall/fs.js.map +1 -1
  287. package/dist/gs/syscall/js/index.d.ts +90 -0
  288. package/dist/gs/syscall/js/index.js +383 -0
  289. package/dist/gs/syscall/js/index.js.map +1 -0
  290. package/dist/gs/syscall/types.d.ts +26 -1
  291. package/dist/gs/syscall/types.js +45 -1
  292. package/dist/gs/syscall/types.js.map +1 -1
  293. package/dist/gs/testing/index.d.ts +1 -0
  294. package/dist/gs/testing/index.js +2 -0
  295. package/dist/gs/testing/index.js.map +1 -0
  296. package/dist/gs/testing/testing.d.ts +78 -0
  297. package/dist/gs/testing/testing.js +318 -0
  298. package/dist/gs/testing/testing.js.map +1 -0
  299. package/dist/gs/time/time.d.ts +41 -4
  300. package/dist/gs/time/time.js +227 -36
  301. package/dist/gs/time/time.js.map +1 -1
  302. package/dist/gs/unicode/unicode.d.ts +23 -1
  303. package/dist/gs/unicode/unicode.js +79 -10
  304. package/dist/gs/unicode/unicode.js.map +1 -1
  305. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  306. package/dist/gs/unicode/utf8/utf8.js +24 -11
  307. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  308. package/dist/gs/unique/index.d.ts +11 -0
  309. package/dist/gs/unique/index.js +76 -0
  310. package/dist/gs/unique/index.js.map +1 -0
  311. package/go.mod +8 -8
  312. package/go.sum +14 -14
  313. package/gs/builtin/builtin.ts +585 -27
  314. package/gs/builtin/channel.ts +183 -29
  315. package/gs/builtin/defer.ts +13 -2
  316. package/gs/builtin/hostio.test.ts +1 -0
  317. package/gs/builtin/hostio.ts +38 -0
  318. package/gs/builtin/map.ts +46 -6
  319. package/gs/builtin/print.ts +12 -3
  320. package/gs/builtin/runtime-contract.test.ts +383 -10
  321. package/gs/builtin/slice.test.ts +70 -0
  322. package/gs/builtin/slice.ts +785 -265
  323. package/gs/builtin/type.ts +160 -41
  324. package/gs/builtin/varRef.ts +40 -1
  325. package/gs/bytes/buffer.gs.ts +74 -70
  326. package/gs/bytes/iter.gs.ts +13 -14
  327. package/gs/bytes/meta.json +8 -3
  328. package/gs/bytes/reader.gs.ts +20 -19
  329. package/gs/compress/zlib/index.test.ts +28 -0
  330. package/gs/compress/zlib/index.ts +200 -0
  331. package/gs/compress/zlib/meta.json +3 -0
  332. package/gs/context/context.test.ts +71 -0
  333. package/gs/context/context.ts +30 -29
  334. package/gs/crypto/ecdh/index.test.ts +43 -0
  335. package/gs/crypto/ecdh/index.ts +274 -0
  336. package/gs/crypto/ed25519/index.test.ts +41 -0
  337. package/gs/crypto/ed25519/index.ts +238 -0
  338. package/gs/crypto/ed25519/meta.json +13 -0
  339. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  340. package/gs/crypto/internal/constanttime/index.ts +22 -0
  341. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  342. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  343. package/gs/crypto/rand/index.test.ts +89 -1
  344. package/gs/crypto/rand/index.ts +103 -1
  345. package/gs/crypto/rand/meta.json +4 -1
  346. package/gs/crypto/sha256/index.test.ts +78 -0
  347. package/gs/crypto/sha256/index.ts +150 -0
  348. package/gs/crypto/sha256/meta.json +9 -0
  349. package/gs/crypto/sha512/index.test.ts +31 -0
  350. package/gs/crypto/sha512/index.ts +161 -0
  351. package/gs/crypto/sha512/meta.json +11 -0
  352. package/gs/embed/index.ts +20 -0
  353. package/gs/embed/meta.json +5 -0
  354. package/gs/encoding/json/index.test.ts +39 -3
  355. package/gs/encoding/json/index.ts +45 -3
  356. package/gs/errors/errors.test.ts +85 -0
  357. package/gs/errors/errors.ts +132 -4
  358. package/gs/fmt/fmt.test.ts +3 -1
  359. package/gs/fmt/fmt.ts +55 -19
  360. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
  361. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
  362. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
  363. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
  364. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  365. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
  366. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
  367. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  368. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  369. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  370. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  371. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  372. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  373. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  374. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
  375. package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
  376. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  377. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  378. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  379. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  380. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  381. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  382. package/gs/go/internal/scannerhooks/index.ts +9 -0
  383. package/gs/go/scanner/index.test.ts +22 -0
  384. package/gs/go/scanner/index.ts +47 -0
  385. package/gs/go/token/index.test.ts +47 -1
  386. package/gs/go/token/index.ts +583 -4
  387. package/gs/hash/fnv/index.test.ts +67 -0
  388. package/gs/hash/fnv/index.ts +351 -0
  389. package/gs/hash/fnv/meta.json +3 -0
  390. package/gs/hash/index.test.ts +37 -0
  391. package/gs/hash/index.ts +118 -0
  392. package/gs/hash/meta.json +5 -0
  393. package/gs/internal/abi/index.test.ts +18 -0
  394. package/gs/internal/abi/index.ts +14 -0
  395. package/gs/internal/bytealg/index.test.ts +18 -0
  396. package/gs/internal/bytealg/index.ts +16 -0
  397. package/gs/internal/byteorder/index.test.ts +39 -0
  398. package/gs/internal/byteorder/index.ts +100 -27
  399. package/gs/internal/godebug/index.test.ts +16 -0
  400. package/gs/internal/godebug/index.ts +35 -0
  401. package/gs/io/fs/index.ts +1 -0
  402. package/gs/io/fs/meta.json +5 -0
  403. package/gs/io/fs/readlink.test.ts +43 -0
  404. package/gs/io/fs/readlink.ts +69 -0
  405. package/gs/io/fs/walk.test.ts +61 -0
  406. package/gs/io/fs/walk.ts +17 -9
  407. package/gs/io/io.ts +177 -31
  408. package/gs/io/meta.json +10 -2
  409. package/gs/iter/iter.ts +8 -2
  410. package/gs/maps/iter.ts +75 -26
  411. package/gs/maps/maps.test.ts +23 -0
  412. package/gs/maps/maps.ts +13 -11
  413. package/gs/math/bits/index.test.ts +20 -0
  414. package/gs/math/bits/index.ts +107 -64
  415. package/gs/math/const.gs.test.ts +11 -5
  416. package/gs/math/const.gs.ts +5 -6
  417. package/gs/mime/index.ts +60 -0
  418. package/gs/net/http/httptest/index.test.ts +53 -0
  419. package/gs/net/http/httptest/index.ts +120 -0
  420. package/gs/net/http/index.test.ts +148 -0
  421. package/gs/net/http/index.ts +432 -0
  422. package/gs/net/http/meta.json +6 -0
  423. package/gs/net/http/pprof/index.test.ts +47 -0
  424. package/gs/net/http/pprof/index.ts +65 -0
  425. package/gs/os/dir_unix.gs.ts +2 -3
  426. package/gs/os/error.gs.ts +9 -10
  427. package/gs/os/error.test.ts +41 -0
  428. package/gs/os/file_unix_js.test.ts +55 -0
  429. package/gs/os/tempfile.gs.test.ts +37 -10
  430. package/gs/os/types_js.gs.ts +96 -17
  431. package/gs/path/filepath/match.test.ts +31 -12
  432. package/gs/path/filepath/match.ts +181 -3
  433. package/gs/path/filepath/meta.json +6 -0
  434. package/gs/path/filepath/path.test.ts +80 -0
  435. package/gs/path/filepath/path.ts +244 -11
  436. package/gs/path/path.ts +20 -5
  437. package/gs/reflect/field.test.ts +63 -0
  438. package/gs/reflect/index.ts +5 -1
  439. package/gs/reflect/iter.ts +2 -2
  440. package/gs/reflect/map.test.ts +42 -1
  441. package/gs/reflect/map.ts +39 -0
  442. package/gs/reflect/type.ts +728 -65
  443. package/gs/reflect/typefor.test.ts +100 -0
  444. package/gs/reflect/types.ts +3 -1
  445. package/gs/reflect/value.ts +50 -1
  446. package/gs/reflect/visiblefields.ts +1 -1
  447. package/gs/runtime/debug/index.test.ts +45 -0
  448. package/gs/runtime/debug/index.ts +96 -0
  449. package/gs/runtime/pprof/index.test.ts +36 -0
  450. package/gs/runtime/pprof/index.ts +104 -0
  451. package/gs/runtime/pprof/meta.json +6 -0
  452. package/gs/runtime/runtime.test.ts +19 -0
  453. package/gs/runtime/runtime.ts +98 -3
  454. package/gs/runtime/trace/index.test.ts +45 -0
  455. package/gs/runtime/trace/index.ts +97 -0
  456. package/gs/runtime/trace/meta.json +7 -0
  457. package/gs/slices/meta.json +2 -1
  458. package/gs/slices/slices.test.ts +180 -0
  459. package/gs/slices/slices.ts +502 -15
  460. package/gs/sort/meta.json +7 -0
  461. package/gs/sort/slice.gs.ts +85 -26
  462. package/gs/sort/slice.test.ts +40 -0
  463. package/gs/sort/sort.gs.ts +16 -13
  464. package/gs/strings/builder.test.ts +8 -0
  465. package/gs/strings/builder.ts +33 -20
  466. package/gs/strings/iter.test.ts +5 -7
  467. package/gs/strings/iter.ts +146 -71
  468. package/gs/strings/replace.test.ts +1 -4
  469. package/gs/strings/replace.ts +6 -6
  470. package/gs/strings/strings.test.ts +4 -0
  471. package/gs/strings/strings.ts +54 -6
  472. package/gs/sync/atomic/type.gs.ts +13 -14
  473. package/gs/sync/meta.json +3 -1
  474. package/gs/sync/sync.test.ts +69 -1
  475. package/gs/sync/sync.ts +72 -13
  476. package/gs/syscall/constants.ts +39 -24
  477. package/gs/syscall/errors.ts +165 -112
  478. package/gs/syscall/fs.ts +195 -0
  479. package/gs/syscall/js/index.ts +485 -0
  480. package/gs/syscall/js/meta.json +4 -0
  481. package/gs/syscall/net.test.ts +111 -0
  482. package/gs/syscall/types.ts +63 -2
  483. package/gs/testing/index.ts +1 -0
  484. package/gs/testing/meta.json +5 -0
  485. package/gs/testing/testing.test.ts +146 -0
  486. package/gs/testing/testing.ts +399 -0
  487. package/gs/time/meta.json +2 -2
  488. package/gs/time/time.test.ts +110 -0
  489. package/gs/time/time.ts +309 -57
  490. package/gs/unicode/unicode.test.ts +36 -0
  491. package/gs/unicode/unicode.ts +115 -9
  492. package/gs/unicode/utf8/utf8.test.ts +13 -0
  493. package/gs/unicode/utf8/utf8.ts +28 -16
  494. package/gs/unique/index.ts +98 -0
  495. package/package.json +3 -2
@@ -8,44 +8,101 @@ interface SliceMetadata<T> {
8
8
  capacity: number
9
9
  }
10
10
 
11
- // Helper function to swap elements in a slice
12
- function swapInSlice<T>(slice: $.Slice<T>, i: number, j: number): void {
11
+ type LessFunc = (
12
+ i: number,
13
+ j: number,
14
+ ) => boolean | globalThis.Promise<boolean>
15
+
16
+ function setInSlice<T>(slice: $.Slice<T>, i: number, value: T): void {
13
17
  if (!slice) return
14
-
15
- const temp = $.index(slice, i)
16
- if (Array.isArray(slice)) {
17
- const val_j = $.index(slice, j)
18
- const val_i = temp
19
- slice[i] = val_j as T
20
- slice[j] = val_i as T
18
+
19
+ if (Array.isArray(slice) || slice instanceof Uint8Array) {
20
+ ;(slice as any)[i] = value
21
21
  } else if (typeof slice === 'object' && '__meta__' in slice) {
22
22
  const meta = (slice as any).__meta__ as SliceMetadata<T>
23
- const backing = meta.backing
24
- backing[meta.offset + i] = $.index(slice, j) as T
25
- backing[meta.offset + j] = temp as T
23
+ meta.backing[meta.offset + i] = value
24
+ }
25
+ }
26
+
27
+ async function sortedIndices(n: number, less: LessFunc): Promise<number[]> {
28
+ const indices = Array.from({ length: n }, (_, i) => i)
29
+ await sortIndexRange(indices, 0, indices.length, less)
30
+ return indices
31
+ }
32
+
33
+ async function sortIndexRange(
34
+ indices: number[],
35
+ lo: number,
36
+ hi: number,
37
+ less: LessFunc,
38
+ ): Promise<void> {
39
+ if (hi - lo <= 16) {
40
+ for (let i = lo + 1; i < hi; i++) {
41
+ const value = indices[i]
42
+ let j = i
43
+ while (j > lo && (await less(value, indices[j - 1]))) {
44
+ indices[j] = indices[j - 1]
45
+ j--
46
+ }
47
+ indices[j] = value
48
+ }
49
+ return
50
+ }
51
+
52
+ const mid = lo + Math.floor((hi - lo) / 2)
53
+ await sortIndexRange(indices, lo, mid, less)
54
+ await sortIndexRange(indices, mid, hi, less)
55
+
56
+ const merged: number[] = []
57
+ let left = lo
58
+ let right = mid
59
+ while (left < mid && right < hi) {
60
+ if (await less(indices[right], indices[left])) {
61
+ merged.push(indices[right])
62
+ right++
63
+ } else {
64
+ merged.push(indices[left])
65
+ left++
66
+ }
67
+ }
68
+ while (left < mid) {
69
+ merged.push(indices[left])
70
+ left++
71
+ }
72
+ while (right < hi) {
73
+ merged.push(indices[right])
74
+ right++
75
+ }
76
+ for (let i = 0; i < merged.length; i++) {
77
+ indices[lo + i] = merged[i]
26
78
  }
27
79
  }
28
80
 
29
81
  // Slice sorts the slice x given the provided less function
30
- export function Slice(x: $.Slice<any>, less: (i: number, j: number) => boolean): void {
82
+ export async function Slice(
83
+ x: $.Slice<any>,
84
+ less: LessFunc,
85
+ ): globalThis.Promise<void> {
31
86
  if (!x) return
32
-
33
- // Simple insertion sort using the provided less function
87
+
34
88
  const n = $.len(x)
35
- for (let i = 1; i < n; i++) {
36
- for (let j = i; j > 0 && less(j, j - 1); j--) {
37
- swapInSlice(x, j, j - 1)
38
- }
89
+ const indices = await sortedIndices(n, less)
90
+ const sorted = indices.map((index) => $.index(x, index))
91
+ for (let i = 0; i < sorted.length; i++) {
92
+ setInSlice(x, i, sorted[i])
39
93
  }
40
94
  }
41
95
 
42
96
  // SliceIsSorted reports whether the slice x is sorted according to the provided less function
43
- export function SliceIsSorted(x: $.Slice<any>, less: (i: number, j: number) => boolean): boolean {
97
+ export async function SliceIsSorted(
98
+ x: $.Slice<any>,
99
+ less: LessFunc,
100
+ ): globalThis.Promise<boolean> {
44
101
  if (!x) return true
45
-
102
+
46
103
  const n = $.len(x)
47
104
  for (let i = n - 1; i > 0; i--) {
48
- if (less(i, i - 1)) {
105
+ if (await less(i, i - 1)) {
49
106
  return false
50
107
  }
51
108
  }
@@ -53,7 +110,9 @@ export function SliceIsSorted(x: $.Slice<any>, less: (i: number, j: number) => b
53
110
  }
54
111
 
55
112
  // SliceStable sorts the slice x while keeping the original order of equal elements
56
- export function SliceStable(x: $.Slice<any>, less: (i: number, j: number) => boolean): void {
57
- // For simplicity, use the same sort - can be improved later
58
- Slice(x, less)
59
- }
113
+ export async function SliceStable(
114
+ x: $.Slice<any>,
115
+ less: LessFunc,
116
+ ): globalThis.Promise<void> {
117
+ await Slice(x, less)
118
+ }
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import * as $ from '@goscript/builtin/index.js'
3
+
4
+ import { Slice, SliceIsSorted, SliceStable } from './slice.gs.js'
5
+
6
+ describe('sort.Slice override', () => {
7
+ it('sorts slices with logarithmic comparator growth', async () => {
8
+ const values = $.arrayToSlice<number>(
9
+ Array.from({ length: 128 }, (_, i) => 128 - i),
10
+ )
11
+ let calls = 0
12
+
13
+ await Slice(values, (i, j) => {
14
+ calls++
15
+ return values![i] < values![j]
16
+ })
17
+
18
+ expect(values).toEqual(Array.from({ length: 128 }, (_, i) => i + 1))
19
+ expect(calls).toBeLessThan(1200)
20
+ })
21
+
22
+ it('keeps equal values stable for SliceStable', async () => {
23
+ const values = $.arrayToSlice([
24
+ { group: 1, name: 'a' },
25
+ { group: 0, name: 'b' },
26
+ { group: 1, name: 'c' },
27
+ { group: 0, name: 'd' },
28
+ ])
29
+
30
+ await SliceStable(values, (i, j) => values![i].group < values![j].group)
31
+
32
+ expect(values?.map((value) => value.name)).toEqual(['b', 'd', 'a', 'c'])
33
+ expect(
34
+ await SliceIsSorted(
35
+ values,
36
+ (i, j) => values![i].group < values![j].group,
37
+ ),
38
+ ).toBe(true)
39
+ })
40
+ })
@@ -94,27 +94,29 @@ export class StringSlice {
94
94
  }
95
95
 
96
96
  // Sort sorts data in ascending order as determined by the Less method
97
- export function Sort(data: Interface): void {
97
+ export function Sort(data: Interface | null): void {
98
+ const sortData = $.pointerValue(data)
98
99
  // Use a simple insertion sort for now - can be optimized later
99
- const n = data.Len()
100
+ const n = sortData.Len()
100
101
  for (let i = 1; i < n; i++) {
101
- for (let j = i; j > 0 && data.Less(j, j - 1); j--) {
102
- data.Swap(j, j - 1)
102
+ for (let j = i; j > 0 && sortData.Less(j, j - 1); j--) {
103
+ sortData.Swap(j, j - 1)
103
104
  }
104
105
  }
105
106
  }
106
107
 
107
108
  // Stable sorts data while keeping the original order of equal elements
108
- export function Stable(data: Interface): void {
109
+ export function Stable(data: Interface | null): void {
109
110
  // For simplicity, use the same sort - can be improved later
110
111
  Sort(data)
111
112
  }
112
113
 
113
114
  // IsSorted reports whether data is sorted
114
- export function IsSorted(data: Interface): boolean {
115
- const n = data.Len()
115
+ export function IsSorted(data: Interface | null): boolean {
116
+ const sortData = $.pointerValue(data)
117
+ const n = sortData.Len()
116
118
  for (let i = n - 1; i > 0; i--) {
117
- if (data.Less(i, i - 1)) {
119
+ if (sortData.Less(i, i - 1)) {
118
120
  return false
119
121
  }
120
122
  }
@@ -122,11 +124,12 @@ export function IsSorted(data: Interface): boolean {
122
124
  }
123
125
 
124
126
  // Reverse returns the reverse order for data
125
- export function Reverse(data: Interface): Interface {
127
+ export function Reverse(data: Interface | null): Interface {
128
+ const sortData = $.pointerValue(data)
126
129
  return {
127
- Len: () => data.Len(),
128
- Less: (i: number, j: number) => data.Less(j, i),
129
- Swap: (i: number, j: number) => data.Swap(i, j)
130
+ Len: () => sortData.Len(),
131
+ Less: (i: number, j: number) => sortData.Less(j, i),
132
+ Swap: (i: number, j: number) => sortData.Swap(i, j)
130
133
  }
131
134
  }
132
135
 
@@ -224,4 +227,4 @@ export function StringsAreSorted(x: $.Slice<string>): boolean {
224
227
  }
225
228
  }
226
229
  return true
227
- }
230
+ }
@@ -1,5 +1,6 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { Builder } from './builder.js'
3
+ import { varRef } from '../builtin/varRef.js'
3
4
 
4
5
  describe('strings/Builder', () => {
5
6
  describe('Builder', () => {
@@ -89,6 +90,13 @@ describe('strings/Builder', () => {
89
90
  expect(b.Len()).toBe(11)
90
91
  })
91
92
 
93
+ it('should accept VarRef pointer receivers', () => {
94
+ const b = varRef(new Builder())
95
+ Builder.prototype.WriteString.call(b, 'hello')
96
+ expect(Builder.prototype.Len.call(b)).toBe(5)
97
+ expect(Builder.prototype.String.call(b)).toBe('hello')
98
+ })
99
+
92
100
  it('should handle empty writes', () => {
93
101
  const b = new Builder()
94
102
  const [n, err] = b.WriteString('')
@@ -1,5 +1,11 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
2
 
3
+ function builderValue(
4
+ builder: Builder | $.VarRef<Builder> | null | undefined,
5
+ ): Builder {
6
+ return $.pointerValue<Builder>(builder)
7
+ }
8
+
3
9
  export class Builder {
4
10
  private _content: string = ''
5
11
  private _addr: Builder | null = null
@@ -16,21 +22,22 @@ export class Builder {
16
22
  }
17
23
 
18
24
  private copyCheck(): void {
19
- if (this._addr == null) {
20
- this._addr = this
21
- } else if (this._addr !== this) {
25
+ const builder = builderValue(this)
26
+ if (builder._addr == null) {
27
+ builder._addr = builder
28
+ } else if (builder._addr !== builder) {
22
29
  $.panic('strings: illegal use of non-zero Builder copied by value')
23
30
  }
24
31
  }
25
32
 
26
33
  // String returns the accumulated string.
27
34
  public String(): string {
28
- return this._content
35
+ return builderValue(this)._content
29
36
  }
30
37
 
31
38
  // Len returns the number of accumulated bytes; b.Len() == len(b.String()).
32
39
  public Len(): number {
33
- return this._content.length
40
+ return builderValue(this)._content.length
34
41
  }
35
42
 
36
43
  // Cap returns the capacity of the builder's underlying byte slice. It is the
@@ -38,20 +45,21 @@ export class Builder {
38
45
  // already written.
39
46
  public Cap(): number {
40
47
  // For simplicity, return the current length since JavaScript strings are dynamic
41
- return this._content.length
48
+ return builderValue(this)._content.length
42
49
  }
43
50
 
44
51
  // Reset resets the Builder to be empty.
45
52
  public Reset(): void {
46
- this._addr = null
47
- this._content = ''
53
+ const builder = builderValue(this)
54
+ builder._addr = null
55
+ builder._content = ''
48
56
  }
49
57
 
50
58
  // Grow grows b's capacity, if necessary, to guarantee space for
51
59
  // another n bytes. After Grow(n), at least n bytes can be written to b
52
60
  // without another allocation. If n is negative, Grow panics.
53
61
  public Grow(n: number): void {
54
- this.copyCheck()
62
+ builderValue(this).copyCheck()
55
63
  if (n < 0) {
56
64
  $.panic('strings.Builder.Grow: negative count')
57
65
  }
@@ -60,28 +68,32 @@ export class Builder {
60
68
 
61
69
  // Write appends the contents of p to b's buffer.
62
70
  // Write always returns len(p), nil.
63
- public Write(p: Uint8Array): [number, $.GoError] {
64
- this.copyCheck()
71
+ public Write(p: $.Bytes): [number, $.GoError] {
72
+ builderValue(this).copyCheck()
73
+ const builder = builderValue(this)
65
74
  // Convert byte array to string
66
- const str = new TextDecoder('utf-8').decode(p)
67
- this._content += str
68
- return [p.length, null]
75
+ const bytes = $.bytesToUint8Array(p)
76
+ const str = new TextDecoder('utf-8').decode(bytes)
77
+ builder._content += str
78
+ return [$.len(p), null]
69
79
  }
70
80
 
71
81
  // WriteByte appends the byte c to b's buffer.
72
82
  // The returned error is always nil.
73
83
  public WriteByte(c: number): $.GoError {
74
- this.copyCheck()
75
- this._content += String.fromCharCode(c)
84
+ builderValue(this).copyCheck()
85
+ const builder = builderValue(this)
86
+ builder._content += String.fromCharCode(c)
76
87
  return null
77
88
  }
78
89
 
79
90
  // WriteRune appends the UTF-8 encoding of Unicode code point r to b's buffer.
80
91
  // It returns the length of r and a nil error.
81
92
  public WriteRune(r: number): [number, $.GoError] {
82
- this.copyCheck()
93
+ builderValue(this).copyCheck()
94
+ const builder = builderValue(this)
83
95
  const str = String.fromCodePoint(r)
84
- this._content += str
96
+ builder._content += str
85
97
  // Return the byte length of the UTF-8 encoding
86
98
  const byteLength = new TextEncoder().encode(str).length
87
99
  return [byteLength, null]
@@ -90,8 +102,9 @@ export class Builder {
90
102
  // WriteString appends the contents of s to b's buffer.
91
103
  // It returns the length of s and a nil error.
92
104
  public WriteString(s: string): [number, $.GoError] {
93
- this.copyCheck()
94
- this._content += s
105
+ builderValue(this).copyCheck()
106
+ const builder = builderValue(this)
107
+ builder._content += s
95
108
  return [s.length, null]
96
109
  }
97
110
 
@@ -124,13 +124,11 @@ describe('strings/iter', () => {
124
124
  it('should handle unicode', () => {
125
125
  const parts: string[] = []
126
126
  const seq = SplitSeq('世界,你好', ',')
127
- // This test expects an error due to UTF-8 slicing limitations in JavaScript
128
- expect(() => {
129
- seq((part: string) => {
130
- parts.push(part)
131
- return true
132
- })
133
- }).toThrow('Cannot slice string at byte indices')
127
+ seq((part: string) => {
128
+ parts.push(part)
129
+ return true
130
+ })
131
+ expect(parts).toEqual(['世界', '你好'])
134
132
  })
135
133
  })
136
134
 
@@ -23,38 +23,64 @@ const asciiSpace: { [key: number]: boolean } = {
23
23
  // If s does not end in a newline, the final yielded line will not end in a newline.
24
24
  // It returns a single-use iterator.
25
25
  export function Lines(s: string): iter.Seq<string> {
26
- return (_yield: ((p0: string) => boolean) | null): void => {
27
- for (; $.len(s) > 0; ) {
28
- let line: string
29
- {
30
- let i = IndexByte(s, 10)
31
- if (i >= 0) {
32
- ;[line, s] = [
33
- $.sliceString(s, undefined, i + 1),
34
- $.sliceString(s, i + 1, undefined),
35
- ]
36
- } else {
37
- ;[line, s] = [s, '']
26
+ return (
27
+ _yield: ((p0: string) => iter.YieldResult) | null,
28
+ ): void | globalThis.Promise<void> => {
29
+ const walk = (): void | globalThis.Promise<void> => {
30
+ for (; $.len(s) > 0; ) {
31
+ let line: string
32
+ {
33
+ let i = IndexByte(s, 10)
34
+ if (i >= 0) {
35
+ ;[line, s] = [
36
+ $.sliceString(s, undefined, i + 1),
37
+ $.sliceString(s, i + 1, undefined),
38
+ ]
39
+ } else {
40
+ ;[line, s] = [s, '']
41
+ }
42
+ }
43
+ const keepGoing = _yield!(line)
44
+ if (keepGoing instanceof Promise) {
45
+ return keepGoing.then((next) => {
46
+ if (next) {
47
+ return walk()
48
+ }
49
+ })
50
+ }
51
+ if (!keepGoing) {
52
+ return
38
53
  }
39
- }
40
- if (!_yield!(line)) {
41
- return
42
54
  }
43
55
  }
44
- return
56
+ return walk()
45
57
  }
46
58
  }
47
59
 
48
60
  // explodeSeq returns an iterator over the runes in s.
49
61
  export function explodeSeq(s: string): iter.Seq<string> {
50
- return (_yield: ((p0: string) => boolean) | null): void => {
51
- for (; $.len(s) > 0; ) {
52
- let [, size] = utf8.DecodeRuneInString(s)
53
- if (!_yield!($.sliceString(s, undefined, size))) {
54
- return
62
+ return (
63
+ _yield: ((p0: string) => iter.YieldResult) | null,
64
+ ): void | globalThis.Promise<void> => {
65
+ const walk = (): void | globalThis.Promise<void> => {
66
+ for (; $.len(s) > 0; ) {
67
+ let [, size] = utf8.DecodeRuneInString(s)
68
+ const keepGoing = _yield!($.sliceString(s, undefined, size))
69
+ if (keepGoing instanceof Promise) {
70
+ return keepGoing.then((next) => {
71
+ if (next) {
72
+ s = $.sliceString(s, size, undefined)
73
+ return walk()
74
+ }
75
+ })
76
+ }
77
+ if (!keepGoing) {
78
+ return
79
+ }
80
+ s = $.sliceString(s, size, undefined)
55
81
  }
56
- s = $.sliceString(s, size, undefined)
57
82
  }
83
+ return walk()
58
84
  }
59
85
  }
60
86
 
@@ -68,19 +94,36 @@ export function splitSeq(
68
94
  if ($.len(sep) == 0) {
69
95
  return explodeSeq(s)
70
96
  }
71
- return (_yield: ((p0: string) => boolean) | null): void => {
72
- for (;;) {
73
- let i = Index(s, sep)
74
- if (i < 0) {
75
- break
76
- }
77
- let frag = $.sliceString(s, undefined, i + sepSave)
78
- if (!_yield!(frag)) {
79
- return
97
+ return (
98
+ _yield: ((p0: string) => iter.YieldResult) | null,
99
+ ): void | globalThis.Promise<void> => {
100
+ const walk = (): void | globalThis.Promise<void> => {
101
+ for (;;) {
102
+ let i = Index(s, sep)
103
+ if (i < 0) {
104
+ const keepGoing = _yield!(s)
105
+ if (keepGoing instanceof Promise) {
106
+ return keepGoing.then(() => {})
107
+ }
108
+ return
109
+ }
110
+ let frag = $.sliceString(s, undefined, i + sepSave)
111
+ const keepGoing = _yield!(frag)
112
+ if (keepGoing instanceof Promise) {
113
+ return keepGoing.then((next) => {
114
+ if (next) {
115
+ s = $.sliceString(s, i + $.len(sep), undefined)
116
+ return walk()
117
+ }
118
+ })
119
+ }
120
+ if (!keepGoing) {
121
+ return
122
+ }
123
+ s = $.sliceString(s, i + $.len(sep), undefined)
80
124
  }
81
- s = $.sliceString(s, i + $.len(sep), undefined)
82
125
  }
83
- _yield!(s)
126
+ return walk()
84
127
  }
85
128
  }
86
129
 
@@ -105,31 +148,47 @@ export function SplitAfterSeq(s: string, sep: string): iter.Seq<string> {
105
148
  // The iterator yields the same strings that would be returned by [Fields](s),
106
149
  // but without constructing the slice.
107
150
  export function FieldsSeq(s: string): iter.Seq<string> {
108
- return (_yield: ((p0: string) => boolean) | null): void => {
151
+ return (
152
+ _yield: ((p0: string) => iter.YieldResult) | null,
153
+ ): void | globalThis.Promise<void> => {
109
154
  let start = -1
110
- for (let i = 0; i < $.len(s); ) {
111
- let size = 1
112
- let r = $.indexString(s, i) as number
113
- let isSpace = asciiSpace[$.indexString(s, i)] === true
114
- if (r >= utf8.RuneSelf) {
115
- ;[r, size] = utf8.DecodeRuneInString($.sliceString(s, i, undefined))
116
- isSpace = unicode.IsSpace(r)
117
- }
118
- if (isSpace) {
119
- if (start >= 0) {
120
- if (!_yield!($.sliceString(s, start, i))) {
121
- return
155
+ const walk = (i: number): void | globalThis.Promise<void> => {
156
+ for (; i < $.len(s); ) {
157
+ let size = 1
158
+ let r = $.indexString(s, i) as number
159
+ let isSpace = asciiSpace[$.indexString(s, i)] === true
160
+ if (r >= utf8.RuneSelf) {
161
+ ;[r, size] = utf8.DecodeRuneInString($.sliceString(s, i, undefined))
162
+ isSpace = unicode.IsSpace(r)
163
+ }
164
+ if (isSpace) {
165
+ if (start >= 0) {
166
+ const keepGoing = _yield!($.sliceString(s, start, i))
167
+ start = -1
168
+ if (keepGoing instanceof Promise) {
169
+ return keepGoing.then((next) => {
170
+ if (next) {
171
+ return walk(i + size)
172
+ }
173
+ })
174
+ }
175
+ if (!keepGoing) {
176
+ return
177
+ }
122
178
  }
123
- start = -1
179
+ } else if (start < 0) {
180
+ start = i
181
+ }
182
+ i += size
183
+ }
184
+ if (start >= 0) {
185
+ const keepGoing = _yield!($.sliceString(s, start, undefined))
186
+ if (keepGoing instanceof Promise) {
187
+ return keepGoing.then(() => {})
124
188
  }
125
- } else if (start < 0) {
126
- start = i
127
189
  }
128
- i += size
129
- }
130
- if (start >= 0) {
131
- _yield!($.sliceString(s, start, undefined))
132
190
  }
191
+ return walk(0)
133
192
  }
134
193
  }
135
194
 
@@ -141,31 +200,47 @@ export function FieldsFuncSeq(
141
200
  s: string,
142
201
  f: ((p0: number) => boolean) | null,
143
202
  ): iter.Seq<string> {
144
- return (_yield: ((p0: string) => boolean) | null): void => {
203
+ return (
204
+ _yield: ((p0: string) => iter.YieldResult) | null,
205
+ ): void | globalThis.Promise<void> => {
145
206
  if (f === null) {
146
207
  return
147
208
  }
148
209
  let start = -1
149
- for (let i = 0; i < $.len(s); ) {
150
- let size = 1
151
- let r = $.indexString(s, i) as number
152
- if (r >= utf8.RuneSelf) {
153
- ;[r, size] = utf8.DecodeRuneInString($.sliceString(s, i, undefined))
154
- }
155
- if (f(r)) {
156
- if (start >= 0) {
157
- if (!_yield!($.sliceString(s, start, i))) {
158
- return
210
+ const walk = (i: number): void | globalThis.Promise<void> => {
211
+ for (; i < $.len(s); ) {
212
+ let size = 1
213
+ let r = $.indexString(s, i) as number
214
+ if (r >= utf8.RuneSelf) {
215
+ ;[r, size] = utf8.DecodeRuneInString($.sliceString(s, i, undefined))
216
+ }
217
+ if (f(r)) {
218
+ if (start >= 0) {
219
+ const keepGoing = _yield!($.sliceString(s, start, i))
220
+ start = -1
221
+ if (keepGoing instanceof Promise) {
222
+ return keepGoing.then((next) => {
223
+ if (next) {
224
+ return walk(i + size)
225
+ }
226
+ })
227
+ }
228
+ if (!keepGoing) {
229
+ return
230
+ }
159
231
  }
160
- start = -1
232
+ } else if (start < 0) {
233
+ start = i
234
+ }
235
+ i += size
236
+ }
237
+ if (start >= 0) {
238
+ const keepGoing = _yield!($.sliceString(s, start, undefined))
239
+ if (keepGoing instanceof Promise) {
240
+ return keepGoing.then(() => {})
161
241
  }
162
- } else if (start < 0) {
163
- start = i
164
242
  }
165
- i += size
166
- }
167
- if (start >= 0) {
168
- _yield!($.sliceString(s, start, undefined))
169
243
  }
244
+ return walk(0)
170
245
  }
171
246
  }
@@ -124,10 +124,7 @@ describe('strings/Replacer', () => {
124
124
  it('should handle unicode strings', () => {
125
125
  const r = NewReplacer('世界', '世界!')
126
126
  if (r) {
127
- // This test expects an error due to UTF-8 slicing limitations in JavaScript
128
- expect(() => r.Replace('Hello 世界')).toThrow(
129
- 'Cannot slice string at byte indices',
130
- )
127
+ expect(r.Replace('Hello 世界')).toBe('Hello 世界!')
131
128
  }
132
129
  })
133
130