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
package/gs/io/io.ts CHANGED
@@ -49,6 +49,9 @@ export interface Writer {
49
49
  Write(p: $.Bytes): [number, $.GoError]
50
50
  }
51
51
 
52
+ type ReaderLike = Reader | { Reader: Reader | null } | null
53
+ type WriterLike = Writer | { Writer: Writer | null } | null
54
+
52
55
  // Closer is the interface that wraps the basic Close method
53
56
  export interface Closer {
54
57
  Close(): $.GoError
@@ -68,6 +71,110 @@ export interface ReadSeeker extends Reader, Seeker {}
68
71
  export interface WriteSeeker extends Writer, Seeker {}
69
72
  export interface ReadWriteSeeker extends Reader, Writer, Seeker {}
70
73
 
74
+ class pipeState {
75
+ private chunks: Uint8Array[] = []
76
+ private readOffset = 0
77
+ private readerClosed = false
78
+ private writerClosed = false
79
+ private readerErr: $.GoError = null
80
+ private writerErr: $.GoError = null
81
+
82
+ Read(p: $.Bytes): [number, $.GoError] {
83
+ if (this.readerClosed) {
84
+ return [0, this.readerErr ?? ErrClosedPipe]
85
+ }
86
+ if ($.len(p) === 0) {
87
+ return [0, null]
88
+ }
89
+ if (this.chunks.length === 0) {
90
+ if (this.writerClosed) {
91
+ return [0, this.writerErr ?? EOF]
92
+ }
93
+ return [0, EOF]
94
+ }
95
+
96
+ let copied = 0
97
+ while (copied < $.len(p) && this.chunks.length > 0) {
98
+ const chunk = this.chunks[0]
99
+ const available = chunk.length - this.readOffset
100
+ const want = Math.min($.len(p) - copied, available)
101
+ const target = $.goSlice(p, copied, copied + want)
102
+ $.copy(target, chunk.subarray(this.readOffset, this.readOffset + want))
103
+ copied += want
104
+ this.readOffset += want
105
+ if (this.readOffset === chunk.length) {
106
+ this.chunks.shift()
107
+ this.readOffset = 0
108
+ }
109
+ }
110
+ return [copied, null]
111
+ }
112
+
113
+ Write(p: $.Bytes): [number, $.GoError] {
114
+ if (this.writerClosed || this.readerClosed) {
115
+ return [0, this.readerErr ?? ErrClosedPipe]
116
+ }
117
+ const data = new Uint8Array($.len(p))
118
+ $.copy(data, p)
119
+ this.chunks.push(data)
120
+ return [$.len(p), null]
121
+ }
122
+
123
+ CloseReader(err: $.GoError): $.GoError {
124
+ this.readerClosed = true
125
+ this.readerErr = err
126
+ this.chunks = []
127
+ this.readOffset = 0
128
+ return null
129
+ }
130
+
131
+ CloseWriter(err: $.GoError): $.GoError {
132
+ this.writerClosed = true
133
+ this.writerErr = err
134
+ return null
135
+ }
136
+ }
137
+
138
+ // PipeReader is the read half of a pipe.
139
+ export class PipeReader implements Reader, Closer {
140
+ constructor(private pipe: pipeState) {}
141
+
142
+ Read(data: $.Bytes): [number, $.GoError] {
143
+ return this.pipe.Read(data)
144
+ }
145
+
146
+ Close(): $.GoError {
147
+ return this.CloseWithError(null)
148
+ }
149
+
150
+ CloseWithError(err: $.GoError): $.GoError {
151
+ return this.pipe.CloseReader(err ?? ErrClosedPipe)
152
+ }
153
+ }
154
+
155
+ // PipeWriter is the write half of a pipe.
156
+ export class PipeWriter implements Writer, Closer {
157
+ constructor(private pipe: pipeState) {}
158
+
159
+ Write(data: $.Bytes): [number, $.GoError] {
160
+ return this.pipe.Write(data)
161
+ }
162
+
163
+ Close(): $.GoError {
164
+ return this.CloseWithError(null)
165
+ }
166
+
167
+ CloseWithError(err: $.GoError): $.GoError {
168
+ return this.pipe.CloseWriter(err ?? EOF)
169
+ }
170
+ }
171
+
172
+ // Pipe creates a synchronous in-memory pipe.
173
+ export function Pipe(): [PipeReader, PipeWriter] {
174
+ const pipe = new pipeState()
175
+ return [new PipeReader(pipe), new PipeWriter(pipe)]
176
+ }
177
+
71
178
  // ReaderAt is the interface that wraps the basic ReadAt method
72
179
  export interface ReaderAt {
73
180
  ReadAt(p: $.Bytes, off: number): [number, $.GoError]
@@ -150,18 +257,20 @@ export class LimitedReader implements Reader {
150
257
  }
151
258
 
152
259
  Read(p: $.Bytes): [number, $.GoError] {
153
- if (this.N <= 0) {
154
- return [0, EOF]
155
- }
260
+ return (async (): Promise<[number, $.GoError]> => {
261
+ if (this.N <= 0) {
262
+ return [0, EOF]
263
+ }
156
264
 
157
- let readBuf = p
158
- if ($.len(p) > this.N) {
159
- readBuf = $.goSlice(p, 0, this.N)
160
- }
265
+ let readBuf = p
266
+ if ($.len(p) > this.N) {
267
+ readBuf = $.goSlice(p, 0, this.N)
268
+ }
161
269
 
162
- const [n, err] = this.R.Read(readBuf)
163
- this.N -= n
164
- return [n, err]
270
+ const [n, err] = await (this.R.Read(readBuf) as any)
271
+ this.N -= n
272
+ return [n, err]
273
+ })() as any
165
274
  }
166
275
  }
167
276
 
@@ -308,24 +417,33 @@ export function NewOffsetWriter(w: WriterAt, off: number): OffsetWriter {
308
417
  }
309
418
 
310
419
  // Copy copies from src to dst until either EOF is reached on src or an error occurs
311
- export function Copy(dst: Writer, src: Reader): [number, $.GoError] {
312
- return CopyBuffer(dst, src, null)
420
+ export async function Copy(
421
+ dst: WriterLike,
422
+ src: ReaderLike,
423
+ ): Promise<[number, $.GoError]> {
424
+ return await CopyBuffer(dst, src, null)
313
425
  }
314
426
 
315
427
  // CopyBuffer is identical to Copy except that it stages through the provided buffer
316
- export function CopyBuffer(
317
- dst: Writer,
318
- src: Reader,
428
+ export async function CopyBuffer(
429
+ dst: WriterLike,
430
+ src: ReaderLike,
319
431
  buf: $.Bytes | null,
320
- ): [number, $.GoError] {
432
+ ): Promise<[number, $.GoError]> {
433
+ dst = unwrapWriter(dst)
434
+ src = unwrapReader(src)
435
+ if (dst === null || src === null) {
436
+ return [0, newError('io: copy with nil reader or writer')]
437
+ }
438
+
321
439
  // If src implements WriterTo, use it
322
440
  if ('WriteTo' in src && typeof (src as any).WriteTo === 'function') {
323
- return (src as WriterTo).WriteTo(dst)
441
+ return await ((src as WriterTo).WriteTo(dst) as any)
324
442
  }
325
443
 
326
444
  // If dst implements ReaderFrom, use it
327
445
  if ('ReadFrom' in dst && typeof (dst as any).ReadFrom === 'function') {
328
- return (dst as ReaderFrom).ReadFrom(src)
446
+ return await ((dst as ReaderFrom).ReadFrom(src) as any)
329
447
  }
330
448
 
331
449
  if (buf === null) {
@@ -334,9 +452,9 @@ export function CopyBuffer(
334
452
 
335
453
  let written = 0
336
454
  while (true) {
337
- const [nr, er] = src.Read(buf)
455
+ const [nr, er] = await (src.Read(buf) as any)
338
456
  if (nr > 0) {
339
- const [nw, ew] = dst.Write($.goSlice(buf, 0, nr))
457
+ const [nw, ew] = await (dst.Write($.goSlice(buf, 0, nr)) as any)
340
458
  if (nw < 0 || nr < nw) {
341
459
  if (ew === null) {
342
460
  return [written, ErrShortWrite]
@@ -361,13 +479,33 @@ export function CopyBuffer(
361
479
  return [written, null]
362
480
  }
363
481
 
482
+ function unwrapReader(src: ReaderLike): Reader | null {
483
+ if (src == null) {
484
+ return null
485
+ }
486
+ if ('Read' in src && typeof (src as any).Read === 'function') {
487
+ return src as Reader
488
+ }
489
+ return (src as { Reader: Reader | null }).Reader
490
+ }
491
+
492
+ function unwrapWriter(dst: WriterLike): Writer | null {
493
+ if (dst == null) {
494
+ return null
495
+ }
496
+ if ('Write' in dst && typeof (dst as any).Write === 'function') {
497
+ return dst as Writer
498
+ }
499
+ return (dst as { Writer: Writer | null }).Writer
500
+ }
501
+
364
502
  // CopyN copies n bytes (or until an error) from src to dst
365
- export function CopyN(
503
+ export async function CopyN(
366
504
  dst: Writer,
367
505
  src: Reader,
368
506
  n: number,
369
- ): [number, $.GoError] {
370
- const [written, err] = Copy(dst, LimitReader(src, n))
507
+ ): Promise<[number, $.GoError]> {
508
+ const [written, err] = await Copy(dst, LimitReader(src, n))
371
509
  if (written === n) {
372
510
  return [written, null]
373
511
  }
@@ -379,23 +517,26 @@ export function CopyN(
379
517
  }
380
518
 
381
519
  // ReadAtLeast reads from r into buf until it has read at least min bytes
382
- export function ReadAtLeast(
520
+ export async function ReadAtLeast(
383
521
  r: Reader,
384
522
  buf: $.Bytes,
385
523
  min: number,
386
- ): [number, $.GoError] {
524
+ ): Promise<[number, $.GoError]> {
387
525
  if ($.len(buf) < min) {
388
526
  return [0, ErrShortBuffer]
389
527
  }
390
528
 
391
529
  let n = 0
392
530
  while (n < min) {
393
- const [nn, err] = r.Read($.goSlice(buf, n))
531
+ const [nn, err] = await (r.Read($.goSlice(buf, n)) as any)
394
532
  n += nn
395
533
  if (err !== null) {
396
534
  if (err === EOF && n >= min) {
397
535
  return [n, null]
398
536
  }
537
+ if (err === EOF && n === 0) {
538
+ return [n, EOF]
539
+ }
399
540
  if (err === EOF && n < min) {
400
541
  return [n, ErrUnexpectedEOF]
401
542
  }
@@ -406,20 +547,25 @@ export function ReadAtLeast(
406
547
  }
407
548
 
408
549
  // ReadFull reads exactly len(buf) bytes from r into buf
409
- export function ReadFull(r: Reader, buf: $.Bytes): [number, $.GoError] {
410
- return ReadAtLeast(r, buf, $.len(buf))
550
+ export async function ReadFull(
551
+ r: Reader,
552
+ buf: $.Bytes,
553
+ ): Promise<[number, $.GoError]> {
554
+ return await ReadAtLeast(r, buf, $.len(buf))
411
555
  }
412
556
 
413
557
  // ReadAll reads from r until an error or EOF and returns the data it read
414
- export function ReadAll(r: Reader): [$.Bytes, $.GoError] {
558
+ export async function ReadAll(r: Reader): Promise<[$.Bytes, $.GoError]> {
415
559
  const chunks: $.Bytes[] = []
416
560
  let totalLength = 0
417
561
  const buf = $.makeSlice<number>(512, undefined, 'byte')
418
562
 
419
563
  while (true) {
420
- const [n, err] = r.Read(buf)
564
+ const [n, err] = await (r.Read(buf) as any)
421
565
  if (n > 0) {
422
- chunks.push($.goSlice(buf, 0, n))
566
+ const chunk = $.makeSlice<number>(n, undefined, 'byte')
567
+ $.copy(chunk, $.goSlice(buf, 0, n))
568
+ chunks.push(chunk)
423
569
  totalLength += n
424
570
  }
425
571
  if (err !== null) {
package/gs/io/meta.json CHANGED
@@ -5,5 +5,13 @@
5
5
  "path",
6
6
  "time",
7
7
  "unicode/utf8"
8
- ]
9
- }
8
+ ],
9
+ "asyncFunctions": {
10
+ "Copy": true,
11
+ "CopyBuffer": true,
12
+ "CopyN": true,
13
+ "ReadAtLeast": true,
14
+ "ReadFull": true,
15
+ "ReadAll": true
16
+ }
17
+ }
package/gs/iter/iter.ts CHANGED
@@ -1,11 +1,17 @@
1
1
  // TypeScript implementation of Go's iter package
2
2
  // This provides iterator types and functions
3
3
 
4
+ export type YieldResult = boolean | globalThis.Promise<boolean>
5
+
4
6
  // Seq is an iterator over sequences of individual values
5
- export type Seq<V> = (_yield: (value: V) => boolean) => void
7
+ export type Seq<V> = (
8
+ _yield: ((value: V) => YieldResult) | null,
9
+ ) => void | globalThis.Promise<void>
6
10
 
7
11
  // Seq2 is an iterator over sequences of pairs of values
8
- export type Seq2<K, V> = (_yield: (key: K, value: V) => boolean) => void
12
+ export type Seq2<K, V> = (
13
+ _yield: ((key: K, value: V) => YieldResult) | null,
14
+ ) => void | globalThis.Promise<void>
9
15
 
10
16
  // Pull converts the "push-style" iterator sequence seq into a "pull-style" iterator
11
17
  // Returns a function that returns the next value and a boolean indicating if iteration should continue
package/gs/maps/iter.ts CHANGED
@@ -5,45 +5,39 @@ import * as iter from '@goscript/iter/index.js'
5
5
  // All returns an iterator over key-value pairs from m.
6
6
  // The iteration order is not specified and is not guaranteed
7
7
  // to be the same from one call to the next.
8
- export function All<K extends $.Comparable, V>(m: Map<K, V>): iter.Seq2<K, V> {
9
- return (_yield: ((p0: K, p1: V) => boolean) | null): void => {
10
- for (const [k, v] of m.entries()) {
11
- if (!_yield!(k, v)) {
12
- return
13
- }
14
- }
15
- }
8
+ export function All<K extends $.Comparable | null, V>(
9
+ m: Map<K, V> | null,
10
+ ): iter.Seq2<K, V> {
11
+ return (_yield: ((p0: K, p1: V) => iter.YieldResult) | null):
12
+ | void
13
+ | globalThis.Promise<void> => iteratePairs(m?.entries() ?? [], _yield)
16
14
  }
17
15
 
18
16
  // Keys returns an iterator over keys in m.
19
17
  // The iteration order is not specified and is not guaranteed
20
18
  // to be the same from one call to the next.
21
- export function Keys<K extends $.Comparable, V>(m: Map<K, V>): iter.Seq<K> {
22
- return (_yield: ((p0: K) => boolean) | null): void => {
23
- for (const [k, _v] of m.entries()) {
24
- if (!_yield!(k)) {
25
- return
26
- }
27
- }
28
- }
19
+ export function Keys<K extends $.Comparable | null, V>(
20
+ m: Map<K, V> | null,
21
+ ): iter.Seq<K> {
22
+ return (_yield: ((p0: K) => iter.YieldResult) | null):
23
+ | void
24
+ | globalThis.Promise<void> => iterateValues(mapKeys(m), _yield)
29
25
  }
30
26
 
31
27
  // Values returns an iterator over values in m.
32
28
  // The iteration order is not specified and is not guaranteed
33
29
  // to be the same from one call to the next.
34
- export function Values<K extends $.Comparable, V>(m: Map<K, V>): iter.Seq<V> {
35
- return (_yield: ((p0: V) => boolean) | null): void => {
36
- for (const [_k, v] of m.entries()) {
37
- if (!_yield!(v)) {
38
- return
39
- }
40
- }
41
- }
30
+ export function Values<K extends $.Comparable | null, V>(
31
+ m: Map<K, V> | null,
32
+ ): iter.Seq<V> {
33
+ return (_yield: ((p0: V) => iter.YieldResult) | null):
34
+ | void
35
+ | globalThis.Promise<void> => iterateValues(mapValues(m), _yield)
42
36
  }
43
37
 
44
38
  // Insert adds the key-value pairs from seq to m.
45
39
  // If a key in seq already exists in m, its value will be overwritten.
46
- export function Insert<K extends $.Comparable, V>(
40
+ export function Insert<K extends $.Comparable | null, V>(
47
41
  m: Map<K, V>,
48
42
  seq: iter.Seq2<K, V>,
49
43
  ): void {
@@ -58,10 +52,65 @@ export function Insert<K extends $.Comparable, V>(
58
52
 
59
53
  // Collect collects key-value pairs from seq into a new map
60
54
  // and returns it.
61
- export function Collect<K extends $.Comparable, V>(
55
+ export function Collect<K extends $.Comparable | null, V>(
62
56
  seq: iter.Seq2<K, V>,
63
57
  ): Map<K, V> {
64
58
  let m = $.makeMap<K, V>()
65
59
  Insert(m, seq)
66
60
  return m
67
61
  }
62
+
63
+ function mapKeys<K extends $.Comparable | null, V>(m: Map<K, V> | null): K[] {
64
+ return Array.from(m?.keys() ?? [])
65
+ }
66
+
67
+ function mapValues<K extends $.Comparable | null, V>(m: Map<K, V> | null): V[] {
68
+ return Array.from(m?.values() ?? [])
69
+ }
70
+
71
+ function iterateValues<T>(
72
+ values: Iterable<T>,
73
+ yieldValue: ((value: T) => iter.YieldResult) | null,
74
+ ): void | globalThis.Promise<void> {
75
+ const items = Array.from(values)
76
+ const walk = (idx: number): void | globalThis.Promise<void> => {
77
+ for (; idx < items.length; idx++) {
78
+ const keepGoing = yieldValue!(items[idx])
79
+ if (keepGoing instanceof Promise) {
80
+ return keepGoing.then((next) => {
81
+ if (next) {
82
+ return walk(idx + 1)
83
+ }
84
+ })
85
+ }
86
+ if (!keepGoing) {
87
+ return
88
+ }
89
+ }
90
+ }
91
+ return walk(0)
92
+ }
93
+
94
+ function iteratePairs<K, V>(
95
+ entries: Iterable<[K, V]>,
96
+ yieldValue: ((key: K, value: V) => iter.YieldResult) | null,
97
+ ): void | globalThis.Promise<void> {
98
+ const items = Array.from(entries)
99
+ const walk = (idx: number): void | globalThis.Promise<void> => {
100
+ for (; idx < items.length; idx++) {
101
+ const [key, value] = items[idx]
102
+ const keepGoing = yieldValue!(key, value)
103
+ if (keepGoing instanceof Promise) {
104
+ return keepGoing.then((next) => {
105
+ if (next) {
106
+ return walk(idx + 1)
107
+ }
108
+ })
109
+ }
110
+ if (!keepGoing) {
111
+ return
112
+ }
113
+ }
114
+ }
115
+ return walk(0)
116
+ }
@@ -0,0 +1,23 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { Clone, Values } from './index.js'
4
+
5
+ describe('maps overrides', () => {
6
+ it('accept nilable comparable keys', () => {
7
+ const source = new Map<object | null, number>()
8
+ const key = { name: 'type' }
9
+ source.set(null, 1)
10
+ source.set(key, 2)
11
+
12
+ const cloned = Clone(source)
13
+ expect(cloned?.get(null)).toBe(1)
14
+ expect(cloned?.get(key)).toBe(2)
15
+
16
+ const values: number[] = []
17
+ Values(cloned)((value) => {
18
+ values.push(value)
19
+ return true
20
+ })
21
+ expect(values.sort()).toEqual([1, 2])
22
+ })
23
+ })
package/gs/maps/maps.ts CHANGED
@@ -4,7 +4,7 @@ import * as _ from '@goscript/unsafe/index.js'
4
4
 
5
5
  // Equal reports whether two maps contain the same key/value pairs.
6
6
  // Values are compared using ==.
7
- export function Equal<K extends $.Comparable, V extends $.Comparable>(
7
+ export function Equal<K extends $.Comparable | null, V extends $.Comparable | null>(
8
8
  m1: Map<K, V>,
9
9
  m2: Map<K, V>,
10
10
  ): boolean {
@@ -22,7 +22,7 @@ export function Equal<K extends $.Comparable, V extends $.Comparable>(
22
22
 
23
23
  // EqualFunc is like Equal, but compares values using eq.
24
24
  // Keys are still compared with ==.
25
- export function EqualFunc<K extends $.Comparable, V1, V2>(
25
+ export function EqualFunc<K extends $.Comparable | null, V1, V2>(
26
26
  m1: Map<K, V1>,
27
27
  m2: Map<K, V2>,
28
28
  eq: ((p0: V1, p1: V2) => boolean) | null,
@@ -40,7 +40,7 @@ export function EqualFunc<K extends $.Comparable, V1, V2>(
40
40
  }
41
41
 
42
42
  // clone returns a shallow copy of the map.
43
- export function clone<K extends $.Comparable, V>(
43
+ export function clone<K extends $.Comparable | null, V>(
44
44
  m: Map<K, V> | null,
45
45
  ): Map<K, V> | null {
46
46
  if (m == null) {
@@ -55,29 +55,31 @@ export function clone<K extends $.Comparable, V>(
55
55
 
56
56
  // Clone returns a copy of m. This is a shallow clone:
57
57
  // the new keys and values are set using ordinary assignment.
58
- export function Clone<K extends $.Comparable, V>(m: Map<K, V>): Map<K, V> {
58
+ export function Clone<K extends $.Comparable | null, V>(
59
+ m: Map<K, V> | null,
60
+ ): Map<K, V> | null {
59
61
  // Preserve nil in case it matters.
60
62
  if (m == null) {
61
- return null as unknown as Map<K, V>
63
+ return null
62
64
  }
63
- return clone(m)!
65
+ return clone(m)
64
66
  }
65
67
 
66
68
  // Copy copies all key/value pairs in src adding them to dst.
67
69
  // When a key in src is already present in dst,
68
70
  // the value in dst will be overwritten by the value associated
69
71
  // with the key in src.
70
- export function Copy<K extends $.Comparable, V>(
71
- dst: Map<K, V>,
72
- src: Map<K, V>,
72
+ export function Copy<K extends $.Comparable | null, V>(
73
+ dst: Map<K, V> | null,
74
+ src: Map<K, V> | null,
73
75
  ): void {
74
- for (const [k, v] of src.entries()) {
76
+ for (const [k, v] of src?.entries() ?? []) {
75
77
  $.mapSet(dst, k, v)
76
78
  }
77
79
  }
78
80
 
79
81
  // DeleteFunc deletes any key/value pairs from m for which del returns true.
80
- export function DeleteFunc<K extends $.Comparable, V>(
82
+ export function DeleteFunc<K extends $.Comparable | null, V>(
81
83
  m: Map<K, V>,
82
84
  del: ((p0: K, p1: V) => boolean) | null,
83
85
  ): void {
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { Mul64 } from './index.js'
4
+
5
+ describe('math/bits override', () => {
6
+ it('returns the full 128-bit product from Mul64', () => {
7
+ expect(Mul64(0xffffffffffffffffn, 0xffffffffffffffffn)).toEqual([
8
+ 0xfffffffffffffffen,
9
+ 1n,
10
+ ])
11
+ expect(Mul64(0x1fffffffffffffn, 0x1fffffffffffffn)).toEqual([
12
+ 0x3ffffffffffn,
13
+ 0xffc0000000000001n,
14
+ ])
15
+ expect(Mul64(0x1fffffffffffff, 0x1fffffffffffff)).toEqual([
16
+ 0x3ffffffffff,
17
+ 0xffc0000000000001n,
18
+ ])
19
+ })
20
+ })