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/slices/slices.ts
CHANGED
|
@@ -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) =>
|
|
53
|
-
return function (
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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>(
|
|
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:
|
|
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
|
+
}
|