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
@@ -1,6 +1,12 @@
1
1
  // TypeScript implementation of Go's slices package
2
2
  import * as $ from '@goscript/builtin/index.js'
3
3
  import * as cmp from '../cmp/index.js'
4
+ import * as iter from '../iter/index.js'
5
+
6
+ type SyncCallbackResult<T> = T | globalThis.Promise<T>
7
+ type CompareCallback<T, U = T> = ((v1: T, v2: U) => SyncCallbackResult<number>) | null
8
+ type PredicateCallback<T> = ((value: T) => SyncCallbackResult<boolean>) | null
9
+ type EqualCallback<T, U = T> = ((v1: T, v2: U) => SyncCallbackResult<boolean>) | null
4
10
 
5
11
  /**
6
12
  * Compare compares the elements of s1 and s2 using cmp.Compare.
@@ -41,6 +47,82 @@ export function Compare<T extends string | number>(
41
47
  return 0
42
48
  }
43
49
 
50
+ export function CompareFunc<T, U>(
51
+ s1: $.Slice<T>,
52
+ s2: $.Slice<U>,
53
+ compare: CompareCallback<T, U>,
54
+ ): number {
55
+ if (compare == null) {
56
+ throw new Error('slices.CompareFunc: nil comparison function')
57
+ }
58
+ const len1 = $.len(s1)
59
+ const len2 = $.len(s2)
60
+ const minLen = len1 < len2 ? len1 : len2
61
+ for (let i = 0; i < minLen; i++) {
62
+ const result = syncNumber(
63
+ compare((s1 as any)[i] as T, (s2 as any)[i] as U),
64
+ )
65
+ if (result !== 0) {
66
+ return result
67
+ }
68
+ }
69
+ if (len1 < len2) {
70
+ return -1
71
+ }
72
+ if (len1 > len2) {
73
+ return 1
74
+ }
75
+ return 0
76
+ }
77
+
78
+ /**
79
+ * Clone returns a shallow copy of s while preserving nilness.
80
+ * @param s The slice to clone
81
+ * @returns A new slice with the same elements, or null for a nil slice
82
+ */
83
+ export function Clone<T>(s: $.Slice<T>): $.Slice<T> {
84
+ if (s == null) {
85
+ return null
86
+ }
87
+ const out = $.makeSlice<T>($.len(s))
88
+ for (let i = 0; i < $.len(s); i++) {
89
+ ;(out as any)[i] = (s as any)[i] as T
90
+ }
91
+ return out
92
+ }
93
+
94
+ export function Concat<T>(...slices: $.Slice<T>[]): $.Slice<T> {
95
+ let size = 0
96
+ let byteSlice = false
97
+ for (const slice of slices) {
98
+ size += $.len(slice)
99
+ byteSlice = byteSlice || slice instanceof Uint8Array
100
+ }
101
+ if (size === 0) {
102
+ return null
103
+ }
104
+ if (byteSlice) {
105
+ const out = new Uint8Array(size)
106
+ let pos = 0
107
+ for (const slice of slices) {
108
+ const length = $.len(slice)
109
+ for (let i = 0; i < length; i++) {
110
+ out[pos++] = (slice as any)[i] as number
111
+ }
112
+ }
113
+ return out as $.Slice<T>
114
+ }
115
+ const out = $.makeSlice<T>(size)
116
+ let pos = 0
117
+ for (const slice of slices) {
118
+ const length = $.len(slice)
119
+ for (let i = 0; i < length; i++) {
120
+ ;(out as any)[pos++] = (slice as any)[i] as T
121
+ }
122
+ }
123
+ return out
124
+ }
125
+
44
126
  /**
45
127
  * All returns an iterator over index-value pairs in the slice.
46
128
  * This is equivalent to Go's slices.All function.
@@ -49,27 +131,160 @@ export function Compare<T extends string | number>(
49
131
  */
50
132
  export function All<T>(
51
133
  s: $.Slice<T>,
52
- ): (yieldFunc: (index: number, value: T) => boolean) => void {
53
- return function (_yield: (index: number, value: T) => boolean): void {
134
+ ): (yieldFunc: (index: number, value: T) => iter.YieldResult) => void | globalThis.Promise<void> {
135
+ return function (
136
+ _yield: (index: number, value: T) => iter.YieldResult,
137
+ ): void | globalThis.Promise<void> {
54
138
  const length = $.len(s)
55
- for (let i = 0; i < length; i++) {
56
- const value = (s as any)[i] as T // Use proper indexing to avoid type issues
57
- if (!_yield(i, value)) {
58
- break
139
+ const walk = (i: number): void | globalThis.Promise<void> => {
140
+ for (; i < length; i++) {
141
+ const value = (s as any)[i] as T // Use proper indexing to avoid type issues
142
+ const keepGoing = _yield(i, value)
143
+ if (keepGoing instanceof Promise) {
144
+ return keepGoing.then((next) => {
145
+ if (next) {
146
+ return walk(i + 1)
147
+ }
148
+ })
149
+ }
150
+ if (!keepGoing) {
151
+ return
152
+ }
59
153
  }
60
154
  }
155
+ return walk(0)
156
+ }
157
+ }
158
+
159
+ export function Backward<T>(
160
+ s: $.Slice<T>,
161
+ ): (
162
+ _yield: (index: number, value: T) => boolean | globalThis.Promise<boolean>,
163
+ ) => void | globalThis.Promise<void> {
164
+ return function (
165
+ _yield: (index: number, value: T) => boolean | globalThis.Promise<boolean>,
166
+ ): void | globalThis.Promise<void> {
167
+ const walk = (i: number): void | globalThis.Promise<void> => {
168
+ for (; i >= 0; i--) {
169
+ const keepGoing = _yield(i, (s as any)[i] as T)
170
+ if (keepGoing instanceof Promise) {
171
+ return keepGoing.then((next) => {
172
+ if (next) {
173
+ return walk(i - 1)
174
+ }
175
+ })
176
+ }
177
+ if (!keepGoing) {
178
+ break
179
+ }
180
+ }
181
+ }
182
+ const length = $.len(s)
183
+ if (length === 0) {
184
+ return
185
+ }
186
+ return walk(length - 1)
61
187
  }
62
188
  }
63
189
 
64
- /**
65
- * Sort sorts a slice in ascending order.
66
- * This is equivalent to Go's slices.Sort function.
67
- * @param s The slice to sort in place
68
- */
69
190
  export function Sort<T extends string | number>(s: $.Slice<T>): void {
70
191
  $.sortSlice(s)
71
192
  }
72
193
 
194
+ export function IsSorted<T extends string | number>(x: $.Slice<T>): boolean {
195
+ for (let i = $.len(x) - 1; i > 0; i--) {
196
+ if (cmp.Compare((x as any)[i] as T, (x as any)[i - 1] as T) < 0) {
197
+ return false
198
+ }
199
+ }
200
+ return true
201
+ }
202
+
203
+ export function Max<T extends cmp.Ordered>(x: $.Slice<T>): T {
204
+ if ($.len(x) === 0) {
205
+ throw new Error('slices.Max: empty list')
206
+ }
207
+ let max = (x as any)[0] as T
208
+ for (let i = 1; i < $.len(x); i++) {
209
+ const value = (x as any)[i] as T
210
+ if (cmp.Compare(max, value) < 0) {
211
+ max = value
212
+ }
213
+ }
214
+ return max
215
+ }
216
+
217
+ export function Min<T extends cmp.Ordered>(x: $.Slice<T>): T {
218
+ if ($.len(x) === 0) {
219
+ throw new Error('slices.Min: empty list')
220
+ }
221
+ let min = (x as any)[0] as T
222
+ for (let i = 1; i < $.len(x); i++) {
223
+ const value = (x as any)[i] as T
224
+ if (cmp.Compare(value, min) < 0) {
225
+ min = value
226
+ }
227
+ }
228
+ return min
229
+ }
230
+
231
+ export function MaxFunc<T>(
232
+ x: $.Slice<T>,
233
+ compare: CompareCallback<T>,
234
+ ): T {
235
+ if (compare == null) {
236
+ throw new Error('slices.MaxFunc: nil comparison function')
237
+ }
238
+ if ($.len(x) === 0) {
239
+ throw new Error('slices.MaxFunc: empty list')
240
+ }
241
+ let max = (x as any)[0] as T
242
+ for (let i = 1; i < $.len(x); i++) {
243
+ const value = (x as any)[i] as T
244
+ if (syncNumber(compare(max, value)) < 0) {
245
+ max = value
246
+ }
247
+ }
248
+ return max
249
+ }
250
+
251
+ export function MinFunc<T>(
252
+ x: $.Slice<T>,
253
+ compare: CompareCallback<T>,
254
+ ): T {
255
+ if (compare == null) {
256
+ throw new Error('slices.MinFunc: nil comparison function')
257
+ }
258
+ if ($.len(x) === 0) {
259
+ throw new Error('slices.MinFunc: empty list')
260
+ }
261
+ let min = (x as any)[0] as T
262
+ for (let i = 1; i < $.len(x); i++) {
263
+ const value = (x as any)[i] as T
264
+ if (syncNumber(compare(value, min)) < 0) {
265
+ min = value
266
+ }
267
+ }
268
+ return min
269
+ }
270
+
271
+ export function Collect<T>(seq: iter.Seq<T>): $.Slice<T> {
272
+ const out: T[] = []
273
+ seq((value: T) => {
274
+ out.push(value)
275
+ return true
276
+ })
277
+ return out.length === 0 ? null : out
278
+ }
279
+
280
+ export function Sorted<T extends string | number>(
281
+ seq: iter.Seq<T>,
282
+ ): $.Slice<T> {
283
+ const out = Collect<T>(seq)
284
+ Sort(out)
285
+ return out
286
+ }
287
+
73
288
  /**
74
289
  * Delete removes the elements s[i:j] from s, returning the modified slice.
75
290
  * Delete panics if j > len(s) or s[i:j] is not a valid slice of s.
@@ -102,6 +317,200 @@ export function Delete<T>(s: $.Slice<T>, i: number, j: number): $.Slice<T> {
102
317
  return $.goSlice(s, 0, length - deleteCount) as $.Slice<T>
103
318
  }
104
319
 
320
+ export function DeleteFunc<T>(
321
+ s: $.Slice<T>,
322
+ del: PredicateCallback<T>,
323
+ ): $.Slice<T> {
324
+ if (del == null) {
325
+ throw new Error('slices.DeleteFunc: nil delete function')
326
+ }
327
+ if (s === null || s === undefined) {
328
+ return s
329
+ }
330
+ let w = 0
331
+ for (let i = 0; i < s.length; i++) {
332
+ const value = s[i] as T
333
+ if (!syncBoolean(del(value))) {
334
+ ;(s as any)[w] = value
335
+ w++
336
+ }
337
+ }
338
+ for (let i = w; i < s.length; i++) {
339
+ ;(s as any)[i] = clearValue(s)
340
+ }
341
+ return $.goSlice(s, 0, w) as $.Slice<T>
342
+ }
343
+
344
+ export function Replace<T>(
345
+ s: $.Slice<T>,
346
+ i: number,
347
+ j: number,
348
+ ...v: T[]
349
+ ): $.Slice<T> {
350
+ const length = $.len(s)
351
+ if (i < 0 || j < i || j > length) {
352
+ throw new Error(
353
+ `slice bounds out of range [${i}:${j}] with length ${length}`,
354
+ )
355
+ }
356
+ const out = $.makeSlice<T>(length - (j - i) + v.length)
357
+ let pos = 0
358
+ for (let idx = 0; idx < i; idx++) {
359
+ ;(out as any)[pos++] = (s as any)[idx]
360
+ }
361
+ for (const value of v) {
362
+ ;(out as any)[pos++] = value
363
+ }
364
+ for (let idx = j; idx < length; idx++) {
365
+ ;(out as any)[pos++] = (s as any)[idx]
366
+ }
367
+ return out
368
+ }
369
+
370
+ export function Compact<T>(s: $.Slice<T>): $.Slice<T> {
371
+ if (s === null || s === undefined || $.len(s) < 2) {
372
+ return s
373
+ }
374
+ let w = 1
375
+ for (let i = 1; i < $.len(s); i++) {
376
+ if ((s as any)[i] !== (s as any)[i - 1]) {
377
+ ;(s as any)[w] = (s as any)[i]
378
+ w++
379
+ }
380
+ }
381
+ for (let i = w; i < $.len(s); i++) {
382
+ ;(s as any)[i] = clearValue(s)
383
+ }
384
+ return $.goSlice(s, 0, w) as $.Slice<T>
385
+ }
386
+
387
+ export function CompactFunc<T>(
388
+ s: $.Slice<T>,
389
+ eq: EqualCallback<T>,
390
+ ): $.Slice<T> {
391
+ if (eq == null) {
392
+ throw new Error('slices.CompactFunc: nil equality function')
393
+ }
394
+ if (s === null || s === undefined || $.len(s) < 2) {
395
+ return s
396
+ }
397
+ let w = 1
398
+ for (let i = 1; i < $.len(s); i++) {
399
+ if (!syncBoolean(eq((s as any)[i - 1] as T, (s as any)[i] as T))) {
400
+ ;(s as any)[w] = (s as any)[i]
401
+ w++
402
+ }
403
+ }
404
+ for (let i = w; i < $.len(s); i++) {
405
+ ;(s as any)[i] = clearValue(s)
406
+ }
407
+ return $.goSlice(s, 0, w) as $.Slice<T>
408
+ }
409
+
410
+ export function Clip<T>(s: $.Slice<T>): $.Slice<T> {
411
+ if (s == null) {
412
+ return null
413
+ }
414
+ const out = $.makeSlice<T>($.len(s), $.len(s))
415
+ for (let i = 0; i < $.len(s); i++) {
416
+ ;(out as any)[i] = (s as any)[i]
417
+ }
418
+ return out
419
+ }
420
+
421
+ export function Equal<T>(s1: $.Slice<T>, s2: $.Slice<T>): boolean {
422
+ const len1 = $.len(s1)
423
+ if (len1 !== $.len(s2)) {
424
+ return false
425
+ }
426
+ for (let i = 0; i < len1; i++) {
427
+ if ((s1 as any)[i] !== (s2 as any)[i]) {
428
+ return false
429
+ }
430
+ }
431
+ return true
432
+ }
433
+
434
+ export function EqualFunc<T, U>(
435
+ s1: $.Slice<T>,
436
+ s2: $.Slice<U>,
437
+ eq: EqualCallback<T, U>,
438
+ ): boolean {
439
+ if (eq == null) {
440
+ throw new Error('slices.EqualFunc: nil equality function')
441
+ }
442
+ const len1 = $.len(s1)
443
+ if (len1 !== $.len(s2)) {
444
+ return false
445
+ }
446
+ for (let i = 0; i < len1; i++) {
447
+ if (!syncBoolean(eq((s1 as any)[i] as T, (s2 as any)[i] as U))) {
448
+ return false
449
+ }
450
+ }
451
+ return true
452
+ }
453
+
454
+ export function Index<T>(s: $.Slice<T>, v: T): number {
455
+ for (let i = 0; i < $.len(s); i++) {
456
+ if ((s as any)[i] === v) {
457
+ return i
458
+ }
459
+ }
460
+ return -1
461
+ }
462
+
463
+ export function IndexFunc<T>(s: $.Slice<T>, f: PredicateCallback<T>): number {
464
+ if (f == null) {
465
+ throw new Error('slices.IndexFunc: nil predicate function')
466
+ }
467
+ for (let i = 0; i < $.len(s); i++) {
468
+ if (syncBoolean(f((s as any)[i] as T))) {
469
+ return i
470
+ }
471
+ }
472
+ return -1
473
+ }
474
+
475
+ export function Contains<T>(s: $.Slice<T>, v: T): boolean {
476
+ return Index(s, v) >= 0
477
+ }
478
+
479
+ export function ContainsFunc<T>(s: $.Slice<T>, f: PredicateCallback<T>): boolean {
480
+ return IndexFunc(s, f) >= 0
481
+ }
482
+
483
+ export function Insert<T>(s: $.Slice<T>, i: number, ...v: T[]): $.Slice<T> {
484
+ const length = $.len(s)
485
+ if (i < 0 || i > length) {
486
+ throw new Error(
487
+ `slice bounds out of range [${i}:${i}] with length ${length}`,
488
+ )
489
+ }
490
+ if (v.length === 0) {
491
+ return s
492
+ }
493
+ const out = $.makeSlice<T>(length + v.length)
494
+ for (let idx = 0; idx < i; idx++) {
495
+ ;(out as any)[idx] = (s as any)[idx]
496
+ }
497
+ for (let idx = 0; idx < v.length; idx++) {
498
+ ;(out as any)[i + idx] = v[idx]
499
+ }
500
+ for (let idx = i; idx < length; idx++) {
501
+ ;(out as any)[idx + v.length] = (s as any)[idx]
502
+ }
503
+ return out
504
+ }
505
+
506
+ export function Reverse<T>(s: $.Slice<T>): void {
507
+ for (let i = 0, j = $.len(s) - 1; i < j; i++, j--) {
508
+ const tmp = (s as any)[i]
509
+ ;(s as any)[i] = (s as any)[j]
510
+ ;(s as any)[j] = tmp
511
+ }
512
+ }
513
+
105
514
  /**
106
515
  * Grow increases the slice's capacity, if necessary, to guarantee space for
107
516
  * another n elements. After Grow(n), at least n elements can be appended
@@ -146,12 +555,66 @@ export function Grow<T>(s: $.Slice<T>, n: number): $.Slice<T> {
146
555
  * @param s The slice to sort in place
147
556
  * @param cmp Comparison function
148
557
  */
149
- export function SortFunc<T>(s: $.Slice<T>, cmp: (a: T, b: T) => number): void {
558
+ export function SortFunc<T>(
559
+ s: $.Slice<T>,
560
+ cmp: CompareCallback<T>,
561
+ ): void {
562
+ if (cmp == null) {
563
+ throw new Error('slices.SortFunc: nil comparison function')
564
+ }
150
565
  if (s === null || s === undefined) {
151
566
  return
152
567
  }
153
568
  const arr = s as any as T[]
154
- arr.sort(cmp)
569
+ arr.sort((a, b) => syncNumber(cmp(a, b)))
570
+ }
571
+
572
+ export function IsSortedFunc<T>(
573
+ x: $.Slice<T>,
574
+ cmp: CompareCallback<T>,
575
+ ): boolean {
576
+ if (cmp == null) {
577
+ throw new Error('slices.IsSortedFunc: nil comparison function')
578
+ }
579
+ for (let i = $.len(x) - 1; i > 0; i--) {
580
+ if (syncNumber(cmp((x as any)[i] as T, (x as any)[i - 1] as T)) < 0) {
581
+ return false
582
+ }
583
+ }
584
+ return true
585
+ }
586
+
587
+ export function SortStableFunc<T>(
588
+ s: $.Slice<T>,
589
+ cmp: CompareCallback<T>,
590
+ ): void {
591
+ if (cmp == null) {
592
+ throw new Error('slices.SortStableFunc: nil comparison function')
593
+ }
594
+ if (s === null || s === undefined) {
595
+ return
596
+ }
597
+ ;(s as any as T[]).sort((a, b) => syncNumber(cmp(a, b)))
598
+ }
599
+
600
+ function clearValue<T>(s: $.Slice<T>): T | null {
601
+ if (s instanceof Uint8Array) {
602
+ return 0 as T
603
+ }
604
+ for (const value of s ?? []) {
605
+ if (value !== null && value !== undefined) {
606
+ switch (typeof value) {
607
+ case 'number':
608
+ return 0 as T
609
+ case 'string':
610
+ return '' as T
611
+ case 'boolean':
612
+ return false as T
613
+ }
614
+ break
615
+ }
616
+ }
617
+ return null
155
618
  }
156
619
 
157
620
  /**
@@ -169,14 +632,17 @@ export function SortFunc<T>(s: $.Slice<T>, cmp: (a: T, b: T) => number): void {
169
632
  export function BinarySearchFunc<E, T>(
170
633
  x: $.Slice<E>,
171
634
  target: T,
172
- cmp: (a: E, b: T) => number,
635
+ cmp: CompareCallback<E, T>,
173
636
  ): [number, boolean] {
637
+ if (cmp == null) {
638
+ throw new Error('slices.BinarySearchFunc: nil comparison function')
639
+ }
174
640
  let left = 0
175
641
  let right = $.len(x)
176
642
 
177
643
  while (left < right) {
178
644
  const mid = Math.floor((left + right) / 2)
179
- const result = cmp((x as any)[mid] as E, target)
645
+ const result = syncNumber(cmp((x as any)[mid] as E, target))
180
646
 
181
647
  if (result < 0) {
182
648
  left = mid + 1
@@ -189,3 +655,24 @@ export function BinarySearchFunc<E, T>(
189
655
 
190
656
  return [left, false]
191
657
  }
658
+
659
+ function syncNumber(value: SyncCallbackResult<number>): number {
660
+ if (value instanceof Promise) {
661
+ throw new Error('slices: asynchronous callback result is not supported')
662
+ }
663
+ return value
664
+ }
665
+
666
+ function syncBoolean(value: SyncCallbackResult<boolean>): boolean {
667
+ if (value instanceof Promise) {
668
+ throw new Error('slices: asynchronous callback result is not supported')
669
+ }
670
+ return value
671
+ }
672
+
673
+ export function BinarySearch<T extends cmp.Ordered>(
674
+ x: $.Slice<T>,
675
+ target: T,
676
+ ): [number, boolean] {
677
+ return BinarySearchFunc(x, target, cmp.Compare)
678
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "asyncFunctions": {
3
+ "Slice": true,
4
+ "SliceIsSorted": true,
5
+ "SliceStable": true
6
+ }
7
+ }