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.
- package/README.md +267 -255
- package/cmd/goscript/cmd-test.go +286 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +9 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +33 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -10
- package/compiler/config.go +2 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +69 -0
- package/compiler/gotest/request.go +210 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +1225 -0
- package/compiler/gotest/runner_test.go +1271 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +80 -21
- package/compiler/lowering.go +6754 -602
- package/compiler/override-facts.go +357 -0
- package/compiler/override-registry.go +52 -190
- package/compiler/override-registry_test.go +182 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +99 -9
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +129 -0
- package/compiler/package-test-graph.go +112 -0
- package/compiler/package-test-graph_test.go +202 -0
- package/compiler/runtime-contract.go +229 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +25 -6
- package/compiler/semantic-model.go +819 -74
- package/compiler/semantic-model_test.go +104 -0
- package/compiler/service.go +10 -4
- package/compiler/skeleton_test.go +2777 -524
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +342 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +576 -86
- package/compiler/wasm/compile.go +1 -1
- package/compiler/wasm/compile_test.go +61 -11
- package/compiler/wasm_api.go +172 -7
- package/dist/gs/builtin/builtin.d.ts +40 -3
- package/dist/gs/builtin/builtin.js +430 -22
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +32 -10
- package/dist/gs/builtin/channel.js +119 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +64 -10
- package/dist/gs/builtin/slice.js +619 -244
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +7 -2
- package/dist/gs/builtin/type.js +128 -29
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +7 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +74 -70
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +6 -5
- package/dist/gs/context/context.js +17 -12
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +4 -0
- package/dist/gs/encoding/json/index.js +33 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +108 -4
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +13 -0
- package/dist/gs/go/scanner/index.js +35 -0
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.d.ts +156 -0
- package/dist/gs/go/token/index.js +507 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +60 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +70 -48
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +52 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +30 -0
- package/dist/gs/net/http/httptest/index.js +101 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +131 -0
- package/dist/gs/net/http/index.js +307 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +8 -4
- package/dist/gs/path/filepath/path.js +192 -8
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +4 -3
- package/dist/gs/reflect/index.js +3 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +29 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +31 -9
- package/dist/gs/reflect/type.js +536 -43
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +41 -0
- package/dist/gs/runtime/debug/index.js +66 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +42 -8
- package/dist/gs/slices/slices.js +425 -11
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +60 -22
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +29 -19
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +8 -3
- package/dist/gs/sync/sync.js +66 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +117 -111
- package/dist/gs/syscall/errors.js +45 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +37 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +383 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +26 -1
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +78 -0
- package/dist/gs/testing/testing.js +318 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +227 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +76 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +8 -8
- package/go.sum +14 -14
- package/gs/builtin/builtin.ts +585 -27
- package/gs/builtin/channel.ts +183 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +383 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +785 -265
- package/gs/builtin/type.ts +160 -41
- package/gs/builtin/varRef.ts +40 -1
- package/gs/bytes/buffer.gs.ts +74 -70
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +71 -0
- package/gs/context/context.ts +30 -29
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +39 -3
- package/gs/encoding/json/index.ts +45 -3
- package/gs/errors/errors.test.ts +85 -0
- package/gs/errors/errors.ts +132 -4
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +55 -19
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +22 -0
- package/gs/go/scanner/index.ts +47 -0
- package/gs/go/token/index.test.ts +47 -1
- package/gs/go/token/index.ts +583 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +69 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +17 -9
- package/gs/io/io.ts +177 -31
- package/gs/io/meta.json +10 -2
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +75 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +13 -11
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +107 -64
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +60 -0
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +120 -0
- package/gs/net/http/index.test.ts +148 -0
- package/gs/net/http/index.ts +432 -0
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +96 -17
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +181 -3
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +80 -0
- package/gs/path/filepath/path.ts +244 -11
- package/gs/path/path.ts +20 -5
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +5 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +42 -1
- package/gs/reflect/map.ts +39 -0
- package/gs/reflect/type.ts +728 -65
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +45 -0
- package/gs/runtime/debug/index.ts +96 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +180 -0
- package/gs/slices/slices.ts +502 -15
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +85 -26
- package/gs/sort/slice.test.ts +40 -0
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +33 -20
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +69 -1
- package/gs/sync/sync.ts +72 -13
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +165 -112
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +485 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +111 -0
- package/gs/syscall/types.ts +63 -2
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +146 -0
- package/gs/testing/testing.ts +399 -0
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +110 -0
- package/gs/time/time.ts +309 -57
- package/gs/unicode/unicode.test.ts +36 -0
- package/gs/unicode/unicode.ts +115 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +98 -0
- package/package.json +3 -2
package/gs/sort/slice.gs.ts
CHANGED
|
@@ -8,44 +8,101 @@ interface SliceMetadata<T> {
|
|
|
8
8
|
capacity: number
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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(
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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(
|
|
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(
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
})
|
package/gs/sort/sort.gs.ts
CHANGED
|
@@ -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 =
|
|
100
|
+
const n = sortData.Len()
|
|
100
101
|
for (let i = 1; i < n; i++) {
|
|
101
|
-
for (let j = i; j > 0 &&
|
|
102
|
-
|
|
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
|
|
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 (
|
|
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: () =>
|
|
128
|
-
Less: (i: number, j: number) =>
|
|
129
|
-
Swap: (i: number, j: number) =>
|
|
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('')
|
package/gs/strings/builder.ts
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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:
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
+
builderValue(this).copyCheck()
|
|
106
|
+
const builder = builderValue(this)
|
|
107
|
+
builder._content += s
|
|
95
108
|
return [s.length, null]
|
|
96
109
|
}
|
|
97
110
|
|
package/gs/strings/iter.test.ts
CHANGED
|
@@ -124,13 +124,11 @@ describe('strings/iter', () => {
|
|
|
124
124
|
it('should handle unicode', () => {
|
|
125
125
|
const parts: string[] = []
|
|
126
126
|
const seq = SplitSeq('世界,你好', ',')
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
|
package/gs/strings/iter.ts
CHANGED
|
@@ -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 (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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 (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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 (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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 (
|
|
151
|
+
return (
|
|
152
|
+
_yield: ((p0: string) => iter.YieldResult) | null,
|
|
153
|
+
): void | globalThis.Promise<void> => {
|
|
109
154
|
let start = -1
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (
|
|
120
|
-
if (
|
|
121
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (
|
|
157
|
-
if (
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|