functionalscript 0.43.1 → 0.45.0
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 +53 -21
- package/fjs/asn.1/module.f.d.mts +123 -0
- package/fjs/asn.1/module.f.mjs +459 -0
- package/fjs/asn.1/proof.f.d.mts +53 -0
- package/fjs/asn.1/proof.f.mjs +321 -0
- package/fjs/asn.1/types.d.ts +37 -0
- package/fjs/asserts/module.f.d.mts +51 -0
- package/fjs/asserts/module.f.mjs +69 -0
- package/fjs/asserts/proof.f.d.mts +14 -0
- package/fjs/asserts/proof.f.mjs +33 -0
- package/fjs/asserts/types.d.ts +11 -0
- package/fjs/basen/base128/module.f.d.mts +22 -0
- package/fjs/basen/base128/module.f.mjs +51 -0
- package/fjs/basen/base128/proof.f.d.mts +4 -0
- package/fjs/basen/base128/proof.f.mjs +32 -0
- package/fjs/basen/base64/module.f.d.mts +14 -0
- package/fjs/basen/base64/module.f.mjs +75 -0
- package/fjs/basen/base64/proof.f.d.mts +19 -0
- package/fjs/basen/base64/proof.f.mjs +150 -0
- package/fjs/basen/cbase32/module.f.d.mts +18 -0
- package/fjs/basen/cbase32/module.f.mjs +61 -0
- package/fjs/basen/cbase32/proof.f.d.mts +10 -0
- package/fjs/basen/cbase32/proof.f.mjs +79 -0
- package/fjs/basen/module.f.d.mts +30 -0
- package/fjs/basen/module.f.mjs +88 -0
- package/fjs/basen/proof.f.mjs +69 -0
- package/fjs/basen/types.d.ts +14 -0
- package/fjs/bnf/data/module.f.d.mts +47 -0
- package/fjs/bnf/data/module.f.mjs +188 -0
- package/fjs/bnf/data/proof.f.d.mts +13 -0
- package/fjs/bnf/data/proof.f.mjs +159 -0
- package/fjs/bnf/data/types.d.ts +35 -0
- package/fjs/bnf/descent/module.f.d.mts +48 -0
- package/fjs/bnf/descent/module.f.mjs +289 -0
- package/fjs/bnf/descent/proof.f.d.mts +14 -0
- package/fjs/bnf/descent/proof.f.mjs +427 -0
- package/fjs/bnf/descent/types.d.ts +79 -0
- package/fjs/bnf/ll1/module.f.d.mts +67 -0
- package/fjs/bnf/ll1/module.f.mjs +341 -0
- package/fjs/bnf/ll1/proof.f.d.mts +18 -0
- package/fjs/bnf/ll1/proof.f.mjs +413 -0
- package/fjs/bnf/ll1/types.d.ts +65 -0
- package/fjs/bnf/module.f.d.mts +173 -0
- package/fjs/bnf/module.f.mjs +339 -0
- package/fjs/bnf/proof.f.d.mts +19 -0
- package/fjs/bnf/proof.f.mjs +165 -0
- package/fjs/bnf/testlib.f.d.mts +10 -0
- package/fjs/bnf/testlib.f.mjs +196 -0
- package/fjs/bnf/token_symbol/module.f.d.mts +36 -0
- package/fjs/bnf/token_symbol/module.f.mjs +63 -0
- package/fjs/bnf/token_symbol/proof.f.mjs +46 -0
- package/fjs/bnf/token_symbol/types.d.ts +27 -0
- package/fjs/bnf/types.d.ts +74 -0
- package/fjs/cas/cli/module.f.d.mts +17 -0
- package/fjs/cas/cli/module.f.mjs +73 -0
- package/fjs/cas/cli/proof.f.d.mts +20 -0
- package/fjs/cas/cli/proof.f.mjs +120 -0
- package/fjs/cas/evo/module.f.d.mts +157 -0
- package/fjs/cas/evo/module.f.mjs +563 -0
- package/fjs/cas/evo/proof.f.d.mts +55 -0
- package/fjs/cas/evo/proof.f.mjs +752 -0
- package/fjs/cas/evo/types.d.ts +111 -0
- package/fjs/cas/module.f.d.mts +68 -0
- package/fjs/cas/module.f.mjs +350 -0
- package/fjs/cas/proof.f.d.mts +29 -0
- package/fjs/cas/proof.f.mjs +371 -0
- package/fjs/cas/types.d.ts +35 -0
- package/fjs/ci/bun/module.f.d.mts +11 -0
- package/fjs/ci/bun/module.f.mjs +20 -0
- package/fjs/ci/common/module.f.d.mts +80 -0
- package/fjs/ci/common/module.f.mjs +88 -0
- package/fjs/ci/common/types.d.ts +27 -0
- package/fjs/ci/config/module.f.d.mts +45 -0
- package/fjs/ci/config/module.f.mjs +89 -0
- package/fjs/ci/deno/module.f.d.mts +16 -0
- package/fjs/ci/deno/module.f.mjs +29 -0
- package/fjs/ci/deno/proof.f.d.mts +4 -0
- package/fjs/ci/deno/proof.f.mjs +26 -0
- package/fjs/ci/module.f.d.mts +19 -0
- package/fjs/ci/module.f.mjs +89 -0
- package/fjs/ci/nix/module.f.d.mts +69 -0
- package/fjs/ci/nix/module.f.mjs +136 -0
- package/fjs/ci/nix/proof.f.d.mts +30 -0
- package/fjs/ci/nix/proof.f.mjs +146 -0
- package/fjs/ci/nix/types.d.ts +16 -0
- package/fjs/ci/node/module.f.d.mts +48 -0
- package/fjs/ci/node/module.f.mjs +139 -0
- package/fjs/ci/node/proof.f.mjs +18 -0
- package/fjs/ci/proof.f.d.mts +22 -0
- package/fjs/ci/proof.f.mjs +220 -0
- package/fjs/ci/rust/module.f.d.mts +15 -0
- package/fjs/ci/rust/module.f.mjs +108 -0
- package/fjs/ci/types.d.ts +9 -0
- package/fjs/cli/module.f.d.mts +16 -0
- package/fjs/cli/module.f.mjs +51 -0
- package/fjs/cli/proof.f.d.mts +18 -0
- package/fjs/cli/proof.f.mjs +132 -0
- package/fjs/cli/types.d.ts +15 -0
- package/fjs/common/monoid/module.f.d.mts +145 -0
- package/fjs/common/monoid/module.f.mjs +267 -0
- package/fjs/common/monoid/proof.f.d.mts +21 -0
- package/fjs/common/monoid/proof.f.mjs +142 -0
- package/fjs/common/monoid/types.d.ts +73 -0
- package/fjs/crypto/hmac/module.f.d.mts +32 -0
- package/fjs/crypto/hmac/module.f.mjs +65 -0
- package/fjs/crypto/hmac/proof.f.mjs +34 -0
- package/fjs/crypto/pow/module.f.d.mts +43 -0
- package/fjs/crypto/pow/module.f.mjs +93 -0
- package/fjs/crypto/pow/proof.f.mjs +121 -0
- package/fjs/crypto/pow/types.d.ts +19 -0
- package/fjs/crypto/secp/module.f.d.mts +61 -0
- package/fjs/crypto/secp/module.f.mjs +204 -0
- package/fjs/crypto/secp/proof.f.d.mts +11 -0
- package/fjs/crypto/secp/proof.f.mjs +139 -0
- package/fjs/crypto/secp/types.d.ts +36 -0
- package/fjs/crypto/sha2/module.f.d.mts +80 -0
- package/fjs/crypto/sha2/module.f.mjs +431 -0
- package/fjs/crypto/sha2/proof.f.d.mts +34 -0
- package/fjs/crypto/sha2/proof.f.mjs +146 -0
- package/fjs/crypto/sha2/types.d.ts +57 -0
- package/fjs/crypto/sign/module.f.d.mts +46 -0
- package/fjs/crypto/sign/module.f.mjs +189 -0
- package/fjs/crypto/sign/proof.f.d.mts +17 -0
- package/fjs/crypto/sign/proof.f.mjs +604 -0
- package/fjs/crypto/sign/types.d.ts +13 -0
- package/fjs/crypto/vdf/module.f.d.mts +34 -0
- package/fjs/crypto/vdf/module.f.mjs +86 -0
- package/fjs/crypto/vdf/proof.f.mjs +106 -0
- package/fjs/crypto/vdf/types.d.ts +18 -0
- package/fjs/dev/module.f.d.mts +59 -0
- package/fjs/dev/module.f.mjs +171 -0
- package/fjs/dev/package_json/module.f.d.mts +39 -0
- package/fjs/dev/package_json/module.f.mjs +40 -0
- package/fjs/dev/package_json/proof.f.mjs +32 -0
- package/fjs/dev/proof.f.d.mts +13 -0
- package/fjs/dev/proof.f.mjs +78 -0
- package/fjs/dev/types.d.ts +14 -0
- package/fjs/dev/update/module.f.d.mts +22 -0
- package/fjs/dev/update/module.f.mjs +37 -0
- package/fjs/dev/update/proof.f.d.mts +10 -0
- package/fjs/dev/update/proof.f.mjs +35 -0
- package/fjs/djs/ast/module.f.d.mts +35 -0
- package/fjs/djs/ast/module.f.mjs +82 -0
- package/fjs/djs/ast/proof.f.mjs +48 -0
- package/fjs/djs/ast/types.d.ts +54 -0
- package/fjs/djs/examples/input.f.mjs +4 -0
- package/fjs/djs/examples/m.f.mjs +1 -0
- package/fjs/djs/module.f.d.mts +17 -0
- package/fjs/djs/module.f.mjs +47 -0
- package/fjs/djs/parser/module.f.d.mts +78 -0
- package/fjs/djs/parser/module.f.mjs +565 -0
- package/fjs/djs/parser/proof.f.d.mts +17 -0
- package/fjs/djs/parser/proof.f.mjs +555 -0
- package/fjs/djs/parser/types.d.ts +11 -0
- package/fjs/djs/proof.f.d.mts +13 -0
- package/fjs/djs/proof.f.mjs +55 -0
- package/fjs/djs/serializer/module.f.d.mts +30 -0
- package/fjs/djs/serializer/module.f.mjs +207 -0
- package/fjs/djs/serializer/proof.f.mjs +116 -0
- package/fjs/djs/tokenizer/module.f.d.mts +65 -0
- package/fjs/djs/tokenizer/module.f.mjs +632 -0
- package/fjs/djs/tokenizer/proof.f.d.mts +17 -0
- package/fjs/djs/tokenizer/proof.f.mjs +992 -0
- package/fjs/djs/tokenizer/types.d.ts +20 -0
- package/fjs/djs/transpiler/module.f.d.mts +33 -0
- package/fjs/djs/transpiler/module.f.mjs +122 -0
- package/fjs/djs/transpiler/proof.f.mjs +76 -0
- package/fjs/djs/transpiler/types.d.ts +25 -0
- package/fjs/djs/types.d.ts +13 -0
- package/fjs/effects/eff/module.f.d.mts +20 -0
- package/fjs/effects/eff/module.f.mjs +70 -0
- package/fjs/effects/eff/proof.f.d.mts +15 -0
- package/fjs/effects/eff/proof.f.mjs +69 -0
- package/fjs/effects/eff/types.d.ts +71 -0
- package/fjs/effects/list/module.f.d.mts +32 -0
- package/fjs/effects/list/module.f.mjs +36 -0
- package/fjs/effects/list/types.d.ts +26 -0
- package/fjs/effects/memory/module.f.d.mts +34 -0
- package/fjs/effects/memory/module.f.mjs +45 -0
- package/fjs/effects/memory/proof.f.d.mts +16 -0
- package/fjs/effects/memory/proof.f.mjs +86 -0
- package/fjs/effects/memory/types.d.ts +18 -0
- package/fjs/effects/mock/module.f.d.mts +14 -0
- package/fjs/effects/mock/module.f.mjs +28 -0
- package/fjs/effects/mock/types.d.ts +15 -0
- package/fjs/effects/module.d.mts +15 -0
- package/fjs/effects/module.f.d.mts +352 -0
- package/fjs/effects/module.f.mjs +383 -0
- package/fjs/effects/module.mjs +26 -0
- package/fjs/effects/node/memory/module.d.mts +27 -0
- package/fjs/effects/node/memory/module.mjs +60 -0
- package/fjs/effects/node/memory/proof.d.mts +12 -0
- package/fjs/effects/node/memory/proof.mjs +44 -0
- package/fjs/effects/node/module.d.mts +59 -0
- package/fjs/effects/node/module.f.d.mts +177 -0
- package/fjs/effects/node/module.f.mjs +348 -0
- package/fjs/effects/node/module.mjs +381 -0
- package/fjs/effects/node/proof.f.d.mts +76 -0
- package/fjs/effects/node/proof.f.mjs +444 -0
- package/fjs/effects/node/types.d.ts +203 -0
- package/fjs/effects/node/virtual/module.f.d.mts +34 -0
- package/fjs/effects/node/virtual/module.f.mjs +435 -0
- package/fjs/effects/node/virtual/proof.f.d.mts +38 -0
- package/fjs/effects/node/virtual/proof.f.mjs +238 -0
- package/fjs/effects/node/virtual/types.d.ts +39 -0
- package/fjs/effects/proof.f.d.mts +65 -0
- package/fjs/effects/proof.f.mjs +234 -0
- package/fjs/effects/types.d.ts +115 -0
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/example.f.d.mts +16 -0
- package/fjs/emergent_testing/example.f.mjs +34 -0
- package/fjs/emergent_testing/module.f.d.mts +155 -0
- package/fjs/emergent_testing/module.f.mjs +388 -0
- package/fjs/emergent_testing/proof.f.d.mts +97 -0
- package/fjs/emergent_testing/proof.f.mjs +518 -0
- package/fjs/emergent_testing/types.d.ts +53 -0
- package/fjs/fsc/bnf.f.d.mts +6 -0
- package/fjs/fsc/bnf.f.mjs +80 -0
- package/fjs/fsc/json.f.d.mts +16 -0
- package/fjs/fsc/json.f.mjs +127 -0
- package/fjs/fsc/module.f.d.mts +23 -0
- package/fjs/fsc/module.f.mjs +140 -0
- package/fjs/fsc/proof.f.mjs +119 -0
- package/fjs/fsm/module.f.d.mts +27 -0
- package/fjs/fsm/module.f.mjs +99 -0
- package/fjs/fsm/proof.f.d.mts +7 -0
- package/fjs/fsm/proof.f.mjs +149 -0
- package/fjs/js/tokenizer/module.f.d.mts +26 -0
- package/fjs/js/tokenizer/module.f.mjs +759 -0
- package/fjs/js/tokenizer/proof.f.d.mts +12 -0
- package/fjs/js/tokenizer/proof.f.mjs +681 -0
- package/fjs/js/tokenizer/types.d.ts +193 -0
- package/fjs/mcp/cas/module.f.d.mts +156 -0
- package/fjs/mcp/cas/module.f.mjs +302 -0
- package/fjs/mcp/evo/module.f.d.mts +88 -0
- package/fjs/mcp/evo/module.f.mjs +153 -0
- package/fjs/mcp/evo/proof.f.d.mts +17 -0
- package/fjs/mcp/evo/proof.f.mjs +166 -0
- package/fjs/mcp/module.f.d.mts +67 -0
- package/fjs/mcp/module.f.mjs +98 -0
- package/fjs/mcp/proof.f.d.mts +56 -0
- package/fjs/mcp/proof.f.mjs +718 -0
- package/fjs/media/html/module.f.d.mts +55 -0
- package/fjs/media/html/module.f.mjs +169 -0
- package/fjs/media/html/proof.f.d.mts +19 -0
- package/fjs/media/html/proof.f.mjs +80 -0
- package/fjs/media/html/types.d.ts +19 -0
- package/fjs/media/json/module.f.d.mts +48 -0
- package/fjs/media/json/module.f.mjs +104 -0
- package/fjs/media/json/parser/module.f.d.mts +30 -0
- package/fjs/media/json/parser/module.f.mjs +236 -0
- package/fjs/media/json/parser/proof.f.d.mts +8 -0
- package/fjs/media/json/parser/proof.f.mjs +314 -0
- package/fjs/media/json/parser/types.d.ts +39 -0
- package/fjs/media/json/proof.f.mjs +79 -0
- package/fjs/media/json/rtti/module.f.d.mts +38 -0
- package/fjs/media/json/rtti/module.f.mjs +51 -0
- package/fjs/media/json/rtti/proof.f.d.mts +29 -0
- package/fjs/media/json/rtti/proof.f.mjs +86 -0
- package/fjs/media/json/schema/module.f.d.mts +113 -0
- package/fjs/media/json/schema/module.f.mjs +309 -0
- package/fjs/media/json/schema/proof.f.d.mts +81 -0
- package/fjs/media/json/schema/proof.f.mjs +305 -0
- package/fjs/media/json/serializer/module.f.d.mts +40 -0
- package/fjs/media/json/serializer/module.f.mjs +131 -0
- package/fjs/media/json/serializer/proof.f.mjs +92 -0
- package/fjs/media/json/tokenizer/module.f.d.mts +25 -0
- package/fjs/media/json/tokenizer/module.f.mjs +96 -0
- package/fjs/media/json/tokenizer/proof.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +291 -0
- package/fjs/media/json/tokenizer/types.d.ts +17 -0
- package/fjs/media/json/types.d.ts +25 -0
- package/fjs/media/module.f.d.mts +116 -0
- package/fjs/media/module.f.mjs +152 -0
- package/fjs/media/nix/module.f.d.mts +27 -0
- package/fjs/media/nix/module.f.mjs +263 -0
- package/fjs/media/nix/proof.f.d.mts +35 -0
- package/fjs/media/nix/proof.f.mjs +184 -0
- package/fjs/media/nix/types.d.ts +22 -0
- package/fjs/media/proof.f.d.mts +19 -0
- package/fjs/media/proof.f.mjs +159 -0
- package/fjs/media/revision/module.f.d.mts +124 -0
- package/fjs/media/revision/module.f.mjs +163 -0
- package/fjs/media/revision/proof.f.d.mts +46 -0
- package/fjs/media/revision/proof.f.mjs +231 -0
- package/fjs/media/revision/types.d.ts +16 -0
- package/fjs/media/rust/module.f.d.mts +61 -0
- package/fjs/media/rust/module.f.mjs +93 -0
- package/fjs/media/rust/proof.f.d.mts +17 -0
- package/fjs/media/rust/proof.f.mjs +50 -0
- package/fjs/media/type/module.f.d.mts +114 -0
- package/fjs/media/type/module.f.mjs +265 -0
- package/fjs/media/type/proof.f.d.mts +56 -0
- package/fjs/media/type/proof.f.mjs +325 -0
- package/fjs/media/type/types.d.ts +67 -0
- package/fjs/media/types.d.ts +26 -0
- package/fjs/module.d.mts +7 -0
- package/fjs/module.f.d.mts +11 -0
- package/fjs/module.f.mjs +62 -0
- package/fjs/module.mjs +12 -0
- package/fjs/nanvm/module.f.d.mts +54 -0
- package/fjs/nanvm/module.f.mjs +240 -0
- package/fjs/nanvm/proof.f.d.mts +41 -0
- package/fjs/nanvm/proof.f.mjs +173 -0
- package/fjs/nanvm/rust/module.f.d.mts +54 -0
- package/fjs/nanvm/rust/module.f.mjs +166 -0
- package/fjs/nanvm/rust/proof.f.d.mts +21 -0
- package/fjs/nanvm/rust/proof.f.mjs +119 -0
- package/fjs/nanvm/types.d.ts +105 -0
- package/fjs/nanvm/update/module.f.d.mts +23 -0
- package/fjs/nanvm/update/module.f.mjs +33 -0
- package/fjs/nanvm/update/proof.f.d.mts +9 -0
- package/fjs/nanvm/update/proof.f.mjs +32 -0
- package/fjs/path/module.f.d.mts +63 -0
- package/fjs/path/module.f.mjs +98 -0
- package/fjs/path/proof.f.mjs +125 -0
- package/fjs/proof.f.d.mts +13 -0
- package/fjs/proof.f.mjs +51 -0
- package/fjs/protocol/json_rpc/module.f.d.mts +127 -0
- package/fjs/protocol/json_rpc/module.f.mjs +115 -0
- package/fjs/protocol/json_rpc/proof.f.d.mts +41 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +105 -0
- package/fjs/protocol/json_rpc/types.d.ts +30 -0
- package/fjs/protocol/mcp/module.f.d.mts +227 -0
- package/fjs/protocol/mcp/module.f.mjs +369 -0
- package/fjs/protocol/mcp/proof.f.d.mts +57 -0
- package/fjs/protocol/mcp/proof.f.mjs +335 -0
- package/fjs/protocol/mcp/stdio/module.f.d.mts +50 -0
- package/fjs/protocol/mcp/stdio/module.f.mjs +125 -0
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +20 -0
- package/fjs/protocol/mcp/stdio/proof.f.mjs +190 -0
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +59 -0
- package/fjs/sul/id/module.f.d.mts +42 -0
- package/fjs/sul/id/module.f.mjs +144 -0
- package/fjs/sul/id/proof.f.mjs +72 -0
- package/fjs/sul/id/types.d.ts +8 -0
- package/fjs/sul/level/hash/module.f.d.mts +40 -0
- package/fjs/sul/level/hash/module.f.mjs +62 -0
- package/fjs/sul/level/hash/proof.f.d.mts +19 -0
- package/fjs/sul/level/hash/proof.f.mjs +134 -0
- package/fjs/sul/level/hash/types.d.ts +20 -0
- package/fjs/sul/level/literal/module.f.d.mts +57 -0
- package/fjs/sul/level/literal/module.f.mjs +121 -0
- package/fjs/sul/level/literal/proof.f.d.mts +15 -0
- package/fjs/sul/level/literal/proof.f.mjs +791 -0
- package/fjs/sul/level/literal/types.d.ts +31 -0
- package/fjs/sul/module.f.d.mts +27 -0
- package/fjs/sul/module.f.mjs +70 -0
- package/fjs/sul/proof.f.d.mts +15 -0
- package/fjs/sul/proof.f.mjs +65 -0
- package/fjs/sul/types.d.ts +19 -0
- package/fjs/text/ascii/module.f.d.mts +162 -0
- package/fjs/text/ascii/module.f.mjs +272 -0
- package/fjs/text/ascii/proof.f.d.mts +16 -0
- package/fjs/text/ascii/proof.f.mjs +48 -0
- package/fjs/text/code_point/module.f.d.mts +92 -0
- package/fjs/text/code_point/module.f.mjs +155 -0
- package/fjs/text/code_point/proof.f.d.mts +9 -0
- package/fjs/text/code_point/proof.f.mjs +108 -0
- package/fjs/text/module.f.d.mts +41 -0
- package/fjs/text/module.f.mjs +62 -0
- package/fjs/text/proof.f.d.mts +13 -0
- package/fjs/text/proof.f.mjs +51 -0
- package/fjs/text/sgr/module.f.d.mts +61 -0
- package/fjs/text/sgr/module.f.mjs +100 -0
- package/fjs/text/sgr/proof.f.d.mts +4 -0
- package/fjs/text/sgr/proof.f.mjs +42 -0
- package/fjs/text/sgr/types.d.ts +12 -0
- package/fjs/text/types.d.ts +13 -0
- package/fjs/text/utf16/module.f.d.mts +151 -0
- package/fjs/text/utf16/module.f.mjs +348 -0
- package/fjs/text/utf16/proof.f.d.mts +13 -0
- package/fjs/text/utf16/proof.f.mjs +175 -0
- package/fjs/text/utf16/types.d.ts +19 -0
- package/fjs/text/utf8/module.f.d.mts +73 -0
- package/fjs/text/utf8/module.f.mjs +278 -0
- package/fjs/text/utf8/proof.f.mjs +217 -0
- package/fjs/text/utf8/types.d.ts +26 -0
- package/fjs/types/array/module.f.d.mts +69 -0
- package/fjs/types/array/module.f.mjs +101 -0
- package/fjs/types/array/proof.f.mjs +98 -0
- package/fjs/types/array/types.d.ts +13 -0
- package/fjs/types/bigfloat/module.f.d.mts +34 -0
- package/fjs/types/bigfloat/module.f.mjs +125 -0
- package/fjs/types/bigfloat/proof.f.d.mts +6 -0
- package/fjs/types/bigfloat/proof.f.mjs +264 -0
- package/fjs/types/bigfloat/types.d.ts +6 -0
- package/fjs/types/bigint/benchmark.mjs +205 -0
- package/fjs/types/bigint/module.f.d.mts +180 -0
- package/fjs/types/bigint/module.f.mjs +290 -0
- package/fjs/types/bigint/proof.f.d.mts +39 -0
- package/fjs/types/bigint/proof.f.mjs +443 -0
- package/fjs/types/bigint/types.d.ts +14 -0
- package/fjs/types/bit_vec/module.f.d.mts +195 -0
- package/fjs/types/bit_vec/module.f.mjs +475 -0
- package/fjs/types/bit_vec/proof.f.d.mts +71 -0
- package/fjs/types/bit_vec/proof.f.mjs +521 -0
- package/fjs/types/bit_vec/types.d.ts +51 -0
- package/fjs/types/btree/find/module.f.d.mts +19 -0
- package/fjs/types/btree/find/module.f.mjs +80 -0
- package/fjs/types/btree/find/proof.f.d.mts +8 -0
- package/fjs/types/btree/find/proof.f.mjs +123 -0
- package/fjs/types/btree/find/types.d.ts +22 -0
- package/fjs/types/btree/module.f.d.mts +13 -0
- package/fjs/types/btree/module.f.mjs +40 -0
- package/fjs/types/btree/proof.f.d.mts +18 -0
- package/fjs/types/btree/proof.f.mjs +87 -0
- package/fjs/types/btree/remove/module.f.d.mts +32 -0
- package/fjs/types/btree/remove/module.f.mjs +187 -0
- package/fjs/types/btree/remove/proof.f.d.mts +12 -0
- package/fjs/types/btree/remove/proof.f.mjs +475 -0
- package/fjs/types/btree/set/module.f.d.mts +14 -0
- package/fjs/types/btree/set/module.f.mjs +116 -0
- package/fjs/types/btree/set/proof.f.d.mts +4 -0
- package/fjs/types/btree/set/proof.f.mjs +430 -0
- package/fjs/types/btree/types/module.f.d.mts +20 -0
- package/fjs/types/btree/types/module.f.mjs +20 -0
- package/fjs/types/btree/types/types.d.ts +14 -0
- package/fjs/types/byte_set/module.f.d.mts +35 -0
- package/fjs/types/byte_set/module.f.mjs +68 -0
- package/fjs/types/byte_set/proof.f.d.mts +14 -0
- package/fjs/types/byte_set/proof.f.mjs +86 -0
- package/fjs/types/byte_set/types.d.ts +6 -0
- package/fjs/types/function/compare/module.f.d.mts +45 -0
- package/fjs/types/function/compare/module.f.mjs +72 -0
- package/fjs/types/function/compare/proof.f.mjs +50 -0
- package/fjs/types/function/compare/types.d.ts +22 -0
- package/fjs/types/function/module.f.d.mts +33 -0
- package/fjs/types/function/module.f.mjs +39 -0
- package/fjs/types/function/operator/module.f.d.mts +38 -0
- package/fjs/types/function/operator/module.f.mjs +55 -0
- package/fjs/types/function/operator/proof.f.mjs +76 -0
- package/fjs/types/function/operator/types.d.ts +39 -0
- package/fjs/types/function/proof.f.mjs +16 -0
- package/fjs/types/function/types.d.ts +16 -0
- package/fjs/types/list/module.f.d.mts +95 -0
- package/fjs/types/list/module.f.mjs +311 -0
- package/fjs/types/list/proof.f.d.mts +35 -0
- package/fjs/types/list/proof.f.mjs +365 -0
- package/fjs/types/list/types.d.ts +36 -0
- package/fjs/types/map/module.f.d.mts +13 -0
- package/fjs/types/map/module.f.mjs +42 -0
- package/fjs/types/map/proof.f.mjs +25 -0
- package/fjs/types/nibble_set/module.f.d.mts +31 -0
- package/fjs/types/nibble_set/module.f.mjs +43 -0
- package/fjs/types/nibble_set/proof.f.mjs +59 -0
- package/fjs/types/nibble_set/types.d.ts +9 -0
- package/fjs/types/nominal/module.f.d.mts +10 -0
- package/fjs/types/nominal/module.f.mjs +17 -0
- package/fjs/types/nominal/proof.f.d.mts +7 -0
- package/fjs/types/nominal/proof.f.mjs +79 -0
- package/fjs/types/nominal/types.d.ts +25 -0
- package/fjs/types/nullable/module.f.d.mts +44 -0
- package/fjs/types/nullable/module.f.mjs +55 -0
- package/fjs/types/nullable/proof.f.mjs +34 -0
- package/fjs/types/nullable/types.d.ts +6 -0
- package/fjs/types/number/module.f.d.mts +27 -0
- package/fjs/types/number/module.f.mjs +56 -0
- package/fjs/types/number/proof.f.mjs +204 -0
- package/fjs/types/object/module.f.d.mts +45 -0
- package/fjs/types/object/module.f.mjs +67 -0
- package/fjs/types/object/proof.f.d.mts +28 -0
- package/fjs/types/object/proof.f.mjs +29 -0
- package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
- package/fjs/types/object/structurally_same/module.f.mjs +59 -0
- package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
- package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
- package/fjs/types/object/types.d.ts +50 -0
- package/fjs/types/ordered_map/module.f.d.mts +26 -0
- package/fjs/types/ordered_map/module.f.mjs +55 -0
- package/fjs/types/ordered_map/proof.f.d.mts +8 -0
- package/fjs/types/ordered_map/proof.f.mjs +91 -0
- package/fjs/types/ordered_map/types.d.ts +8 -0
- package/fjs/types/patricia_trie/module.f.d.mts +20 -0
- package/fjs/types/patricia_trie/module.f.mjs +43 -0
- package/fjs/types/patricia_trie/proof.f.d.mts +17 -0
- package/fjs/types/patricia_trie/proof.f.mjs +151 -0
- package/fjs/types/patricia_trie/types.d.ts +34 -0
- package/fjs/types/prime_field/module.f.d.mts +44 -0
- package/fjs/types/prime_field/module.f.mjs +137 -0
- package/fjs/types/prime_field/proof.f.mjs +131 -0
- package/fjs/types/prime_field/types.d.ts +38 -0
- package/fjs/types/range/module.f.d.mts +12 -0
- package/fjs/types/range/module.f.mjs +13 -0
- package/fjs/types/range/proof.f.mjs +10 -0
- package/fjs/types/range/types.d.ts +6 -0
- package/fjs/types/range_map/module.f.d.mts +78 -0
- package/fjs/types/range_map/module.f.mjs +127 -0
- package/fjs/types/range_map/proof.f.d.mts +11 -0
- package/fjs/types/range_map/proof.f.mjs +188 -0
- package/fjs/types/range_map/types.d.ts +56 -0
- package/fjs/types/range_set/module.f.d.mts +10 -0
- package/fjs/types/range_set/module.f.mjs +20 -0
- package/fjs/types/range_set/proof.f.d.mts +4 -0
- package/fjs/types/range_set/proof.f.mjs +29 -0
- package/fjs/types/result/module.d.mts +13 -0
- package/fjs/types/result/module.f.d.mts +89 -0
- package/fjs/types/result/module.f.mjs +97 -0
- package/fjs/types/result/module.mjs +30 -0
- package/fjs/types/result/proof.f.d.mts +17 -0
- package/fjs/types/result/proof.f.mjs +61 -0
- package/fjs/types/result/types.d.ts +17 -0
- package/fjs/types/rtti/common/module.f.d.mts +119 -0
- package/fjs/types/rtti/common/module.f.mjs +185 -0
- package/fjs/types/rtti/common/proof.f.d.mts +13 -0
- package/fjs/types/rtti/common/proof.f.mjs +67 -0
- package/fjs/types/rtti/common/types.d.ts +43 -0
- package/fjs/types/rtti/data/module.f.d.mts +120 -0
- package/fjs/types/rtti/data/module.f.mjs +1030 -0
- package/fjs/types/rtti/data/proof.f.d.mts +75 -0
- package/fjs/types/rtti/data/proof.f.mjs +566 -0
- package/fjs/types/rtti/data/types.d.ts +83 -0
- package/fjs/types/rtti/module.f.d.mts +83 -0
- package/fjs/types/rtti/module.f.mjs +112 -0
- package/fjs/types/rtti/parse/module.f.d.mts +47 -0
- package/fjs/types/rtti/parse/module.f.mjs +198 -0
- package/fjs/types/rtti/parse/proof.f.d.mts +122 -0
- package/fjs/types/rtti/parse/proof.f.mjs +343 -0
- package/fjs/types/rtti/parse/types.d.ts +12 -0
- package/fjs/types/rtti/proof.f.d.mts +10 -0
- package/fjs/types/rtti/proof.f.mjs +22 -0
- package/fjs/types/rtti/ts/module.f.d.mts +93 -0
- package/fjs/types/rtti/ts/module.f.mjs +296 -0
- package/fjs/types/rtti/ts/proof.f.d.mts +103 -0
- package/fjs/types/rtti/ts/proof.f.mjs +236 -0
- package/fjs/types/rtti/ts/types.d.ts +99 -0
- package/fjs/types/rtti/types.d.ts +83 -0
- package/fjs/types/rtti/validate/module.f.d.mts +41 -0
- package/fjs/types/rtti/validate/module.f.mjs +171 -0
- package/fjs/types/rtti/validate/proof.f.d.mts +125 -0
- package/fjs/types/rtti/validate/proof.f.mjs +437 -0
- package/fjs/types/rtti/validate/types.d.ts +6 -0
- package/fjs/types/sorted_list/module.f.d.mts +46 -0
- package/fjs/types/sorted_list/module.f.mjs +119 -0
- package/fjs/types/sorted_list/proof.f.d.mts +7 -0
- package/fjs/types/sorted_list/proof.f.mjs +54 -0
- package/fjs/types/sorted_list/types.d.ts +15 -0
- package/fjs/types/sorted_set/module.f.d.mts +54 -0
- package/fjs/types/sorted_set/module.f.mjs +58 -0
- package/fjs/types/sorted_set/proof.f.d.mts +9 -0
- package/fjs/types/sorted_set/proof.f.mjs +79 -0
- package/fjs/types/sorted_set/types.d.ts +6 -0
- package/fjs/types/string/module.f.d.mts +40 -0
- package/fjs/types/string/module.f.mjs +59 -0
- package/fjs/types/string/proof.f.mjs +76 -0
- package/fjs/types/string_set/module.f.d.mts +39 -0
- package/fjs/types/string_set/module.f.mjs +54 -0
- package/fjs/types/string_set/proof.f.mjs +46 -0
- package/fjs/types/string_set/types.d.ts +7 -0
- package/fjs/types/ts/module.f.d.mts +22 -0
- package/fjs/types/ts/module.f.mjs +51 -0
- package/fjs/types/ts/proof.f.d.mts +39 -0
- package/fjs/types/ts/proof.f.mjs +102 -0
- package/fjs/types/ts/types.d.ts +21 -0
- package/fjs/types/uint8array/module.f.d.mts +42 -0
- package/fjs/types/uint8array/module.f.mjs +58 -0
- package/fjs/types/uint8array/proof.f.d.mts +17 -0
- package/fjs/types/uint8array/proof.f.mjs +73 -0
- package/fjs/website/module.f.d.mts +11 -0
- package/fjs/website/module.f.mjs +25 -0
- package/fjs/website/proof.f.mjs +14 -0
- package/package.json +12 -10
- package/todo/proof.f.d.mts +22 -0
- package/todo/proof.f.mjs +59 -0
- package/fjs/asn.1/module.f.d.ts +0 -62
- package/fjs/asn.1/module.f.js +0 -278
- package/fjs/asn.1/proof.f.d.ts +0 -48
- package/fjs/asn.1/proof.f.js +0 -285
- package/fjs/asserts/module.f.d.ts +0 -36
- package/fjs/asserts/module.f.js +0 -39
- package/fjs/asserts/proof.f.d.ts +0 -11
- package/fjs/asserts/proof.f.js +0 -18
- package/fjs/base_n/module.f.d.ts +0 -45
- package/fjs/base_n/module.f.js +0 -72
- package/fjs/base_n/proof.f.js +0 -73
- package/fjs/basen/base128/module.f.d.ts +0 -20
- package/fjs/basen/base128/module.f.js +0 -43
- package/fjs/basen/base128/proof.f.js +0 -26
- package/fjs/basen/base64/module.f.d.ts +0 -9
- package/fjs/basen/base64/module.f.js +0 -71
- package/fjs/basen/base64/proof.f.d.ts +0 -16
- package/fjs/basen/base64/proof.f.js +0 -139
- package/fjs/basen/cbase32/module.f.d.ts +0 -11
- package/fjs/basen/cbase32/module.f.js +0 -55
- package/fjs/basen/cbase32/proof.f.d.ts +0 -7
- package/fjs/basen/cbase32/proof.f.js +0 -62
- package/fjs/bnf/data/module.f.d.ts +0 -52
- package/fjs/bnf/data/module.f.js +0 -143
- package/fjs/bnf/data/proof.f.d.ts +0 -8
- package/fjs/bnf/data/proof.f.js +0 -169
- package/fjs/bnf/descent/module.f.d.ts +0 -87
- package/fjs/bnf/descent/module.f.js +0 -149
- package/fjs/bnf/descent/proof.f.d.ts +0 -7
- package/fjs/bnf/descent/proof.f.js +0 -368
- package/fjs/bnf/ll1/module.f.d.ts +0 -72
- package/fjs/bnf/ll1/module.f.js +0 -155
- package/fjs/bnf/ll1/proof.f.d.ts +0 -10
- package/fjs/bnf/ll1/proof.f.js +0 -375
- package/fjs/bnf/module.f.d.ts +0 -165
- package/fjs/bnf/module.f.js +0 -174
- package/fjs/bnf/proof.f.d.ts +0 -12
- package/fjs/bnf/proof.f.js +0 -69
- package/fjs/bnf/testlib.f.d.ts +0 -3
- package/fjs/bnf/testlib.f.js +0 -138
- package/fjs/bnf/token_symbol/module.f.d.ts +0 -38
- package/fjs/bnf/token_symbol/module.f.js +0 -48
- package/fjs/bnf/token_symbol/proof.f.js +0 -37
- package/fjs/cas/cli/module.f.d.ts +0 -6
- package/fjs/cas/cli/module.f.js +0 -53
- package/fjs/cas/cli/proof.f.d.ts +0 -17
- package/fjs/cas/cli/proof.f.js +0 -112
- package/fjs/cas/evo/module.f.d.ts +0 -223
- package/fjs/cas/evo/module.f.js +0 -455
- package/fjs/cas/evo/proof.f.d.ts +0 -47
- package/fjs/cas/evo/proof.f.js +0 -707
- package/fjs/cas/module.f.d.ts +0 -64
- package/fjs/cas/module.f.js +0 -255
- package/fjs/cas/proof.f.d.ts +0 -18
- package/fjs/cas/proof.f.js +0 -305
- package/fjs/ci/bun/module.f.d.ts +0 -2
- package/fjs/ci/bun/module.f.js +0 -15
- package/fjs/ci/common/module.f.d.ts +0 -88
- package/fjs/ci/common/module.f.js +0 -63
- package/fjs/ci/config/module.f.d.ts +0 -45
- package/fjs/ci/config/module.f.js +0 -80
- package/fjs/ci/deno/module.f.d.ts +0 -10
- package/fjs/ci/deno/module.f.js +0 -28
- package/fjs/ci/deno/proof.f.d.ts +0 -5
- package/fjs/ci/deno/proof.f.js +0 -26
- package/fjs/ci/module.f.d.ts +0 -13
- package/fjs/ci/module.f.js +0 -58
- package/fjs/ci/nix/module.f.d.ts +0 -61
- package/fjs/ci/nix/module.f.js +0 -92
- package/fjs/ci/nix/proof.f.d.ts +0 -23
- package/fjs/ci/nix/proof.f.js +0 -109
- package/fjs/ci/node/module.f.d.ts +0 -28
- package/fjs/ci/node/module.f.js +0 -92
- package/fjs/ci/node/proof.f.js +0 -17
- package/fjs/ci/proof.f.d.ts +0 -18
- package/fjs/ci/proof.f.js +0 -182
- package/fjs/ci/rust/module.f.d.ts +0 -3
- package/fjs/ci/rust/module.f.js +0 -75
- package/fjs/cli/module.f.d.ts +0 -11
- package/fjs/cli/module.f.js +0 -34
- package/fjs/cli/proof.f.d.ts +0 -14
- package/fjs/cli/proof.f.js +0 -111
- package/fjs/common/monoid/module.f.d.ts +0 -126
- package/fjs/common/monoid/module.f.js +0 -88
- package/fjs/common/monoid/proof.f.d.ts +0 -9
- package/fjs/common/monoid/proof.f.js +0 -48
- package/fjs/crypto/hmac/module.f.d.ts +0 -29
- package/fjs/crypto/hmac/module.f.js +0 -56
- package/fjs/crypto/hmac/proof.f.js +0 -32
- package/fjs/crypto/pow/module.f.d.ts +0 -37
- package/fjs/crypto/pow/module.f.js +0 -72
- package/fjs/crypto/pow/proof.f.js +0 -111
- package/fjs/crypto/secp/module.f.d.ts +0 -85
- package/fjs/crypto/secp/module.f.js +0 -176
- package/fjs/crypto/secp/proof.f.d.ts +0 -8
- package/fjs/crypto/secp/proof.f.js +0 -124
- package/fjs/crypto/sha2/module.f.d.ts +0 -102
- package/fjs/crypto/sha2/module.f.js +0 -266
- package/fjs/crypto/sha2/proof.f.d.ts +0 -31
- package/fjs/crypto/sha2/proof.f.js +0 -139
- package/fjs/crypto/sign/module.f.d.ts +0 -33
- package/fjs/crypto/sign/module.f.js +0 -163
- package/fjs/crypto/sign/proof.f.d.ts +0 -11
- package/fjs/crypto/sign/proof.f.js +0 -562
- package/fjs/crypto/vdf/module.f.d.ts +0 -21
- package/fjs/crypto/vdf/module.f.js +0 -57
- package/fjs/crypto/vdf/proof.f.js +0 -94
- package/fjs/dev/module.f.d.ts +0 -57
- package/fjs/dev/module.f.js +0 -135
- package/fjs/dev/package_json/module.f.d.ts +0 -16
- package/fjs/dev/package_json/module.f.js +0 -24
- package/fjs/dev/package_json/proof.f.js +0 -28
- package/fjs/dev/proof.f.d.ts +0 -13
- package/fjs/dev/proof.f.js +0 -77
- package/fjs/dev/update/module.f.d.ts +0 -11
- package/fjs/dev/update/module.f.js +0 -20
- package/fjs/dev/update/proof.f.d.ts +0 -7
- package/fjs/dev/update/proof.f.js +0 -35
- package/fjs/djs/ast/module.f.d.ts +0 -62
- package/fjs/djs/ast/module.f.js +0 -61
- package/fjs/djs/ast/proof.f.js +0 -49
- package/fjs/djs/examples/input.f.js +0 -4
- package/fjs/djs/examples/m.f.js +0 -1
- package/fjs/djs/module.f.d.ts +0 -17
- package/fjs/djs/module.f.js +0 -22
- package/fjs/djs/parser/module.f.d.ts +0 -23
- package/fjs/djs/parser/module.f.js +0 -410
- package/fjs/djs/parser/proof.f.d.ts +0 -14
- package/fjs/djs/parser/proof.f.js +0 -556
- package/fjs/djs/proof.f.d.ts +0 -10
- package/fjs/djs/proof.f.js +0 -50
- package/fjs/djs/serializer/module.f.d.ts +0 -17
- package/fjs/djs/serializer/module.f.js +0 -173
- package/fjs/djs/serializer/proof.f.js +0 -133
- package/fjs/djs/tokenizer/module.f.d.ts +0 -24
- package/fjs/djs/tokenizer/module.f.js +0 -472
- package/fjs/djs/tokenizer/proof.f.d.ts +0 -14
- package/fjs/djs/tokenizer/proof.f.js +0 -1211
- package/fjs/djs/transpiler/module.f.d.ts +0 -41
- package/fjs/djs/transpiler/module.f.js +0 -88
- package/fjs/djs/transpiler/proof.f.js +0 -67
- package/fjs/effects/eff/module.f.d.ts +0 -72
- package/fjs/effects/eff/module.f.js +0 -46
- package/fjs/effects/eff/proof.f.d.ts +0 -11
- package/fjs/effects/eff/proof.f.js +0 -58
- package/fjs/effects/list/module.f.d.ts +0 -37
- package/fjs/effects/list/module.f.js +0 -17
- package/fjs/effects/memory/module.f.d.ts +0 -37
- package/fjs/effects/memory/module.f.js +0 -24
- package/fjs/effects/memory/proof.f.d.ts +0 -6
- package/fjs/effects/memory/proof.f.js +0 -50
- package/fjs/effects/mock/module.f.d.ts +0 -16
- package/fjs/effects/mock/module.f.js +0 -20
- package/fjs/effects/module.d.ts +0 -2
- package/fjs/effects/module.f.d.ts +0 -408
- package/fjs/effects/module.f.js +0 -312
- package/fjs/effects/module.js +0 -11
- package/fjs/effects/node/memory/module.d.ts +0 -20
- package/fjs/effects/node/memory/module.js +0 -44
- package/fjs/effects/node/memory/proof.d.ts +0 -10
- package/fjs/effects/node/memory/proof.js +0 -29
- package/fjs/effects/node/module.d.ts +0 -20
- package/fjs/effects/node/module.f.d.ts +0 -300
- package/fjs/effects/node/module.f.js +0 -171
- package/fjs/effects/node/module.js +0 -305
- package/fjs/effects/node/proof.f.d.ts +0 -69
- package/fjs/effects/node/proof.f.js +0 -409
- package/fjs/effects/node/virtual/module.f.d.ts +0 -49
- package/fjs/effects/node/virtual/module.f.js +0 -440
- package/fjs/effects/node/virtual/proof.f.d.ts +0 -33
- package/fjs/effects/node/virtual/proof.f.js +0 -186
- package/fjs/effects/proof.f.d.ts +0 -56
- package/fjs/effects/proof.f.js +0 -200
- package/fjs/emergent_testing/all.test.js +0 -5
- package/fjs/emergent_testing/example.f.d.ts +0 -13
- package/fjs/emergent_testing/example.f.js +0 -31
- package/fjs/emergent_testing/module.f.d.ts +0 -140
- package/fjs/emergent_testing/module.f.js +0 -289
- package/fjs/emergent_testing/proof.f.d.ts +0 -67
- package/fjs/emergent_testing/proof.f.js +0 -416
- package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
- package/fjs/emergent_testing/scenarios/all.js +0 -1
- package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
- package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
- package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
- package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
- package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
- package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
- package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
- package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
- package/fjs/fsc/bnf.f.d.ts +0 -2
- package/fjs/fsc/bnf.f.js +0 -42
- package/fjs/fsc/json.f.d.ts +0 -7
- package/fjs/fsc/json.f.js +0 -64
- package/fjs/fsc/module.f.d.ts +0 -11
- package/fjs/fsc/module.f.js +0 -73
- package/fjs/fsc/proof.f.js +0 -104
- package/fjs/fsm/module.f.d.ts +0 -17
- package/fjs/fsm/module.f.js +0 -55
- package/fjs/fsm/proof.f.d.ts +0 -4
- package/fjs/fsm/proof.f.js +0 -126
- package/fjs/js/tokenizer/module.f.d.ts +0 -104
- package/fjs/js/tokenizer/module.f.js +0 -547
- package/fjs/js/tokenizer/proof.f.d.ts +0 -9
- package/fjs/js/tokenizer/proof.f.js +0 -986
- package/fjs/mcp/cas/module.f.d.ts +0 -27
- package/fjs/mcp/cas/module.f.js +0 -232
- package/fjs/mcp/evo/module.f.d.ts +0 -32
- package/fjs/mcp/evo/module.f.js +0 -99
- package/fjs/mcp/evo/proof.f.d.ts +0 -12
- package/fjs/mcp/evo/proof.f.js +0 -147
- package/fjs/mcp/module.f.d.ts +0 -56
- package/fjs/mcp/module.f.js +0 -69
- package/fjs/mcp/proof.f.d.ts +0 -45
- package/fjs/mcp/proof.f.js +0 -535
- package/fjs/media/html/module.f.d.ts +0 -52
- package/fjs/media/html/module.f.js +0 -117
- package/fjs/media/html/proof.f.d.ts +0 -16
- package/fjs/media/html/proof.f.js +0 -65
- package/fjs/media/json/module.f.d.ts +0 -64
- package/fjs/media/json/module.f.js +0 -109
- package/fjs/media/json/parser/module.f.d.ts +0 -21
- package/fjs/media/json/parser/module.f.js +0 -194
- package/fjs/media/json/parser/proof.f.d.ts +0 -5
- package/fjs/media/json/parser/proof.f.js +0 -314
- package/fjs/media/json/proof.f.js +0 -98
- package/fjs/media/json/schema/module.f.d.ts +0 -78
- package/fjs/media/json/schema/module.f.js +0 -96
- package/fjs/media/json/schema/proof.f.d.ts +0 -36
- package/fjs/media/json/schema/proof.f.js +0 -83
- package/fjs/media/json/serializer/module.f.d.ts +0 -28
- package/fjs/media/json/serializer/module.f.js +0 -73
- package/fjs/media/json/serializer/proof.f.js +0 -94
- package/fjs/media/json/tokenizer/module.f.d.ts +0 -15
- package/fjs/media/json/tokenizer/module.f.js +0 -63
- package/fjs/media/json/tokenizer/proof.f.d.ts +0 -5
- package/fjs/media/json/tokenizer/proof.f.js +0 -417
- package/fjs/media/module.f.d.ts +0 -119
- package/fjs/media/module.f.js +0 -88
- package/fjs/media/nix/module.f.d.ts +0 -30
- package/fjs/media/nix/module.f.js +0 -166
- package/fjs/media/nix/proof.f.d.ts +0 -32
- package/fjs/media/nix/proof.f.js +0 -127
- package/fjs/media/proof.f.d.ts +0 -19
- package/fjs/media/proof.f.js +0 -127
- package/fjs/media/revision/module.f.d.ts +0 -94
- package/fjs/media/revision/module.f.js +0 -143
- package/fjs/media/revision/proof.f.d.ts +0 -42
- package/fjs/media/revision/proof.f.js +0 -190
- package/fjs/media/type/module.f.d.ts +0 -135
- package/fjs/media/type/module.f.js +0 -231
- package/fjs/media/type/proof.f.d.ts +0 -40
- package/fjs/media/type/proof.f.js +0 -213
- package/fjs/module.d.ts +0 -2
- package/fjs/module.f.d.ts +0 -2
- package/fjs/module.f.js +0 -50
- package/fjs/module.js +0 -4
- package/fjs/path/module.f.d.ts +0 -46
- package/fjs/path/module.f.js +0 -71
- package/fjs/path/proof.f.js +0 -119
- package/fjs/proof.f.d.ts +0 -9
- package/fjs/proof.f.js +0 -38
- package/fjs/protocol/json_rpc/module.f.d.ts +0 -114
- package/fjs/protocol/json_rpc/module.f.js +0 -89
- package/fjs/protocol/json_rpc/proof.f.d.ts +0 -35
- package/fjs/protocol/json_rpc/proof.f.js +0 -68
- package/fjs/protocol/mcp/module.f.d.ts +0 -239
- package/fjs/protocol/mcp/module.f.js +0 -272
- package/fjs/protocol/mcp/proof.f.d.ts +0 -34
- package/fjs/protocol/mcp/proof.f.js +0 -208
- package/fjs/protocol/mcp/stdio/module.f.d.ts +0 -47
- package/fjs/protocol/mcp/stdio/module.f.js +0 -78
- package/fjs/protocol/mcp/stdio/proof.f.d.ts +0 -13
- package/fjs/protocol/mcp/stdio/proof.f.js +0 -143
- package/fjs/sul/id/module.f.d.ts +0 -33
- package/fjs/sul/id/module.f.js +0 -93
- package/fjs/sul/id/proof.f.js +0 -61
- package/fjs/sul/level/hash/module.f.d.ts +0 -38
- package/fjs/sul/level/hash/module.f.js +0 -43
- package/fjs/sul/level/hash/proof.f.d.ts +0 -13
- package/fjs/sul/level/hash/proof.f.js +0 -112
- package/fjs/sul/level/literal/module.f.d.ts +0 -64
- package/fjs/sul/level/literal/module.f.js +0 -88
- package/fjs/sul/level/literal/proof.f.d.ts +0 -12
- package/fjs/sul/level/literal/proof.f.js +0 -714
- package/fjs/sul/module.f.d.ts +0 -23
- package/fjs/sul/module.f.js +0 -46
- package/fjs/sul/proof.f.d.ts +0 -9
- package/fjs/sul/proof.f.js +0 -47
- package/fjs/text/ascii/module.f.d.ts +0 -136
- package/fjs/text/ascii/module.f.js +0 -154
- package/fjs/text/ascii/proof.f.d.ts +0 -6
- package/fjs/text/ascii/proof.f.js +0 -14
- package/fjs/text/code_point/module.f.d.ts +0 -65
- package/fjs/text/code_point/module.f.js +0 -103
- package/fjs/text/code_point/proof.f.d.ts +0 -8
- package/fjs/text/code_point/proof.f.js +0 -72
- package/fjs/text/module.f.d.ts +0 -40
- package/fjs/text/module.f.js +0 -43
- package/fjs/text/proof.f.d.ts +0 -10
- package/fjs/text/proof.f.js +0 -44
- package/fjs/text/sgr/module.f.d.ts +0 -53
- package/fjs/text/sgr/module.f.js +0 -63
- package/fjs/text/sgr/proof.f.js +0 -33
- package/fjs/text/utf16/module.f.d.ts +0 -161
- package/fjs/text/utf16/module.f.js +0 -311
- package/fjs/text/utf16/proof.f.d.ts +0 -10
- package/fjs/text/utf16/proof.f.js +0 -144
- package/fjs/text/utf8/module.f.d.ts +0 -83
- package/fjs/text/utf8/module.f.js +0 -247
- package/fjs/text/utf8/proof.f.js +0 -217
- package/fjs/types/array/module.f.d.ts +0 -49
- package/fjs/types/array/module.f.js +0 -42
- package/fjs/types/array/proof.f.js +0 -92
- package/fjs/types/bigfloat/module.f.d.ts +0 -6
- package/fjs/types/bigfloat/module.f.js +0 -69
- package/fjs/types/bigfloat/proof.f.d.ts +0 -5
- package/fjs/types/bigfloat/proof.f.js +0 -217
- package/fjs/types/bigint/module.f.d.ts +0 -172
- package/fjs/types/bigint/module.f.js +0 -251
- package/fjs/types/bigint/proof.f.d.ts +0 -37
- package/fjs/types/bigint/proof.f.js +0 -400
- package/fjs/types/bit_vec/module.f.d.ts +0 -302
- package/fjs/types/bit_vec/module.f.js +0 -375
- package/fjs/types/bit_vec/proof.f.d.ts +0 -65
- package/fjs/types/bit_vec/proof.f.js +0 -465
- package/fjs/types/btree/find/module.f.d.ts +0 -25
- package/fjs/types/btree/find/module.f.js +0 -80
- package/fjs/types/btree/find/proof.f.d.ts +0 -3
- package/fjs/types/btree/find/proof.f.js +0 -108
- package/fjs/types/btree/module.f.d.ts +0 -9
- package/fjs/types/btree/module.f.js +0 -33
- package/fjs/types/btree/proof.f.d.ts +0 -13
- package/fjs/types/btree/proof.f.js +0 -64
- package/fjs/types/btree/remove/module.f.d.ts +0 -14
- package/fjs/types/btree/remove/module.f.js +0 -186
- package/fjs/types/btree/remove/proof.f.d.ts +0 -9
- package/fjs/types/btree/remove/proof.f.js +0 -484
- package/fjs/types/btree/set/module.f.d.ts +0 -8
- package/fjs/types/btree/set/module.f.js +0 -128
- package/fjs/types/btree/set/proof.f.d.ts +0 -1
- package/fjs/types/btree/set/proof.f.js +0 -368
- package/fjs/types/btree/types/module.f.d.ts +0 -23
- package/fjs/types/btree/types/module.f.js +0 -9
- package/fjs/types/byte_set/module.f.d.ts +0 -16
- package/fjs/types/byte_set/module.f.js +0 -30
- package/fjs/types/byte_set/proof.f.d.ts +0 -11
- package/fjs/types/byte_set/proof.f.js +0 -79
- package/fjs/types/function/compare/module.f.d.ts +0 -49
- package/fjs/types/function/compare/module.f.js +0 -51
- package/fjs/types/function/compare/proof.f.js +0 -47
- package/fjs/types/function/module.f.d.ts +0 -28
- package/fjs/types/function/module.f.js +0 -19
- package/fjs/types/function/operator/module.f.d.ts +0 -48
- package/fjs/types/function/operator/module.f.js +0 -16
- package/fjs/types/function/operator/proof.f.js +0 -53
- package/fjs/types/function/proof.f.js +0 -10
- package/fjs/types/list/module.f.d.ts +0 -75
- package/fjs/types/list/module.f.js +0 -190
- package/fjs/types/list/proof.f.d.ts +0 -31
- package/fjs/types/list/proof.f.js +0 -330
- package/fjs/types/map/module.f.d.ts +0 -2
- package/fjs/types/map/module.f.js +0 -22
- package/fjs/types/map/proof.f.js +0 -22
- package/fjs/types/nibble_set/module.f.d.ts +0 -27
- package/fjs/types/nibble_set/module.f.js +0 -25
- package/fjs/types/nibble_set/proof.f.js +0 -60
- package/fjs/types/nominal/module.f.d.ts +0 -22
- package/fjs/types/nominal/module.f.js +0 -13
- package/fjs/types/nominal/proof.f.d.ts +0 -4
- package/fjs/types/nominal/proof.f.js +0 -48
- package/fjs/types/nullable/module.f.d.ts +0 -21
- package/fjs/types/nullable/module.f.js +0 -29
- package/fjs/types/nullable/proof.f.d.ts +0 -1
- package/fjs/types/nullable/proof.f.js +0 -29
- package/fjs/types/number/module.f.d.ts +0 -16
- package/fjs/types/number/module.f.js +0 -30
- package/fjs/types/number/proof.f.js +0 -124
- package/fjs/types/object/module.f.d.ts +0 -54
- package/fjs/types/object/module.f.js +0 -25
- package/fjs/types/object/proof.f.d.ts +0 -4
- package/fjs/types/object/proof.f.js +0 -14
- package/fjs/types/option/module.f.js +0 -6
- package/fjs/types/ordered_map/module.f.d.ts +0 -17
- package/fjs/types/ordered_map/module.f.js +0 -22
- package/fjs/types/ordered_map/proof.f.d.ts +0 -5
- package/fjs/types/ordered_map/proof.f.js +0 -73
- package/fjs/types/patricia_trie/module.f.d.ts +0 -25
- package/fjs/types/patricia_trie/module.f.js +0 -35
- package/fjs/types/patricia_trie/proof.f.d.ts +0 -13
- package/fjs/types/patricia_trie/proof.f.js +0 -121
- package/fjs/types/phantom/module.f.js +0 -11
- package/fjs/types/prime_field/module.f.d.ts +0 -62
- package/fjs/types/prime_field/module.f.js +0 -112
- package/fjs/types/prime_field/proof.f.js +0 -128
- package/fjs/types/range/module.f.d.ts +0 -8
- package/fjs/types/range/module.f.js +0 -2
- package/fjs/types/range/proof.f.d.ts +0 -1
- package/fjs/types/range/proof.f.js +0 -9
- package/fjs/types/range_map/module.f.d.ts +0 -92
- package/fjs/types/range_map/module.f.js +0 -82
- package/fjs/types/range_map/proof.f.d.ts +0 -6
- package/fjs/types/range_map/proof.f.js +0 -151
- package/fjs/types/range_set/module.f.d.ts +0 -5
- package/fjs/types/range_set/module.f.js +0 -16
- package/fjs/types/range_set/proof.f.d.ts +0 -1
- package/fjs/types/range_set/proof.f.js +0 -19
- package/fjs/types/result/module.d.ts +0 -3
- package/fjs/types/result/module.f.d.ts +0 -61
- package/fjs/types/result/module.f.js +0 -54
- package/fjs/types/result/module.js +0 -19
- package/fjs/types/result/proof.f.d.ts +0 -12
- package/fjs/types/result/proof.f.js +0 -31
- package/fjs/types/rtti/common/module.f.d.ts +0 -121
- package/fjs/types/rtti/common/module.f.js +0 -94
- package/fjs/types/rtti/common/proof.f.d.ts +0 -8
- package/fjs/types/rtti/common/proof.f.js +0 -51
- package/fjs/types/rtti/module.f.d.ts +0 -75
- package/fjs/types/rtti/module.f.js +0 -34
- package/fjs/types/rtti/parse/module.f.d.ts +0 -36
- package/fjs/types/rtti/parse/module.f.js +0 -114
- package/fjs/types/rtti/parse/proof.f.d.ts +0 -115
- package/fjs/types/rtti/parse/proof.f.js +0 -334
- package/fjs/types/rtti/proof.f.d.ts +0 -5
- package/fjs/types/rtti/proof.f.js +0 -16
- package/fjs/types/rtti/ts/module.f.d.ts +0 -118
- package/fjs/types/rtti/ts/module.f.js +0 -59
- package/fjs/types/rtti/ts/proof.f.d.ts +0 -59
- package/fjs/types/rtti/ts/proof.f.js +0 -75
- package/fjs/types/rtti/validate/module.f.d.ts +0 -4
- package/fjs/types/rtti/validate/module.f.js +0 -74
- package/fjs/types/rtti/validate/proof.f.d.ts +0 -118
- package/fjs/types/rtti/validate/proof.f.js +0 -349
- package/fjs/types/sorted_list/module.f.d.ts +0 -26
- package/fjs/types/sorted_list/module.f.js +0 -51
- package/fjs/types/sorted_list/proof.f.d.ts +0 -4
- package/fjs/types/sorted_list/proof.f.js +0 -46
- package/fjs/types/sorted_set/module.f.d.ts +0 -33
- package/fjs/types/sorted_set/module.f.js +0 -5
- package/fjs/types/sorted_set/proof.f.d.ts +0 -6
- package/fjs/types/sorted_set/proof.f.js +0 -67
- package/fjs/types/string/module.f.d.ts +0 -24
- package/fjs/types/string/module.f.js +0 -35
- package/fjs/types/string/proof.f.js +0 -77
- package/fjs/types/string_set/module.f.d.ts +0 -30
- package/fjs/types/string_set/module.f.js +0 -37
- package/fjs/types/string_set/proof.f.js +0 -43
- package/fjs/types/ts/module.f.d.ts +0 -23
- package/fjs/types/ts/module.f.js +0 -27
- package/fjs/types/ts/proof.f.d.ts +0 -38
- package/fjs/types/ts/proof.f.js +0 -86
- package/fjs/types/uint8array/module.f.d.ts +0 -13
- package/fjs/types/uint8array/module.f.js +0 -34
- package/fjs/types/uint8array/proof.f.d.ts +0 -17
- package/fjs/types/uint8array/proof.f.js +0 -64
- package/fjs/website/module.f.d.ts +0 -3
- package/fjs/website/module.f.js +0 -14
- package/fjs/website/proof.f.js +0 -13
- package/nanvm-lib/tests/proof.f.d.ts +0 -122
- package/nanvm-lib/tests/proof.f.js +0 -330
- package/todo/031-json.f.d.ts +0 -1
- package/todo/031-json.f.js +0 -241
- package/todo/proof.f.d.ts +0 -20
- package/todo/proof.f.js +0 -62
- /package/fjs/{base_n/proof.f.d.ts → basen/proof.f.d.mts} +0 -0
- /package/fjs/bnf/token_symbol/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/ci/node/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/crypto/hmac/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/crypto/pow/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/crypto/vdf/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/dev/package_json/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/djs/ast/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/djs/examples/{input.f.d.ts → input.f.d.mts} +0 -0
- /package/fjs/djs/examples/{m.f.d.ts → m.f.d.mts} +0 -0
- /package/fjs/djs/serializer/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/djs/transpiler/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/fsc/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/media/json/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/media/json/serializer/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/path/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/sul/id/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/text/utf8/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/array/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/{emergent_testing/all.test.d.ts → types/bigint/benchmark.d.mts} +0 -0
- /package/fjs/{basen/base128/proof.f.d.ts → types/function/compare/proof.f.d.mts} +0 -0
- /package/fjs/types/function/operator/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/function/{compare/proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/map/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/nibble_set/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/{text/sgr/proof.f.d.ts → types/nullable/proof.f.d.mts} +0 -0
- /package/fjs/types/number/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/option/{module.f.d.ts → types.d.ts} +0 -0
- /package/fjs/types/phantom/{module.f.d.ts → types.d.ts} +0 -0
- /package/fjs/types/prime_field/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/{function/proof.f.d.ts → range/proof.f.d.mts} +0 -0
- /package/fjs/types/string/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/types/string_set/{proof.f.d.ts → proof.f.d.mts} +0 -0
- /package/fjs/website/{proof.f.d.ts → proof.f.d.mts} +0 -0
|
@@ -0,0 +1,1030 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The serializable RTTI data form and the {@link toData} conversion from the
|
|
3
|
+
* thunk form.
|
|
4
|
+
*
|
|
5
|
+
* A schema denotes a set of values. The data form partitions that set into
|
|
6
|
+
* six disjoint kinds — unit values (`null`, `undefined`, `false`, `true`),
|
|
7
|
+
* numbers, strings, bigints, arrays and objects — so that all schema algebra
|
|
8
|
+
* (union normalization, coverage collapse, {@link equal}, {@link subset},
|
|
9
|
+
* canonical ordering via {@link cmp}) reduces to kind-wise set operations.
|
|
10
|
+
* {@link toData} is the single bridge from the thunk form; {@link validate}
|
|
11
|
+
* is the data-driven counterpart of `../validate`. The form serializes as
|
|
12
|
+
* DJS — plain JSON when no `bigint` literals are involved. See `./README.md`
|
|
13
|
+
* for the design rationale and serialization notes, and `./types.ts` for the
|
|
14
|
+
* type-level API.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*
|
|
18
|
+
* @import { Const, ConstObject, Type } from '../types.ts'
|
|
19
|
+
* @import { Primitive, Unknown } from '../ts/types.ts'
|
|
20
|
+
* @import { ResultE } from '../common/types.ts'
|
|
21
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
22
|
+
* @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from './types.ts'
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { assertNotNullish } from '../../../asserts/module.f.mjs'
|
|
26
|
+
import { at, definedEntries, definedValues } from '../../object/module.f.mjs'
|
|
27
|
+
import { ok } from '../../result/module.f.mjs'
|
|
28
|
+
import { eachEntry, isArray, verror } from '../common/module.f.mjs'
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The unit kind's enumeration: bit `1 << i` of a {@link UnionSet}'s `unit`
|
|
32
|
+
* bitset stands for `unitList[i]`.
|
|
33
|
+
*/
|
|
34
|
+
export const unitList = /** @type {const} */ (['null', 'undefined', 'false', 'true'])
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The `unit` bit of one unit value.
|
|
38
|
+
*
|
|
39
|
+
* @type {(v: null | undefined | boolean) => number}
|
|
40
|
+
*/
|
|
41
|
+
export const unitBit = v =>
|
|
42
|
+
v === null ? 1 :
|
|
43
|
+
v === undefined ? 2 :
|
|
44
|
+
v ? 8 : 4
|
|
45
|
+
|
|
46
|
+
const allUnits = unitBit(null) | unitBit(undefined) | unitBit(false) | unitBit(true)
|
|
47
|
+
|
|
48
|
+
const booleanUnits = unitBit(false) | unitBit(true)
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The data form of the empty set — rtti `never`.
|
|
52
|
+
*
|
|
53
|
+
* @type {UnionSet}
|
|
54
|
+
*/
|
|
55
|
+
export const never = {}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The data form of the set of all values — rtti `unknown`.
|
|
59
|
+
*
|
|
60
|
+
* @type {UnionSet}
|
|
61
|
+
*/
|
|
62
|
+
export const unknown = {
|
|
63
|
+
unit: allUnits,
|
|
64
|
+
number: true,
|
|
65
|
+
string: true,
|
|
66
|
+
bigint: true,
|
|
67
|
+
array: true,
|
|
68
|
+
object: true,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ── canonical order ──────────────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
/** @type {(a: string, b: string) => number} */
|
|
74
|
+
const cmpString = (a, b) => a < b ? -1 : a > b ? 1 : 0
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Total order on number literals matching the SameValue equality the
|
|
78
|
+
* validators use: ascending, `-0` before `0`, `NaN` last.
|
|
79
|
+
*
|
|
80
|
+
* @type {(a: number, b: number) => number}
|
|
81
|
+
*/
|
|
82
|
+
const cmpNumber = (a, b) => {
|
|
83
|
+
if (Object.is(a, b)) { return 0 }
|
|
84
|
+
if (Number.isNaN(a)) { return 1 }
|
|
85
|
+
if (Number.isNaN(b)) { return -1 }
|
|
86
|
+
if (a < b) { return -1 }
|
|
87
|
+
if (a > b) { return 1 }
|
|
88
|
+
// `a` and `b` are `+0` and `-0`, in one of the two orders
|
|
89
|
+
return Object.is(a, -0) ? -1 : 1
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** @type {(a: bigint, b: bigint) => number} */
|
|
93
|
+
const cmpBigint = (a, b) => a < b ? -1 : a > b ? 1 : 0
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Lexicographic order, shorter lists first.
|
|
97
|
+
*
|
|
98
|
+
* @template T
|
|
99
|
+
* @param {(a: T, b: T) => number} cmpItem
|
|
100
|
+
* @returns {(a: readonly T[], b: readonly T[]) => number}
|
|
101
|
+
*/
|
|
102
|
+
const cmpList = cmpItem => (a, b) => {
|
|
103
|
+
const d = a.length - b.length
|
|
104
|
+
if (d !== 0) { return d }
|
|
105
|
+
for (let i = 0; i < a.length; ++i) {
|
|
106
|
+
const c = cmpItem(a[i], b[i])
|
|
107
|
+
if (c !== 0) { return c }
|
|
108
|
+
}
|
|
109
|
+
return 0
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Order on one kind component: absent, then member lists, then `true`.
|
|
114
|
+
*
|
|
115
|
+
* @template T
|
|
116
|
+
* @param {(a: T, b: T) => number} cmpItem
|
|
117
|
+
* @returns {(a: KindSet<T> | undefined, b: KindSet<T> | undefined) => number}
|
|
118
|
+
*/
|
|
119
|
+
const cmpKind = cmpItem => (a, b) => {
|
|
120
|
+
if (a === undefined) { return b === undefined ? 0 : -1 }
|
|
121
|
+
if (b === undefined) { return 1 }
|
|
122
|
+
if (a === true) { return b === true ? 0 : 1 }
|
|
123
|
+
if (b === true) { return -1 }
|
|
124
|
+
return cmpList(cmpItem)(a, b)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @template T
|
|
129
|
+
* @param {(a: T, b: T) => number} cmpValue
|
|
130
|
+
* @returns {(a: readonly [string, T], b: readonly [string, T]) => number}
|
|
131
|
+
*/
|
|
132
|
+
const cmpEntry = cmpValue => ([ak, av], [bk, bv]) => {
|
|
133
|
+
const c = cmpString(ak, bk)
|
|
134
|
+
return c !== 0 ? c : cmpValue(av, bv)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** @type {(a: Node | undefined, b: Node | undefined) => number} */
|
|
138
|
+
const cmpRest = (a, b) => {
|
|
139
|
+
if (a === undefined) { return b === undefined ? 0 : -1 }
|
|
140
|
+
if (b === undefined) { return 1 }
|
|
141
|
+
return cmpNode(a, b)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** @type {(a: ArraySet, b: ArraySet) => number} */
|
|
145
|
+
const cmpArraySet = (a, b) => {
|
|
146
|
+
const c = cmpList(cmpNode)(a.prefix, b.prefix)
|
|
147
|
+
return c !== 0 ? c : cmpRest(a.rest, b.rest)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** @type {(a: ObjectSet, b: ObjectSet) => number} */
|
|
151
|
+
const cmpObjectSet = (a, b) => {
|
|
152
|
+
const c = cmpList(cmpEntry(cmpNode))(definedEntries(a.props), definedEntries(b.props))
|
|
153
|
+
return c !== 0 ? c : cmpRest(a.rest, b.rest)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** @type {(a: UnionSet, b: UnionSet) => number} */
|
|
157
|
+
const cmpUnion = (a, b) => {
|
|
158
|
+
const c0 = (a.unit ?? 0) - (b.unit ?? 0)
|
|
159
|
+
if (c0 !== 0) { return c0 }
|
|
160
|
+
const c1 = cmpKind(cmpNumber)(a.number, b.number)
|
|
161
|
+
if (c1 !== 0) { return c1 }
|
|
162
|
+
const c2 = cmpKind(cmpString)(a.string, b.string)
|
|
163
|
+
if (c2 !== 0) { return c2 }
|
|
164
|
+
const c3 = cmpKind(cmpBigint)(a.bigint, b.bigint)
|
|
165
|
+
if (c3 !== 0) { return c3 }
|
|
166
|
+
const c4 = cmpKind(cmpArraySet)(a.array, b.array)
|
|
167
|
+
return c4 !== 0 ? c4 : cmpKind(cmpObjectSet)(a.object, b.object)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Inline unions sort before references; references sort by rule name.
|
|
172
|
+
*
|
|
173
|
+
* @type {(a: Node, b: Node) => number}
|
|
174
|
+
*/
|
|
175
|
+
const cmpNode = (a, b) => {
|
|
176
|
+
if (typeof a === 'string') {
|
|
177
|
+
return typeof b === 'string' ? cmpString(a, b) : 1
|
|
178
|
+
}
|
|
179
|
+
return typeof b === 'string' ? -1 : cmpUnion(a, b)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Total order over the data form: negative, zero or positive, with zero
|
|
184
|
+
* exactly on structural identity. {@link toData} output is canonical, so two
|
|
185
|
+
* conversions of equivalent thunk schemas compare equal — this is what makes
|
|
186
|
+
* the data form comparable and sortable.
|
|
187
|
+
*
|
|
188
|
+
* @type {(a: Data) => (b: Data) => number}
|
|
189
|
+
*/
|
|
190
|
+
export const cmp = ([aRules, aNode]) => ([bRules, bNode]) => {
|
|
191
|
+
const c = cmpNode(aNode, bNode)
|
|
192
|
+
return c !== 0
|
|
193
|
+
? c
|
|
194
|
+
: cmpList(cmpEntry(cmpUnion))(definedEntries(aRules), definedEntries(bRules))
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Structural equality of canonical forms: `equal(toData(a))(toData(b))`
|
|
199
|
+
* holds exactly when `a` and `b` normalize to the same data — e.g.
|
|
200
|
+
* `or(a, b)` and `or(b, a)` are equal. Recursive definitions compare by
|
|
201
|
+
* their rule names, which are derived from the defining functions' names.
|
|
202
|
+
*
|
|
203
|
+
* @type {(a: Data) => (b: Data) => boolean}
|
|
204
|
+
*/
|
|
205
|
+
export const equal = a => b => cmp(a)(b) === 0
|
|
206
|
+
|
|
207
|
+
// ── kind-wise union ──────────────────────────────────────────────────────────
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Merges two sorted, deduplicated lists into one.
|
|
211
|
+
*
|
|
212
|
+
* @template T
|
|
213
|
+
* @param {(a: T, b: T) => number} cmpItem
|
|
214
|
+
* @returns {(a: readonly T[], b: readonly T[]) => readonly T[]}
|
|
215
|
+
*/
|
|
216
|
+
const mergeSorted = cmpItem => (a, b) => {
|
|
217
|
+
if (a.length === 0) { return b }
|
|
218
|
+
if (b.length === 0) { return a }
|
|
219
|
+
const c = cmpItem(a[0], b[0])
|
|
220
|
+
if (c < 0) { return [a[0], ...mergeSorted(cmpItem)(a.slice(1), b)] }
|
|
221
|
+
if (c > 0) { return [b[0], ...mergeSorted(cmpItem)(a, b.slice(1))] }
|
|
222
|
+
return [a[0], ...mergeSorted(cmpItem)(a.slice(1), b.slice(1))]
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Union of one kind component: absent = empty, `true` = the whole kind, so
|
|
227
|
+
* `or(42, number)` collapses to all numbers here with no special-case rule.
|
|
228
|
+
*
|
|
229
|
+
* @template T
|
|
230
|
+
* @param {(a: T, b: T) => number} cmpItem
|
|
231
|
+
* @returns {(a: KindSet<T> | undefined, b: KindSet<T> | undefined) => KindSet<T> | undefined}
|
|
232
|
+
*/
|
|
233
|
+
const mergeKind = cmpItem => (a, b) => {
|
|
234
|
+
if (a === undefined) { return b }
|
|
235
|
+
if (b === undefined) { return a }
|
|
236
|
+
if (a === true || b === true) { return true }
|
|
237
|
+
return mergeSorted(cmpItem)(a, b)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Kind-wise union of two union sets.
|
|
242
|
+
*
|
|
243
|
+
* @type {(a: UnionSet, b: UnionSet) => UnionSet}
|
|
244
|
+
*/
|
|
245
|
+
const merge = (a, b) => {
|
|
246
|
+
const unit = (a.unit ?? 0) | (b.unit ?? 0)
|
|
247
|
+
const number = mergeKind(cmpNumber)(a.number, b.number)
|
|
248
|
+
const string = mergeKind(cmpString)(a.string, b.string)
|
|
249
|
+
const bigint = mergeKind(cmpBigint)(a.bigint, b.bigint)
|
|
250
|
+
const array = mergeKind(cmpArraySet)(a.array, b.array)
|
|
251
|
+
const object = mergeKind(cmpObjectSet)(a.object, b.object)
|
|
252
|
+
return {
|
|
253
|
+
...(unit === 0 ? {} : { unit }),
|
|
254
|
+
...(number === undefined ? {} : { number }),
|
|
255
|
+
...(string === undefined ? {} : { string }),
|
|
256
|
+
...(bigint === undefined ? {} : { bigint }),
|
|
257
|
+
...(array === undefined ? {} : { array }),
|
|
258
|
+
...(object === undefined ? {} : { object }),
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ── canonical constructors ───────────────────────────────────────────────────
|
|
263
|
+
|
|
264
|
+
/** @type {(n: Node) => boolean} */
|
|
265
|
+
const isNever = n => typeof n !== 'string' && cmpUnion(n, never) === 0
|
|
266
|
+
|
|
267
|
+
/** @type {(n: Node) => boolean} */
|
|
268
|
+
const isTop = n => typeof n !== 'string' && cmpUnion(n, unknown) === 0
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Canonical array-kind singleton. A syntactically empty position makes the
|
|
272
|
+
* whole pattern empty; an empty `rest` is the same set as no `rest`; an
|
|
273
|
+
* unconstrained `rest` with no prefix is every array.
|
|
274
|
+
*
|
|
275
|
+
* @type {(prefix: readonly Node[], rest: Node | undefined) => UnionSet}
|
|
276
|
+
*/
|
|
277
|
+
const arraySet = (prefix, rest) => {
|
|
278
|
+
if (prefix.some(isNever)) { return never }
|
|
279
|
+
const r = rest !== undefined && isNever(rest) ? undefined : rest
|
|
280
|
+
return prefix.length === 0 && r !== undefined && isTop(r)
|
|
281
|
+
? { array: true }
|
|
282
|
+
: { array: [r === undefined ? { prefix } : { prefix, rest: r }] }
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Canonical object-kind singleton. An unconstrained key is dropped (reading
|
|
287
|
+
* it yields some value regardless); a syntactically empty key set makes the
|
|
288
|
+
* whole pattern empty; an unconstrained `rest` is the same set as no `rest`;
|
|
289
|
+
* with nothing left, the pattern is every object.
|
|
290
|
+
*
|
|
291
|
+
* @type {(props: readonly (readonly [string, Node])[], rest: Node | undefined) => UnionSet}
|
|
292
|
+
*/
|
|
293
|
+
const objectSet = (props, rest) => {
|
|
294
|
+
const constrained = props.filter(([, v]) => !isTop(v))
|
|
295
|
+
if (constrained.some(([, v]) => isNever(v))) { return never }
|
|
296
|
+
const r = rest !== undefined && isTop(rest) ? undefined : rest
|
|
297
|
+
if (constrained.length === 0 && r === undefined) { return { object: true } }
|
|
298
|
+
/** @type {StringMap<Node>} */
|
|
299
|
+
const sorted = Object.fromEntries(constrained.toSorted(([ak], [bk]) => cmpString(ak, bk)))
|
|
300
|
+
return { object: [r === undefined ? { props: sorted } : { props: sorted, rest: r }] }
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ── subset ───────────────────────────────────────────────────────────────────
|
|
304
|
+
|
|
305
|
+
/** The rule sets of the two compared schemas: `[left, right]`. */
|
|
306
|
+
/** @typedef {readonly [RuleSet, RuleSet]} _Ctx */
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Node pairs assumed included while they are being checked — the standard
|
|
310
|
+
* coinductive treatment of reference cycles, keyed by {@link _Keyed} node
|
|
311
|
+
* identities.
|
|
312
|
+
*/
|
|
313
|
+
/** @typedef {StringMap<StringMap<true>>} _Assumed */
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* A node with a canonical identity for the coinductive memo: `r:<name>` a
|
|
317
|
+
* rule reference, `u:<name>` a rule's object read-set (its rest plus
|
|
318
|
+
* `undefined`), `t` the top set. A node synthesized from inline data has no
|
|
319
|
+
* identity (`undefined`) — recursion through it descends its finite tree,
|
|
320
|
+
* so every cycle still crosses identified pairs and the memo closes it.
|
|
321
|
+
*/
|
|
322
|
+
/** @typedef {readonly [Node, string | undefined]} _Keyed */
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Own-property lookups only: a `RuleSet`/`props` map is a plain object, so
|
|
326
|
+
* reading through the prototype chain would return `Object.prototype`
|
|
327
|
+
* members (`toString`, `constructor`, …) for names that are not defined.
|
|
328
|
+
*
|
|
329
|
+
* @type {(rules: RuleSet) => (n: Node) => UnionSet}
|
|
330
|
+
*/
|
|
331
|
+
const resolve = rules => n => typeof n === 'string' ? assertNotNullish(at(n)(rules)) : n
|
|
332
|
+
|
|
333
|
+
/** @type {<T>(a: T, b: T) => boolean} */
|
|
334
|
+
const strictEqual = (a, b) => a === b
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Inclusion of one kind component: every member of `a` below some member of
|
|
338
|
+
* `b`; absent = empty, `true` = the whole kind.
|
|
339
|
+
*
|
|
340
|
+
* @template T
|
|
341
|
+
* @param {(a: T, b: T) => boolean} le
|
|
342
|
+
* @returns {(a: KindSet<T> | undefined, b: KindSet<T> | undefined) => boolean}
|
|
343
|
+
*/
|
|
344
|
+
const kindSubset = le => (a, b) => {
|
|
345
|
+
if (a === undefined) { return true }
|
|
346
|
+
if (b === true) { return true }
|
|
347
|
+
if (a === true || b === undefined) { return false }
|
|
348
|
+
return a.every(x => b.some(y => le(x, y)))
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/** @type {(ctx: _Ctx) => (assumed: _Assumed) => (p: ArraySet, q: ArraySet) => boolean} */
|
|
352
|
+
const arraySetSubset = ctx => assumed => (p, q) => {
|
|
353
|
+
const le = nodeSubset(ctx)(assumed)
|
|
354
|
+
const pn = p.prefix.length
|
|
355
|
+
const qn = q.prefix.length
|
|
356
|
+
// `p` admits lengths `{pn}` or `[pn, ∞)`; they must fit `q`'s admitted lengths
|
|
357
|
+
const lengthOk = q.rest !== undefined
|
|
358
|
+
? qn <= pn
|
|
359
|
+
: p.rest === undefined && qn === pn
|
|
360
|
+
if (!lengthOk) { return false }
|
|
361
|
+
/** @type {(i: number) => Node} */
|
|
362
|
+
const qAt = i => i < qn ? q.prefix[i] : assertNotNullish(q.rest)
|
|
363
|
+
return p.prefix.every((el, i) => le(el, qAt(i)))
|
|
364
|
+
&& (p.rest === undefined || le(p.rest, assertNotNullish(q.rest)))
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** @type {(n: Node) => _Keyed} */
|
|
368
|
+
const keyed = n => [n, typeof n === 'string' ? `r:${n}` : undefined]
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* The set of values *read* at key `k` from objects of the pattern: the
|
|
372
|
+
* declared set, else — since the key may also be absent, reading
|
|
373
|
+
* `undefined` — the `rest` set plus `undefined`, else anything. A read-set
|
|
374
|
+
* synthesized from a referenced rest keeps that rule's identity (`u:`), so
|
|
375
|
+
* the coinductive memo closes cycles through it.
|
|
376
|
+
*
|
|
377
|
+
* @type {(rules: RuleSet) => (pattern: ObjectSet) => (k: string) => _Keyed}
|
|
378
|
+
*/
|
|
379
|
+
const objectReadSet = rules => pattern => k => {
|
|
380
|
+
const n = at(k)(pattern.props)
|
|
381
|
+
if (n !== null) { return keyed(n) }
|
|
382
|
+
const { rest } = pattern
|
|
383
|
+
return rest === undefined
|
|
384
|
+
? [unknown, 't']
|
|
385
|
+
: [
|
|
386
|
+
merge(resolve(rules)(rest), { unit: unitBit(undefined) }),
|
|
387
|
+
typeof rest === 'string' ? `u:${rest}` : undefined,
|
|
388
|
+
]
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/** @type {(list: readonly string[]) => readonly string[]} */
|
|
392
|
+
const dedup = list => list.filter((n, i) => list.indexOf(n) === i)
|
|
393
|
+
|
|
394
|
+
/** @type {(ctx: _Ctx) => (assumed: _Assumed) => (p: ObjectSet, q: ObjectSet) => boolean} */
|
|
395
|
+
const objectSetSubset = ctx => assumed => (p, q) => {
|
|
396
|
+
const le = keyedSubset(ctx)(assumed)
|
|
397
|
+
const keys = dedup([
|
|
398
|
+
...definedEntries(p.props).map(([k]) => k),
|
|
399
|
+
...definedEntries(q.props).map(([k]) => k),
|
|
400
|
+
])
|
|
401
|
+
return keys.every(k => le(objectReadSet(ctx[0])(p)(k), objectReadSet(ctx[1])(q)(k)))
|
|
402
|
+
// values at the keys declared by neither side
|
|
403
|
+
&& (q.rest === undefined || nodeSubset(ctx)(assumed)(p.rest ?? unknown, q.rest))
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** @type {(ctx: _Ctx) => (assumed: _Assumed) => (a: UnionSet, b: UnionSet) => boolean} */
|
|
407
|
+
const unionSubset = ctx => assumed => (a, b) =>
|
|
408
|
+
((a.unit ?? 0) & ~(b.unit ?? 0)) === 0
|
|
409
|
+
&& kindSubset(Object.is)(a.number, b.number)
|
|
410
|
+
&& kindSubset(strictEqual)(a.string, b.string)
|
|
411
|
+
&& kindSubset(strictEqual)(a.bigint, b.bigint)
|
|
412
|
+
&& kindSubset(arraySetSubset(ctx)(assumed))(a.array, b.array)
|
|
413
|
+
&& kindSubset(objectSetSubset(ctx)(assumed))(a.object, b.object)
|
|
414
|
+
|
|
415
|
+
/** @type {(ctx: _Ctx) => (assumed: _Assumed) => (a: _Keyed, b: _Keyed) => boolean} */
|
|
416
|
+
const keyedSubset = ctx => assumed => ([a, aKey], [b, bKey]) => {
|
|
417
|
+
let assumed1 = assumed
|
|
418
|
+
if (aKey !== undefined && bKey !== undefined) {
|
|
419
|
+
const inner = assumed[aKey]
|
|
420
|
+
if (inner !== undefined && inner[bKey] === true) { return true }
|
|
421
|
+
assumed1 = { ...assumed, [aKey]: inner === undefined ? { [bKey]: true } : { ...inner, [bKey]: true } }
|
|
422
|
+
}
|
|
423
|
+
return unionSubset(ctx)(assumed1)(resolve(ctx[0])(a), resolve(ctx[1])(b))
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/** @type {(ctx: _Ctx) => (assumed: _Assumed) => (a: Node, b: Node) => boolean} */
|
|
427
|
+
const nodeSubset = ctx => assumed => (a, b) =>
|
|
428
|
+
keyedSubset(ctx)(assumed)(keyed(a), keyed(b))
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Sound subset test: `true` means every value of `a` is a value of `b`.
|
|
432
|
+
* Kind-wise on unions, pattern-wise on arrays/objects, coinductive on
|
|
433
|
+
* reference cycles. Incomplete in the known-hard corners of semantic
|
|
434
|
+
* subtyping (see `./README.md`): it may answer `false` for an inclusion
|
|
435
|
+
* that only holds by distributing a union across positions, or one whose
|
|
436
|
+
* left side is a non-syntactic empty set — never `true` for a non-inclusion.
|
|
437
|
+
*
|
|
438
|
+
* @type {(a: Data) => (b: Data) => boolean}
|
|
439
|
+
*/
|
|
440
|
+
export const subset = ([aRules, aNode]) => ([bRules, bNode]) =>
|
|
441
|
+
nodeSubset([aRules, bRules])({})(aNode, bNode)
|
|
442
|
+
|
|
443
|
+
// ── coverage collapse ────────────────────────────────────────────────────────
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Drops every pattern subsumed by another pattern of the same list.
|
|
447
|
+
*
|
|
448
|
+
* Two *distinct* patterns can subsume each other: references to
|
|
449
|
+
* α-equivalent rules under different names spell the same value set two
|
|
450
|
+
* ways (e.g. `list` and a differently-named `X = readonly X[]`). A
|
|
451
|
+
* mutually-subsumed pattern is therefore dropped only in favor of an
|
|
452
|
+
* earlier one, keeping exactly the first member of each such group —
|
|
453
|
+
* dropping on subsumption alone would drop the whole group.
|
|
454
|
+
*
|
|
455
|
+
* @template T
|
|
456
|
+
* @param {(p: T, q: T) => boolean} le
|
|
457
|
+
* @returns {(list: readonly T[]) => readonly T[]}
|
|
458
|
+
*/
|
|
459
|
+
const dropSubsumed = le => list =>
|
|
460
|
+
list.filter((p, i) => !list.some((q, j) => j !== i && le(p, q) && (j < i || !le(q, p))))
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* @template T
|
|
464
|
+
* @param {(a: T, b: T) => number} cmpItem
|
|
465
|
+
* @returns {(list: readonly T[]) => readonly T[]}
|
|
466
|
+
*/
|
|
467
|
+
const sortedDedup = cmpItem => list => {
|
|
468
|
+
const sorted = list.toSorted(cmpItem)
|
|
469
|
+
return sorted.filter((x, i) => i === 0 || cmpItem(sorted[i - 1], x) !== 0)
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/** @typedef {(n: Node) => Node} _NodeMap */
|
|
473
|
+
|
|
474
|
+
/** @type {(f: _NodeMap) => (p: ArraySet) => ArraySet} */
|
|
475
|
+
const mapArraySet = f => p => ({
|
|
476
|
+
prefix: p.prefix.map(f),
|
|
477
|
+
...(p.rest === undefined ? {} : { rest: f(p.rest) }),
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
/** @type {(f: _NodeMap) => (p: ObjectSet) => ObjectSet} */
|
|
481
|
+
const mapObjectSet = f => p => ({
|
|
482
|
+
props: Object.fromEntries(definedEntries(p.props).map(
|
|
483
|
+
([k, v]) => /** @type {const} */ ([k, f(v)]))),
|
|
484
|
+
...(p.rest === undefined ? {} : { rest: f(p.rest) }),
|
|
485
|
+
})
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Rewrites a union's nested nodes with `f`, keeping each pattern list
|
|
489
|
+
* sorted and deduplicated.
|
|
490
|
+
*
|
|
491
|
+
* @type {(f: _NodeMap) => (u: UnionSet) => UnionSet}
|
|
492
|
+
*/
|
|
493
|
+
const mapChildren = f => u => ({
|
|
494
|
+
...u,
|
|
495
|
+
...(u.array === undefined || u.array === true ? {} : {
|
|
496
|
+
array: sortedDedup(cmpArraySet)(u.array.map(mapArraySet(f))),
|
|
497
|
+
}),
|
|
498
|
+
...(u.object === undefined || u.object === true ? {} : {
|
|
499
|
+
object: sortedDedup(cmpObjectSet)(u.object.map(mapObjectSet(f))),
|
|
500
|
+
}),
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Bottom-up node rewrite: children first, then `post` on every node.
|
|
505
|
+
*
|
|
506
|
+
* @type {(post: _NodeMap) => _NodeMap}
|
|
507
|
+
*/
|
|
508
|
+
const rewriteNodes = post => {
|
|
509
|
+
/** @type {_NodeMap} */
|
|
510
|
+
const go = n => post(typeof n === 'string' ? n : mapChildren(go)(n))
|
|
511
|
+
return go
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Drops every subsumed array/object pattern of one union.
|
|
516
|
+
*
|
|
517
|
+
* @type {(ctx: _Ctx) => (u: UnionSet) => UnionSet}
|
|
518
|
+
*/
|
|
519
|
+
const dropSubsumedUnion = ctx => u => ({
|
|
520
|
+
...u,
|
|
521
|
+
...(u.array === undefined || u.array === true ? {} : {
|
|
522
|
+
array: dropSubsumed(arraySetSubset(ctx)({}))(u.array),
|
|
523
|
+
}),
|
|
524
|
+
...(u.object === undefined || u.object === true ? {} : {
|
|
525
|
+
object: dropSubsumed(objectSetSubset(ctx)({}))(u.object),
|
|
526
|
+
}),
|
|
527
|
+
})
|
|
528
|
+
|
|
529
|
+
/** @type {(ctx: _Ctx) => _NodeMap} */
|
|
530
|
+
const collapsePost = ctx => n => typeof n === 'string' ? n : dropSubsumedUnion(ctx)(n)
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* The coverage collapse: every subsumed array/object pattern dropped,
|
|
534
|
+
* recursively through inline nodes.
|
|
535
|
+
*
|
|
536
|
+
* @type {(ctx: _Ctx) => _NodeMap}
|
|
537
|
+
*/
|
|
538
|
+
const collapseNode = ctx => rewriteNodes(collapsePost(ctx))
|
|
539
|
+
|
|
540
|
+
/** @type {(ctx: _Ctx) => (u: UnionSet) => UnionSet} */
|
|
541
|
+
const collapseUnion = ctx => u => dropSubsumedUnion(ctx)(mapChildren(collapseNode(ctx))(u))
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Replaces a union structurally equal to a rule's body with a reference to
|
|
545
|
+
* that rule (the alphabetically first one on a tie). This is what keeps
|
|
546
|
+
* `or` idempotent over recursive schemas — the union of a rule with itself
|
|
547
|
+
* is the rule's body, which reads back as the rule — and it also collapses
|
|
548
|
+
* re-stated fixpoints such as `array(list)` for `list = readonly list[]`.
|
|
549
|
+
*
|
|
550
|
+
* @type {(rules: RuleSet) => _NodeMap}
|
|
551
|
+
*/
|
|
552
|
+
const internPost = rules => n => {
|
|
553
|
+
if (typeof n === 'string') { return n }
|
|
554
|
+
for (const [name, body] of definedEntries(rules)) {
|
|
555
|
+
if (cmpUnion(n, body) === 0) { return name }
|
|
556
|
+
}
|
|
557
|
+
return n
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/** @type {(rules: RuleSet) => _NodeMap} */
|
|
561
|
+
const internNode = rules => rewriteNodes(internPost(rules))
|
|
562
|
+
|
|
563
|
+
/** @type {(rules: RuleSet) => (u: UnionSet) => UnionSet} */
|
|
564
|
+
const internUnion = rules => mapChildren(internNode(rules))
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* The final canonical step: interns rule-body copies in the entry and in
|
|
568
|
+
* every rule body's nested positions. `rules` must already be sorted so a
|
|
569
|
+
* tie between equal rule bodies resolves deterministically.
|
|
570
|
+
*
|
|
571
|
+
* @type {(rules: RuleSet, entry: Node) => Data}
|
|
572
|
+
*/
|
|
573
|
+
const internData = (rules, entry) => [
|
|
574
|
+
Object.fromEntries(definedEntries(rules).map(
|
|
575
|
+
([n, u]) => /** @type {const} */ ([n, internUnion(rules)(u)]))),
|
|
576
|
+
internNode(rules)(entry),
|
|
577
|
+
]
|
|
578
|
+
|
|
579
|
+
// ── toData ───────────────────────────────────────────────────────────────────
|
|
580
|
+
|
|
581
|
+
/** A thunk — the only schema form that can close a reference cycle. */
|
|
582
|
+
/** @typedef {Exclude<Type, Const>} _Thunk */
|
|
583
|
+
|
|
584
|
+
/** A schema tracked by identity: a thunk or a const container. */
|
|
585
|
+
/** @typedef {Exclude<Type, Primitive>} _Key */
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* The conversion state, threaded functionally:
|
|
589
|
+
*
|
|
590
|
+
* - `converting` — thunks whose union is being computed (the recursion stack).
|
|
591
|
+
* - `names` — rule names, assigned to a thunk the moment something needs to
|
|
592
|
+
* reference it (a cycle, or a deferred merge).
|
|
593
|
+
* - `done` — computed unions, memoized by identity.
|
|
594
|
+
* - `deferred` — union merges `target ∪= source` that could not run eagerly
|
|
595
|
+
* because `source`'s union was not final; resolved by {@link fixpoint}.
|
|
596
|
+
*
|
|
597
|
+
* @typedef {{
|
|
598
|
+
* readonly converting: readonly _Thunk[]
|
|
599
|
+
* readonly names: readonly (readonly [_Thunk, string])[]
|
|
600
|
+
* readonly done: readonly (readonly [_Key, UnionSet])[]
|
|
601
|
+
* readonly deferred: readonly (readonly [_Thunk, _Thunk])[]
|
|
602
|
+
* }} _State
|
|
603
|
+
*/
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* The first value associated with `key` by identity.
|
|
607
|
+
*
|
|
608
|
+
* @template K
|
|
609
|
+
* @template T
|
|
610
|
+
* @param {readonly (readonly [K, T])[]} list
|
|
611
|
+
* @param {unknown} key
|
|
612
|
+
* @returns {T | undefined}
|
|
613
|
+
*/
|
|
614
|
+
const assoc = (list, key) => {
|
|
615
|
+
for (const [k, v] of list) {
|
|
616
|
+
if (k === key) { return v }
|
|
617
|
+
}
|
|
618
|
+
return undefined
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* The rule name of `t`, assigning a fresh one on first request — the
|
|
623
|
+
* defining function's name, disambiguated with a counter on collision.
|
|
624
|
+
*
|
|
625
|
+
* @type {(state: _State, t: _Thunk) => readonly [_State, string]}
|
|
626
|
+
*/
|
|
627
|
+
const ensureName = (state, t) => {
|
|
628
|
+
const existing = assoc(state.names, t)
|
|
629
|
+
if (existing !== undefined) { return [state, existing] }
|
|
630
|
+
const used = state.names.map(([, n]) => n)
|
|
631
|
+
let name = t.name
|
|
632
|
+
let i = 0
|
|
633
|
+
while (used.some(n => n === name)) {
|
|
634
|
+
name = t.name + i
|
|
635
|
+
++i
|
|
636
|
+
}
|
|
637
|
+
return [{ ...state, names: [...state.names, [t, name]] }, name]
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Records the pending merge `t ∪= op` and names `t`, so every embedding of
|
|
642
|
+
* `t` stays a reference that late-binds to the final, merged union.
|
|
643
|
+
*
|
|
644
|
+
* @type {(state: _State, t: _Thunk, op: _Thunk) => _State}
|
|
645
|
+
*/
|
|
646
|
+
const defer = (state, t, op) => {
|
|
647
|
+
const [state1] = ensureName(state, t)
|
|
648
|
+
return { ...state1, deferred: [...state1.deferred, [t, op]] }
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/** @type {(p: Primitive) => UnionSet} */
|
|
652
|
+
const primitiveUnion = p => {
|
|
653
|
+
switch (typeof p) {
|
|
654
|
+
case 'number': { return { number: [p] } }
|
|
655
|
+
case 'string': { return { string: [p] } }
|
|
656
|
+
case 'bigint': { return { bigint: [p] } }
|
|
657
|
+
default: { return { unit: unitBit(p) } }
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/**
|
|
662
|
+
* The union of a const container, memoized by identity.
|
|
663
|
+
*
|
|
664
|
+
* @type {(state: _State, c: ConstObject) => readonly [_State, UnionSet]}
|
|
665
|
+
*/
|
|
666
|
+
const containerMemo = (state, c) => {
|
|
667
|
+
const done = assoc(state.done, c)
|
|
668
|
+
if (done !== undefined) { return [state, done] }
|
|
669
|
+
const [state1, u] = containerUnion(state, c)
|
|
670
|
+
return [{ ...state1, done: [...state1.done, [c, u]] }, u]
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/** @type {(state: _State, c: ConstObject) => readonly [_State, UnionSet]} */
|
|
674
|
+
const containerUnion = (state, c) => {
|
|
675
|
+
let s = state
|
|
676
|
+
if (c instanceof Array) {
|
|
677
|
+
/** @type {readonly Node[]} */
|
|
678
|
+
let prefix = []
|
|
679
|
+
for (const item of c) {
|
|
680
|
+
const [s1, n] = nodeOf(s)(item)
|
|
681
|
+
s = s1
|
|
682
|
+
prefix = [...prefix, n]
|
|
683
|
+
}
|
|
684
|
+
return [s, arraySet(prefix, undefined)]
|
|
685
|
+
}
|
|
686
|
+
/** @type {readonly (readonly [string, Node])[]} */
|
|
687
|
+
let props = []
|
|
688
|
+
for (const [k, v] of Object.entries(c)) {
|
|
689
|
+
const [s1, n] = nodeOf(s)(v)
|
|
690
|
+
s = s1
|
|
691
|
+
props = [...props, [k, n]]
|
|
692
|
+
}
|
|
693
|
+
return [s, objectSet(props, undefined)]
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/** @type {(state: _State, c: Const) => readonly [_State, UnionSet]} */
|
|
697
|
+
const constUnion = (state, c) =>
|
|
698
|
+
c !== null && typeof c === 'object'
|
|
699
|
+
? containerMemo(state, c)
|
|
700
|
+
: [state, primitiveUnion(c)]
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* The union of the `or` operands of `t`.
|
|
704
|
+
*
|
|
705
|
+
* A direct self-operand is skipped: `X = A ∪ X` collapses to `X = A`. An
|
|
706
|
+
* operand whose union is not final — one still being converted (an ancestor
|
|
707
|
+
* on the recursion stack), or a named rule with its own merges pending — is
|
|
708
|
+
* {@link defer}red instead of merged eagerly.
|
|
709
|
+
*
|
|
710
|
+
* @type {(state: _State, t: _Thunk, operands: readonly Type[]) => readonly [_State, UnionSet]}
|
|
711
|
+
*/
|
|
712
|
+
const orUnion = (state, t, operands) => {
|
|
713
|
+
let s = state
|
|
714
|
+
let result = never
|
|
715
|
+
for (const op of operands) {
|
|
716
|
+
if (op === t) { continue }
|
|
717
|
+
if (op === null || (typeof op !== 'object' && typeof op !== 'function')) {
|
|
718
|
+
result = merge(result, primitiveUnion(op))
|
|
719
|
+
continue
|
|
720
|
+
}
|
|
721
|
+
if (typeof op !== 'function') {
|
|
722
|
+
const [s1, u] = containerMemo(s, op)
|
|
723
|
+
s = s1
|
|
724
|
+
result = merge(result, u)
|
|
725
|
+
continue
|
|
726
|
+
}
|
|
727
|
+
if (s.converting.some(k => k === op)) {
|
|
728
|
+
s = defer(s, t, op)
|
|
729
|
+
continue
|
|
730
|
+
}
|
|
731
|
+
let u = assoc(s.done, op)
|
|
732
|
+
if (u === undefined) {
|
|
733
|
+
const [s1, u1] = convertThunk(s, op)
|
|
734
|
+
s = s1
|
|
735
|
+
u = u1
|
|
736
|
+
}
|
|
737
|
+
if (s.deferred.some(([target]) => target === op)) {
|
|
738
|
+
s = defer(s, t, op)
|
|
739
|
+
} else {
|
|
740
|
+
result = merge(result, u)
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
return [s, result]
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/** @type {(state: _State, t: _Thunk) => readonly [_State, UnionSet]} */
|
|
747
|
+
const thunkUnion = (state, t) => {
|
|
748
|
+
const [tag, ...rest] = t()
|
|
749
|
+
switch (tag) {
|
|
750
|
+
case 'const': { return constUnion(state, /** @type {Const} */ (rest[0])) }
|
|
751
|
+
case 'boolean': { return [state, { unit: booleanUnits }] }
|
|
752
|
+
case 'number': { return [state, { number: true }] }
|
|
753
|
+
case 'string': { return [state, { string: true }] }
|
|
754
|
+
case 'bigint': { return [state, { bigint: true }] }
|
|
755
|
+
case 'unknown': { return [state, unknown] }
|
|
756
|
+
case 'array': {
|
|
757
|
+
const [state1, item] = nodeOf(state)(rest[0])
|
|
758
|
+
return [state1, arraySet([], item)]
|
|
759
|
+
}
|
|
760
|
+
case 'record': {
|
|
761
|
+
const [state1, value] = nodeOf(state)(rest[0])
|
|
762
|
+
return [state1, objectSet([], value)]
|
|
763
|
+
}
|
|
764
|
+
default: { return orUnion(state, t, rest) }
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
/**
|
|
769
|
+
* Computes and memoizes the union of a thunk.
|
|
770
|
+
*
|
|
771
|
+
* @type {(state: _State, t: _Thunk) => readonly [_State, UnionSet]}
|
|
772
|
+
*/
|
|
773
|
+
const convertThunk = (state, t) => {
|
|
774
|
+
const [state1, u] = thunkUnion({ ...state, converting: [...state.converting, t] }, t)
|
|
775
|
+
return [{
|
|
776
|
+
...state1,
|
|
777
|
+
converting: state1.converting.filter(k => k !== t),
|
|
778
|
+
done: [...state1.done, [t, u]],
|
|
779
|
+
}, u]
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Converts a schema into a {@link Node} for a nested position: a reference
|
|
784
|
+
* for named (recursive) thunks, an inline union for everything else.
|
|
785
|
+
*
|
|
786
|
+
* @type {(state: _State) => (t: Type) => readonly [_State, Node]}
|
|
787
|
+
*/
|
|
788
|
+
const nodeOf = state => t => {
|
|
789
|
+
if (t === null || (typeof t !== 'object' && typeof t !== 'function')) {
|
|
790
|
+
return [state, primitiveUnion(t)]
|
|
791
|
+
}
|
|
792
|
+
if (typeof t !== 'function') {
|
|
793
|
+
return containerMemo(state, t)
|
|
794
|
+
}
|
|
795
|
+
const name = assoc(state.names, t)
|
|
796
|
+
if (name !== undefined) { return [state, name] }
|
|
797
|
+
const done = assoc(state.done, t)
|
|
798
|
+
if (done !== undefined) { return [state, done] }
|
|
799
|
+
if (state.converting.some(k => k === t)) {
|
|
800
|
+
// a cycle: from here on, `t` is a named rule
|
|
801
|
+
const [state1, name1] = ensureName(state, t)
|
|
802
|
+
return [state1, name1]
|
|
803
|
+
}
|
|
804
|
+
const [state1] = convertThunk(state, t)
|
|
805
|
+
return nodeOf(state1)(t)
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Applies the deferred merges until nothing changes. Every round only grows
|
|
810
|
+
* unions with patterns drawn from the finite already-computed content, so
|
|
811
|
+
* the loop terminates.
|
|
812
|
+
*
|
|
813
|
+
* @type {(state: _State) => readonly (readonly [_Key, UnionSet])[]}
|
|
814
|
+
*/
|
|
815
|
+
const fixpoint = state => {
|
|
816
|
+
let done = state.done
|
|
817
|
+
let changed = true
|
|
818
|
+
while (changed) {
|
|
819
|
+
changed = false
|
|
820
|
+
for (const [target, source] of state.deferred) {
|
|
821
|
+
const targetUnion = assertNotNullish(assoc(done, target))
|
|
822
|
+
const merged = merge(targetUnion, assertNotNullish(assoc(done, source)))
|
|
823
|
+
if (cmpUnion(merged, targetUnion) !== 0) {
|
|
824
|
+
changed = true
|
|
825
|
+
done = done.map(e => e[0] === target ? /** @type {const} */ ([target, merged]) : e)
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
return done
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/** @type {(n: Node) => readonly string[]} */
|
|
833
|
+
const nodeRefs = n => typeof n === 'string' ? [n] : unionRefs(n)
|
|
834
|
+
|
|
835
|
+
/** @type {(rest: Node | undefined) => readonly string[]} */
|
|
836
|
+
const restRefs = rest => rest === undefined ? [] : nodeRefs(rest)
|
|
837
|
+
|
|
838
|
+
/** @type {(p: ArraySet) => readonly string[]} */
|
|
839
|
+
const arraySetRefs = p => [...p.prefix.flatMap(nodeRefs), ...restRefs(p.rest)]
|
|
840
|
+
|
|
841
|
+
/** @type {(p: ObjectSet) => readonly string[]} */
|
|
842
|
+
const objectSetRefs = p => [
|
|
843
|
+
...definedEntries(p.props).flatMap(([, v]) => nodeRefs(v)),
|
|
844
|
+
...restRefs(p.rest),
|
|
845
|
+
]
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* @template T
|
|
849
|
+
* @param {(p: T) => readonly string[]} f
|
|
850
|
+
* @returns {(k: KindSet<T> | undefined) => readonly string[]}
|
|
851
|
+
*/
|
|
852
|
+
const kindRefs = f => k => k === undefined || k === true ? [] : k.flatMap(f)
|
|
853
|
+
|
|
854
|
+
/** @type {(u: UnionSet) => readonly string[]} */
|
|
855
|
+
const unionRefs = u => [...kindRefs(arraySetRefs)(u.array), ...kindRefs(objectSetRefs)(u.object)]
|
|
856
|
+
|
|
857
|
+
/**
|
|
858
|
+
* All rule names reachable from `init` through rule bodies.
|
|
859
|
+
*
|
|
860
|
+
* @type {(rules: RuleSet, init: readonly string[]) => readonly string[]}
|
|
861
|
+
*/
|
|
862
|
+
const reachableFrom = (rules, init) => {
|
|
863
|
+
let result = dedup(init)
|
|
864
|
+
let frontier = result
|
|
865
|
+
while (frontier.length !== 0) {
|
|
866
|
+
const next = dedup(frontier
|
|
867
|
+
.flatMap(n => unionRefs(assertNotNullish(rules[n])))
|
|
868
|
+
.filter(n => !result.some(r => r === n)))
|
|
869
|
+
result = [...result, ...next]
|
|
870
|
+
frontier = next
|
|
871
|
+
}
|
|
872
|
+
return result
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/** @type {(rules: RuleSet) => RuleSet} */
|
|
876
|
+
const sortRules = rules =>
|
|
877
|
+
Object.fromEntries(definedEntries(rules).toSorted(([an], [bn]) => cmpString(an, bn)))
|
|
878
|
+
|
|
879
|
+
/**
|
|
880
|
+
* Converts a thunk-form schema into its canonical data form.
|
|
881
|
+
*
|
|
882
|
+
* Runs once per consumer need; schemas that are built but never consumed pay
|
|
883
|
+
* nothing. The output is normalized — unions are flattened and merged
|
|
884
|
+
* kind-wise, literals are sorted and deduplicated, subsumed array/object
|
|
885
|
+
* patterns are dropped, rules are pruned to the reachable set and sorted,
|
|
886
|
+
* and a union equal to a rule's body reads back as a reference — so schema
|
|
887
|
+
* identity is a property of this form: `toData(or(a, b))` and
|
|
888
|
+
* `toData(or(b, a))` are structurally identical even though the two thunks
|
|
889
|
+
* are distinct, and `or` is idempotent on recursive schemas.
|
|
890
|
+
*
|
|
891
|
+
* Only recursive definitions become named rules (named after their defining
|
|
892
|
+
* functions), everything else is inlined; a schema with no reference cycles
|
|
893
|
+
* converts to `[{}, unionSet]`.
|
|
894
|
+
*
|
|
895
|
+
* @type {(t: Type) => Data}
|
|
896
|
+
*/
|
|
897
|
+
export const toData = t => {
|
|
898
|
+
/** @type {_State} */
|
|
899
|
+
const empty = { converting: [], names: [], done: [], deferred: [] }
|
|
900
|
+
const [state, node] = nodeOf(empty)(t)
|
|
901
|
+
const done = fixpoint(state)
|
|
902
|
+
const ruleEntries = done.flatMap(
|
|
903
|
+
/** @returns {readonly (readonly [string, UnionSet])[]} */
|
|
904
|
+
([key, u]) => {
|
|
905
|
+
const name = assoc(state.names, key)
|
|
906
|
+
return name === undefined ? [] : [[name, u]]
|
|
907
|
+
})
|
|
908
|
+
/** @type {RuleSet} */
|
|
909
|
+
const rules = Object.fromEntries(ruleEntries)
|
|
910
|
+
/** @type {_Ctx} */
|
|
911
|
+
const ctx = [rules, rules]
|
|
912
|
+
/** @type {RuleSet} */
|
|
913
|
+
const collapsed = Object.fromEntries(definedEntries(rules).map(
|
|
914
|
+
([n, u]) => /** @type {const} */ ([n, collapseUnion(ctx)(u)])))
|
|
915
|
+
const entry = collapseNode(ctx)(node)
|
|
916
|
+
const keep = reachableFrom(collapsed, nodeRefs(entry))
|
|
917
|
+
/** @type {RuleSet} */
|
|
918
|
+
const kept = Object.fromEntries(definedEntries(collapsed).filter(([n]) => keep.some(k => k === n)))
|
|
919
|
+
if (typeof entry === 'string'
|
|
920
|
+
&& !definedValues(kept).some(u => unionRefs(u).some(r => r === entry))) {
|
|
921
|
+
// the entry rule is not referenced by any rule body — inline it
|
|
922
|
+
const entryUnion = assertNotNullish(kept[entry])
|
|
923
|
+
/** @type {RuleSet} */
|
|
924
|
+
const rest = Object.fromEntries(definedEntries(kept).filter(([n]) => n !== entry))
|
|
925
|
+
return internData(sortRules(rest), entryUnion)
|
|
926
|
+
}
|
|
927
|
+
return internData(sortRules(kept), entry)
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// ── data-driven validation ───────────────────────────────────────────────────
|
|
931
|
+
|
|
932
|
+
/** @type {(cond: boolean, value: Unknown) => ResultE} */
|
|
933
|
+
const checkValue = (cond, value) => cond ? ok(value) : verror('unexpected value')
|
|
934
|
+
|
|
935
|
+
/**
|
|
936
|
+
* @template T
|
|
937
|
+
* @param {(a: T, b: T) => boolean} eq
|
|
938
|
+
* @returns {(k: KindSet<T> | undefined, v: T) => boolean}
|
|
939
|
+
*/
|
|
940
|
+
const kindHas = eq => (k, v) => k !== undefined && (k === true || k.some(x => eq(x, v)))
|
|
941
|
+
|
|
942
|
+
/** `validate` has nothing to collect from a successful entry — only pass/fail matters. */
|
|
943
|
+
const noAccumulate = () => undefined
|
|
944
|
+
|
|
945
|
+
/**
|
|
946
|
+
* The first matching pattern wins; a single pattern's error is kept intact
|
|
947
|
+
* (paths included), several candidates report `no match` like `or` does.
|
|
948
|
+
*
|
|
949
|
+
* @template T
|
|
950
|
+
* @template {Unknown} V
|
|
951
|
+
* @param {KindSet<T> | undefined} k
|
|
952
|
+
* @param {(p: T) => (value: V) => ResultE} item
|
|
953
|
+
* @param {V} value
|
|
954
|
+
* @returns {ResultE}
|
|
955
|
+
*/
|
|
956
|
+
const patternsValidate = (k, item, value) => {
|
|
957
|
+
if (k === undefined) { return verror('unexpected value') }
|
|
958
|
+
if (k === true) { return ok(value) }
|
|
959
|
+
if (k.length === 1) { return item(k[0])(value) }
|
|
960
|
+
for (const p of k) {
|
|
961
|
+
const r = item(p)(value)
|
|
962
|
+
if (r[0] === 'ok') { return r }
|
|
963
|
+
}
|
|
964
|
+
return verror('no match')
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/** @type {(p: ArraySet, i: number) => Node} */
|
|
968
|
+
const atIndex = (p, i) => i < p.prefix.length ? p.prefix[i] : assertNotNullish(p.rest)
|
|
969
|
+
|
|
970
|
+
/** @type {(rules: RuleSet) => (p: ArraySet) => (value: readonly Unknown[]) => ResultE} */
|
|
971
|
+
const arraySetValidate = rules => p => value => {
|
|
972
|
+
const pn = p.prefix.length
|
|
973
|
+
if (p.rest === undefined ? value.length !== pn : value.length < pn) {
|
|
974
|
+
return verror('unexpected value')
|
|
975
|
+
}
|
|
976
|
+
const r = eachEntry(
|
|
977
|
+
Object.entries(value),
|
|
978
|
+
(k, v) => nodeValidate(rules)(atIndex(p, Number(k)))(v),
|
|
979
|
+
undefined,
|
|
980
|
+
noAccumulate,
|
|
981
|
+
)
|
|
982
|
+
return r[0] === 'error' ? r : ok(value)
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/** @type {(rules: RuleSet) => (p: ObjectSet) => (value: StringMap<Unknown>) => ResultE} */
|
|
986
|
+
const objectSetValidate = rules => p => value => {
|
|
987
|
+
const declared = eachEntry(
|
|
988
|
+
definedEntries(p.props),
|
|
989
|
+
(k, n) => nodeValidate(rules)(n)(value[k]),
|
|
990
|
+
undefined,
|
|
991
|
+
noAccumulate,
|
|
992
|
+
)
|
|
993
|
+
if (declared[0] === 'error') { return declared }
|
|
994
|
+
const { rest } = p
|
|
995
|
+
if (rest === undefined) { return ok(value) }
|
|
996
|
+
const extra = eachEntry(
|
|
997
|
+
Object.entries(value).filter(([k]) => at(k)(p.props) === null),
|
|
998
|
+
(_k, v) => nodeValidate(rules)(rest)(v),
|
|
999
|
+
undefined,
|
|
1000
|
+
noAccumulate,
|
|
1001
|
+
)
|
|
1002
|
+
return extra[0] === 'error' ? extra : ok(value)
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
/** @type {(rules: RuleSet) => (u: UnionSet) => (value: Unknown) => ResultE} */
|
|
1006
|
+
const unionValidate = rules => u => value => {
|
|
1007
|
+
if (typeof value === 'number') { return checkValue(kindHas(Object.is)(u.number, value), value) }
|
|
1008
|
+
if (typeof value === 'string') { return checkValue(kindHas(strictEqual)(u.string, value), value) }
|
|
1009
|
+
if (typeof value === 'bigint') { return checkValue(kindHas(strictEqual)(u.bigint, value), value) }
|
|
1010
|
+
if (value === null || value === undefined || typeof value === 'boolean') {
|
|
1011
|
+
return checkValue(((u.unit ?? 0) & unitBit(value)) !== 0, value)
|
|
1012
|
+
}
|
|
1013
|
+
if (isArray(value)) {
|
|
1014
|
+
return patternsValidate(u.array, arraySetValidate(rules), value)
|
|
1015
|
+
}
|
|
1016
|
+
return patternsValidate(u.object, objectSetValidate(rules), value)
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
/** @type {(rules: RuleSet) => (n: Node) => (value: Unknown) => ResultE} */
|
|
1020
|
+
const nodeValidate = rules => n => unionValidate(rules)(resolve(rules)(n))
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Data-driven validation — the counterpart of `../validate` that consumes a
|
|
1024
|
+
* {@link Data} produced by {@link toData} instead of walking the thunk
|
|
1025
|
+
* graph. Returns the original value on success, or the first
|
|
1026
|
+
* `{ path, message }` error.
|
|
1027
|
+
*
|
|
1028
|
+
* @type {(data: Data) => (value: Unknown) => ResultE}
|
|
1029
|
+
*/
|
|
1030
|
+
export const validate = ([rules, node]) => nodeValidate(rules)(node)
|