functionalscript 0.44.0 → 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/fjs/asn.1/proof.f.d.mts +5 -0
- package/fjs/asn.1/proof.f.mjs +15 -3
- package/fjs/asserts/module.f.d.mts +14 -0
- package/fjs/asserts/module.f.mjs +20 -0
- package/fjs/asserts/proof.f.d.mts +3 -0
- package/fjs/asserts/proof.f.mjs +15 -1
- package/fjs/basen/base128/proof.f.d.mts +3 -1
- package/fjs/basen/base128/proof.f.mjs +3 -1
- package/fjs/basen/base64/module.f.mjs +7 -3
- package/fjs/basen/base64/proof.f.d.mts +3 -1
- package/fjs/basen/base64/proof.f.mjs +7 -4
- package/fjs/basen/cbase32/proof.f.d.mts +3 -1
- package/fjs/basen/cbase32/proof.f.mjs +3 -1
- package/fjs/bnf/data/proof.f.mjs +0 -1
- package/fjs/bnf/descent/module.f.d.mts +17 -2
- package/fjs/bnf/descent/module.f.mjs +118 -41
- package/fjs/bnf/descent/proof.f.d.mts +1 -0
- package/fjs/bnf/descent/proof.f.mjs +77 -1
- package/fjs/bnf/descent/types.d.ts +12 -4
- package/fjs/bnf/ll1/module.f.d.mts +28 -2
- package/fjs/bnf/ll1/module.f.mjs +180 -38
- package/fjs/bnf/ll1/proof.f.d.mts +2 -0
- package/fjs/bnf/ll1/proof.f.mjs +62 -1
- package/fjs/bnf/ll1/types.d.ts +14 -8
- package/fjs/bnf/module.f.d.mts +15 -6
- package/fjs/bnf/module.f.mjs +52 -11
- package/fjs/bnf/proof.f.d.mts +2 -0
- package/fjs/bnf/proof.f.mjs +79 -3
- package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
- package/fjs/bnf/token_symbol/module.f.mjs +7 -6
- package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
- package/fjs/bnf/token_symbol/types.d.ts +2 -2
- package/fjs/bnf/types.d.ts +10 -3
- package/fjs/cas/cli/proof.f.d.mts +3 -1
- package/fjs/cas/cli/proof.f.mjs +3 -1
- package/fjs/cas/evo/module.f.d.mts +7 -13
- package/fjs/cas/evo/module.f.mjs +103 -96
- package/fjs/cas/evo/proof.f.mjs +6 -3
- package/fjs/cas/module.f.mjs +96 -109
- package/fjs/ci/common/module.f.d.mts +1 -1
- package/fjs/ci/common/module.f.mjs +1 -0
- package/fjs/ci/config/module.f.d.mts +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +4 -3
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +4 -2
- package/fjs/common/monoid/module.f.d.mts +70 -12
- package/fjs/common/monoid/module.f.mjs +177 -14
- package/fjs/common/monoid/proof.f.d.mts +12 -1
- package/fjs/common/monoid/proof.f.mjs +88 -4
- package/fjs/common/monoid/types.d.ts +23 -0
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +3 -1
- package/fjs/crypto/sha2/proof.f.mjs +3 -1
- package/fjs/crypto/vdf/module.f.d.mts +23 -4
- package/fjs/crypto/vdf/module.f.mjs +6 -4
- package/fjs/dev/module.f.d.mts +5 -2
- package/fjs/dev/module.f.mjs +5 -4
- package/fjs/dev/package_json/module.f.d.mts +7 -0
- package/fjs/dev/package_json/module.f.mjs +10 -7
- package/fjs/dev/update/module.f.d.mts +3 -0
- package/fjs/dev/update/module.f.mjs +3 -2
- package/fjs/dev/update/proof.f.d.mts +3 -0
- package/fjs/dev/update/proof.f.mjs +1 -2
- package/fjs/djs/parser/module.f.d.mts +3 -0
- package/fjs/djs/parser/module.f.mjs +18 -0
- package/fjs/djs/parser/proof.f.d.mts +3 -0
- package/fjs/djs/parser/proof.f.mjs +13 -1
- package/fjs/djs/proof.f.d.mts +3 -0
- package/fjs/djs/proof.f.mjs +4 -1
- package/fjs/djs/serializer/module.f.mjs +5 -4
- package/fjs/djs/tokenizer/module.f.mjs +21 -13
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +14 -2
- package/fjs/djs/transpiler/module.f.d.mts +1 -12
- package/fjs/djs/transpiler/module.f.mjs +1 -20
- package/fjs/djs/transpiler/types.d.ts +25 -0
- package/fjs/effects/eff/module.f.d.mts +10 -0
- package/fjs/effects/eff/module.f.mjs +4 -2
- package/fjs/effects/eff/proof.f.d.mts +3 -0
- package/fjs/effects/eff/proof.f.mjs +4 -1
- package/fjs/effects/list/module.f.d.mts +10 -2
- package/fjs/effects/list/module.f.mjs +4 -2
- package/fjs/effects/memory/module.f.d.mts +4 -2
- package/fjs/effects/memory/module.f.mjs +4 -3
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +5 -2
- package/fjs/effects/mock/module.f.d.mts +10 -2
- package/fjs/effects/mock/module.f.mjs +4 -2
- package/fjs/effects/module.d.mts +8 -0
- package/fjs/effects/module.f.d.mts +6 -4
- package/fjs/effects/module.f.mjs +6 -5
- package/fjs/effects/module.mjs +9 -1
- package/fjs/effects/node/memory/module.d.mts +3 -0
- package/fjs/effects/node/memory/module.mjs +3 -2
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +2 -1
- package/fjs/effects/node/module.d.mts +5 -0
- package/fjs/effects/node/module.f.d.mts +17 -12
- package/fjs/effects/node/module.f.mjs +6 -12
- package/fjs/effects/node/module.mjs +5 -17
- package/fjs/effects/node/virtual/module.f.d.mts +6 -3
- package/fjs/effects/node/virtual/module.f.mjs +6 -5
- package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
- package/fjs/effects/node/virtual/proof.f.mjs +13 -1
- package/fjs/effects/proof.f.d.mts +3 -0
- package/fjs/effects/proof.f.mjs +4 -1
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/module.f.d.mts +6 -1
- package/fjs/emergent_testing/module.f.mjs +40 -66
- package/fjs/emergent_testing/proof.f.mjs +5 -5
- package/fjs/fsc/bnf.f.d.mts +3 -0
- package/fjs/fsc/bnf.f.mjs +4 -1
- package/fjs/fsc/json.f.d.mts +3 -0
- package/fjs/fsc/json.f.mjs +4 -1
- package/fjs/fsc/module.f.d.mts +9 -0
- package/fjs/fsc/module.f.mjs +5 -3
- package/fjs/fsm/proof.f.d.mts +3 -0
- package/fjs/fsm/proof.f.mjs +4 -1
- package/fjs/js/tokenizer/module.f.d.mts +7 -0
- package/fjs/js/tokenizer/module.f.mjs +19 -55
- package/fjs/mcp/module.f.d.mts +36 -1
- package/fjs/mcp/module.f.mjs +9 -7
- package/fjs/mcp/proof.f.d.mts +11 -1
- package/fjs/mcp/proof.f.mjs +11 -18
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +6 -4
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/parser/module.f.d.mts +1 -1
- package/fjs/media/json/parser/module.f.mjs +25 -8
- package/fjs/media/json/parser/types.d.ts +5 -0
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +3 -3
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +228 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -0
- package/fjs/media/json/schema/proof.f.mjs +219 -7
- package/fjs/media/json/serializer/module.f.d.mts +13 -0
- package/fjs/media/json/serializer/module.f.mjs +7 -7
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +24 -5
- package/fjs/media/nix/module.f.d.mts +13 -0
- package/fjs/media/nix/module.f.mjs +4 -2
- package/fjs/media/nix/proof.f.d.mts +3 -0
- package/fjs/media/nix/proof.f.mjs +4 -1
- package/fjs/media/revision/module.f.d.mts +5 -0
- package/fjs/media/revision/module.f.mjs +8 -11
- package/fjs/media/revision/proof.f.d.mts +4 -0
- package/fjs/media/revision/proof.f.mjs +5 -2
- package/fjs/media/type/module.f.d.mts +28 -11
- package/fjs/media/type/module.f.mjs +69 -85
- package/fjs/media/type/proof.f.d.mts +16 -0
- package/fjs/media/type/proof.f.mjs +44 -4
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +4 -2
- package/fjs/module.mjs +6 -0
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +4 -0
- package/fjs/proof.f.mjs +5 -2
- package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
- package/fjs/protocol/json_rpc/module.f.mjs +7 -4
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
- package/fjs/protocol/mcp/proof.f.d.mts +4 -0
- package/fjs/protocol/mcp/proof.f.mjs +47 -24
- package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
- package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
- package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/sul/id/module.f.d.mts +5 -0
- package/fjs/sul/id/module.f.mjs +5 -4
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +4 -3
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +5 -2
- package/fjs/sul/level/literal/module.f.d.mts +4 -1
- package/fjs/sul/level/literal/module.f.mjs +4 -3
- package/fjs/sul/level/literal/proof.f.d.mts +3 -0
- package/fjs/sul/level/literal/proof.f.mjs +4 -1
- package/fjs/sul/module.f.d.mts +5 -3
- package/fjs/sul/module.f.mjs +5 -4
- package/fjs/sul/proof.f.d.mts +4 -0
- package/fjs/sul/proof.f.mjs +5 -2
- package/fjs/text/ascii/module.f.d.mts +26 -0
- package/fjs/text/ascii/module.f.mjs +49 -1
- package/fjs/text/ascii/proof.f.d.mts +10 -0
- package/fjs/text/ascii/proof.f.mjs +33 -1
- package/fjs/text/code_point/module.f.d.mts +21 -3
- package/fjs/text/code_point/module.f.mjs +24 -8
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +28 -0
- package/fjs/text/module.f.d.mts +4 -2
- package/fjs/text/module.f.mjs +4 -3
- package/fjs/text/proof.f.d.mts +3 -0
- package/fjs/text/proof.f.mjs +4 -1
- package/fjs/text/sgr/module.f.d.mts +4 -1
- package/fjs/text/sgr/module.f.mjs +4 -3
- package/fjs/text/sgr/proof.f.d.mts +3 -0
- package/fjs/text/sgr/proof.f.mjs +4 -1
- package/fjs/text/utf16/module.f.d.mts +5 -1
- package/fjs/text/utf16/module.f.mjs +31 -33
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +18 -1
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +16 -18
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +2 -2
- package/fjs/types/bigfloat/module.f.d.mts +21 -1
- package/fjs/types/bigfloat/module.f.mjs +33 -7
- package/fjs/types/bigfloat/proof.f.d.mts +1 -0
- package/fjs/types/bigfloat/proof.f.mjs +46 -0
- package/fjs/types/bigint/module.f.d.mts +4 -0
- package/fjs/types/bigint/module.f.mjs +4 -3
- package/fjs/types/bit_vec/module.f.d.mts +10 -14
- package/fjs/types/bit_vec/module.f.mjs +61 -71
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +29 -3
- package/fjs/types/btree/find/module.f.d.mts +5 -1
- package/fjs/types/btree/find/module.f.mjs +5 -5
- package/fjs/types/btree/find/proof.f.d.mts +5 -1
- package/fjs/types/btree/find/proof.f.mjs +5 -3
- package/fjs/types/btree/module.f.d.mts +3 -0
- package/fjs/types/btree/module.f.mjs +3 -2
- package/fjs/types/btree/proof.f.d.mts +5 -1
- package/fjs/types/btree/proof.f.mjs +5 -3
- package/fjs/types/btree/remove/module.f.d.mts +11 -0
- package/fjs/types/btree/remove/module.f.mjs +9 -9
- package/fjs/types/btree/remove/proof.f.d.mts +3 -0
- package/fjs/types/btree/remove/proof.f.mjs +4 -1
- package/fjs/types/btree/set/module.f.d.mts +9 -0
- package/fjs/types/btree/set/module.f.mjs +5 -6
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +4 -1
- package/fjs/types/btree/types/module.f.d.mts +2 -1
- package/fjs/types/btree/types/module.f.mjs +2 -1
- package/fjs/types/byte_set/module.f.d.mts +10 -1
- package/fjs/types/byte_set/module.f.mjs +5 -3
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +3 -1
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +3 -2
- package/fjs/types/function/module.f.d.mts +8 -1
- package/fjs/types/function/module.f.mjs +8 -1
- package/fjs/types/function/operator/module.f.d.mts +2 -1
- package/fjs/types/function/operator/module.f.mjs +2 -2
- package/fjs/types/list/module.f.d.mts +9 -2
- package/fjs/types/list/module.f.mjs +5 -3
- package/fjs/types/list/proof.f.d.mts +4 -1
- package/fjs/types/list/proof.f.mjs +4 -2
- package/fjs/types/nibble_set/module.f.d.mts +2 -1
- package/fjs/types/nibble_set/module.f.mjs +2 -2
- package/fjs/types/nominal/module.f.d.mts +2 -1
- package/fjs/types/nominal/module.f.mjs +2 -1
- package/fjs/types/nullable/module.f.d.mts +8 -2
- package/fjs/types/nullable/module.f.mjs +4 -2
- package/fjs/types/number/module.f.d.mts +4 -0
- package/fjs/types/number/module.f.mjs +4 -3
- package/fjs/types/object/module.f.d.mts +14 -2
- package/fjs/types/object/module.f.mjs +15 -6
- package/fjs/types/object/proof.f.d.mts +5 -2
- package/fjs/types/object/proof.f.mjs +6 -3
- 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/ordered_map/module.f.d.mts +5 -0
- package/fjs/types/ordered_map/module.f.mjs +5 -4
- package/fjs/types/ordered_map/proof.f.d.mts +3 -0
- package/fjs/types/ordered_map/proof.f.mjs +4 -1
- package/fjs/types/patricia_trie/module.f.d.mts +2 -1
- package/fjs/types/patricia_trie/module.f.mjs +2 -2
- package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
- package/fjs/types/patricia_trie/proof.f.mjs +4 -1
- package/fjs/types/prime_field/module.f.d.mts +3 -1
- package/fjs/types/prime_field/module.f.mjs +3 -2
- package/fjs/types/range/module.f.d.mts +2 -1
- package/fjs/types/range/module.f.mjs +2 -2
- package/fjs/types/range_map/module.f.d.mts +6 -0
- package/fjs/types/range_map/module.f.mjs +6 -9
- package/fjs/types/range_map/proof.f.d.mts +5 -1
- package/fjs/types/range_map/proof.f.mjs +5 -3
- package/fjs/types/range_set/module.f.d.mts +5 -0
- package/fjs/types/range_set/module.f.mjs +1 -0
- package/fjs/types/range_set/proof.f.d.mts +3 -0
- package/fjs/types/range_set/proof.f.mjs +4 -1
- package/fjs/types/result/module.d.mts +8 -0
- package/fjs/types/result/module.f.d.mts +37 -7
- package/fjs/types/result/module.f.mjs +38 -8
- package/fjs/types/result/module.mjs +9 -1
- package/fjs/types/result/proof.f.d.mts +5 -0
- package/fjs/types/result/proof.f.mjs +22 -2
- package/fjs/types/rtti/common/module.f.d.mts +35 -2
- package/fjs/types/rtti/common/module.f.mjs +9 -7
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +5 -2
- 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 +12 -5
- package/fjs/types/rtti/module.f.mjs +7 -5
- package/fjs/types/rtti/parse/module.f.d.mts +38 -0
- package/fjs/types/rtti/parse/module.f.mjs +9 -7
- package/fjs/types/rtti/parse/proof.f.mjs +18 -38
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +262 -30
- package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
- package/fjs/types/rtti/ts/proof.f.mjs +152 -4
- package/fjs/types/rtti/ts/types.d.ts +11 -0
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/rtti/validate/module.f.d.mts +36 -1
- package/fjs/types/rtti/validate/module.f.mjs +6 -4
- package/fjs/types/sorted_list/module.f.d.mts +4 -1
- package/fjs/types/sorted_list/module.f.mjs +21 -12
- package/fjs/types/sorted_list/proof.f.d.mts +3 -1
- package/fjs/types/sorted_list/proof.f.mjs +3 -1
- package/fjs/types/sorted_set/module.f.d.mts +31 -1
- package/fjs/types/sorted_set/module.f.mjs +4 -2
- package/fjs/types/sorted_set/proof.f.d.mts +3 -1
- package/fjs/types/sorted_set/proof.f.mjs +3 -1
- package/fjs/types/string/module.f.d.mts +4 -0
- package/fjs/types/string/module.f.mjs +4 -3
- package/fjs/types/string_set/module.f.d.mts +3 -1
- package/fjs/types/string_set/module.f.mjs +3 -2
- package/fjs/types/ts/module.f.d.mts +2 -0
- package/fjs/types/ts/module.f.mjs +3 -3
- package/fjs/types/ts/proof.f.d.mts +1 -0
- package/fjs/types/ts/proof.f.mjs +5 -0
- package/fjs/types/ts/types.d.ts +6 -1
- package/fjs/types/uint8array/module.f.d.mts +13 -2
- package/fjs/types/uint8array/module.f.mjs +20 -15
- package/fjs/website/module.f.d.mts +3 -0
- package/fjs/website/module.f.mjs +3 -2
- package/package.json +3 -3
- package/fjs/asn.1/types.js +0 -6
- package/fjs/asserts/types.js +0 -6
- package/fjs/basen/types.js +0 -6
- package/fjs/bnf/data/types.js +0 -6
- package/fjs/bnf/descent/types.js +0 -6
- package/fjs/bnf/ll1/types.js +0 -6
- package/fjs/bnf/token_symbol/types.js +0 -6
- package/fjs/bnf/types.js +0 -6
- package/fjs/cas/evo/types.js +0 -7
- package/fjs/cas/types.js +0 -6
- package/fjs/ci/common/types.js +0 -1
- package/fjs/ci/nix/types.js +0 -6
- package/fjs/ci/types.js +0 -6
- package/fjs/cli/types.js +0 -6
- package/fjs/common/monoid/types.js +0 -6
- package/fjs/crypto/pow/types.js +0 -6
- package/fjs/crypto/secp/types.js +0 -6
- package/fjs/crypto/sha2/types.js +0 -6
- package/fjs/crypto/sign/types.js +0 -6
- package/fjs/crypto/vdf/types.js +0 -6
- package/fjs/dev/types.js +0 -6
- package/fjs/djs/ast/types.js +0 -8
- package/fjs/djs/parser/types.js +0 -7
- package/fjs/djs/tokenizer/types.js +0 -7
- package/fjs/djs/types.js +0 -7
- package/fjs/effects/eff/types.js +0 -6
- package/fjs/effects/list/types.js +0 -6
- package/fjs/effects/memory/types.js +0 -6
- package/fjs/effects/mock/types.js +0 -6
- package/fjs/effects/node/types.js +0 -6
- package/fjs/effects/node/virtual/types.js +0 -7
- package/fjs/effects/types.js +0 -6
- package/fjs/emergent_testing/all.test.d.ts +0 -1
- package/fjs/emergent_testing/all.test.js +0 -5
- 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/emergent_testing/types.js +0 -6
- package/fjs/js/tokenizer/types.js +0 -6
- package/fjs/media/html/types.js +0 -6
- package/fjs/media/json/parser/types.js +0 -6
- package/fjs/media/json/tokenizer/types.js +0 -6
- package/fjs/media/json/types.js +0 -13
- package/fjs/media/nix/types.js +0 -6
- package/fjs/media/revision/types.js +0 -8
- package/fjs/media/type/types.js +0 -6
- package/fjs/media/types.js +0 -7
- package/fjs/nanvm/types.js +0 -11
- package/fjs/protocol/json_rpc/types.js +0 -8
- package/fjs/protocol/mcp/types.js +0 -8
- package/fjs/sul/id/types.js +0 -6
- package/fjs/sul/level/hash/types.js +0 -6
- package/fjs/sul/level/literal/types.js +0 -6
- package/fjs/sul/types.js +0 -6
- package/fjs/text/sgr/types.js +0 -6
- package/fjs/text/types.js +0 -6
- package/fjs/text/utf16/types.js +0 -6
- package/fjs/text/utf8/types.js +0 -6
- package/fjs/types/array/types.js +0 -6
- package/fjs/types/bigfloat/types.js +0 -6
- package/fjs/types/bigint/types.js +0 -6
- package/fjs/types/bit_vec/types.js +0 -6
- package/fjs/types/btree/find/types.js +0 -6
- package/fjs/types/btree/types/types.js +0 -6
- package/fjs/types/byte_set/types.js +0 -6
- package/fjs/types/function/compare/types.js +0 -6
- package/fjs/types/function/operator/types.js +0 -6
- package/fjs/types/function/types.js +0 -6
- package/fjs/types/list/types.js +0 -6
- package/fjs/types/nibble_set/types.js +0 -6
- package/fjs/types/nominal/types.js +0 -6
- package/fjs/types/nullable/types.js +0 -6
- package/fjs/types/object/types.js +0 -8
- package/fjs/types/option/types.js +0 -6
- package/fjs/types/ordered_map/types.js +0 -6
- package/fjs/types/patricia_trie/types.js +0 -6
- package/fjs/types/phantom/types.js +0 -11
- package/fjs/types/prime_field/types.js +0 -6
- package/fjs/types/range/types.js +0 -6
- package/fjs/types/range_map/types.js +0 -6
- package/fjs/types/result/types.js +0 -6
- package/fjs/types/rtti/common/types.js +0 -1
- package/fjs/types/rtti/parse/types.js +0 -1
- package/fjs/types/rtti/ts/types.js +0 -1
- package/fjs/types/rtti/types.js +0 -1
- package/fjs/types/rtti/validate/types.js +0 -1
- package/fjs/types/sorted_list/types.js +0 -6
- package/fjs/types/sorted_set/types.js +0 -6
- package/fjs/types/string_set/types.js +0 -6
- package/fjs/types/ts/types.js +0 -8
package/fjs/asn.1/proof.f.d.mts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../types/bit_vec/types.ts'
|
|
3
|
+
* @import { SupportedRecord, ObjectIdentifier } from './types.ts'
|
|
4
|
+
*/
|
|
1
5
|
export declare const proof: {
|
|
2
6
|
encodeSmall: () => void;
|
|
3
7
|
encode7F: () => void;
|
|
@@ -38,6 +42,7 @@ export declare const proof: {
|
|
|
38
42
|
integer: () => void;
|
|
39
43
|
sequence: () => void;
|
|
40
44
|
set: () => void;
|
|
45
|
+
objectIdentifier: () => void;
|
|
41
46
|
};
|
|
42
47
|
objectIdentifier: {
|
|
43
48
|
simple: () => void;
|
package/fjs/asn.1/proof.f.mjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
import {
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../types/bit_vec/types.ts'
|
|
3
|
+
* @import { SupportedRecord, ObjectIdentifier } from './types.ts'
|
|
4
|
+
*/
|
|
3
5
|
|
|
6
|
+
import { empty, isVec, length, msb, uint, unpack, vec, vec8 } from '../types/bit_vec/module.f.mjs'
|
|
4
7
|
import { asBase } from '../types/nominal/module.f.mjs'
|
|
5
8
|
|
|
6
9
|
import {
|
|
@@ -15,10 +18,10 @@ import {
|
|
|
15
18
|
octetString,
|
|
16
19
|
boolean,
|
|
17
20
|
constructedSet,
|
|
21
|
+
objectIdentifier,
|
|
18
22
|
encodeObjectIdentifier,
|
|
19
23
|
decodeObjectIdentifier,
|
|
20
24
|
} from './module.f.mjs'
|
|
21
|
-
/** @import { SupportedRecord, ObjectIdentifier } from './types.ts' */
|
|
22
25
|
|
|
23
26
|
import { assert, assertEq } from '../asserts/module.f.mjs'
|
|
24
27
|
|
|
@@ -252,6 +255,15 @@ export const proof = {
|
|
|
252
255
|
])
|
|
253
256
|
)
|
|
254
257
|
},
|
|
258
|
+
objectIdentifier: () => {
|
|
259
|
+
// exercises the objectIdentifier case in recordToRaw/rawToRecord
|
|
260
|
+
// via the generic encode/decode dispatch (the objectIdentifier
|
|
261
|
+
// tests below only call encodeObjectIdentifier/decodeObjectIdentifier
|
|
262
|
+
// directly, never through decode()).
|
|
263
|
+
/** @type {SupportedRecord} */
|
|
264
|
+
const r = [objectIdentifier, [1n, 2n, 840n, 113549n]]
|
|
265
|
+
ch0(r, encode(r), empty)
|
|
266
|
+
},
|
|
255
267
|
},
|
|
256
268
|
objectIdentifier: {
|
|
257
269
|
simple: () => {
|
|
@@ -24,6 +24,20 @@ export declare const assert: (v: boolean, msg?: unknown) => asserts v;
|
|
|
24
24
|
* @type {<T>(...x: readonly[T, T, unknown?]) => void}
|
|
25
25
|
*/
|
|
26
26
|
export declare const assertEq: <T>(...x: readonly [T, T, unknown?]) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Asserts that `a` and `b` are structurally the same — equal leaves under the
|
|
29
|
+
* same shape, property order irrelevant — throwing `x` (the `[a, b]` pair, plus
|
|
30
|
+
* an optional third element used as an extra message) if they differ.
|
|
31
|
+
*
|
|
32
|
+
* This is the assertion to reach for when comparing two independently
|
|
33
|
+
* constructed values. `assertEq` is `===`, so it only ever answers "the same
|
|
34
|
+
* reference?" for objects, which is why proofs fell back to comparing
|
|
35
|
+
* `JSON.stringify` output; see `types/object/structurally_same/README.md` for
|
|
36
|
+
* why that is the wrong question and what this one does *not* cover.
|
|
37
|
+
*
|
|
38
|
+
* @type {(...x: readonly[unknown, unknown, unknown?]) => void}
|
|
39
|
+
*/
|
|
40
|
+
export declare const assertStructurallySame: (...x: readonly [unknown, unknown, unknown?]) => void;
|
|
27
41
|
/**
|
|
28
42
|
* Asserts that `a` is neither `null` nor `undefined` and returns it,
|
|
29
43
|
* narrowed to `T`.
|
package/fjs/asserts/module.f.mjs
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { structurallySame } from '../types/object/structurally_same/module.f.mjs'
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* Marks a code path as unimplemented. Always throws.
|
|
9
11
|
* @type {() => never}
|
|
@@ -33,6 +35,24 @@ export const assertEq = (...x) => {
|
|
|
33
35
|
assert(a === b, x)
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Asserts that `a` and `b` are structurally the same — equal leaves under the
|
|
40
|
+
* same shape, property order irrelevant — throwing `x` (the `[a, b]` pair, plus
|
|
41
|
+
* an optional third element used as an extra message) if they differ.
|
|
42
|
+
*
|
|
43
|
+
* This is the assertion to reach for when comparing two independently
|
|
44
|
+
* constructed values. `assertEq` is `===`, so it only ever answers "the same
|
|
45
|
+
* reference?" for objects, which is why proofs fell back to comparing
|
|
46
|
+
* `JSON.stringify` output; see `types/object/structurally_same/README.md` for
|
|
47
|
+
* why that is the wrong question and what this one does *not* cover.
|
|
48
|
+
*
|
|
49
|
+
* @type {(...x: readonly[unknown, unknown, unknown?]) => void}
|
|
50
|
+
*/
|
|
51
|
+
export const assertStructurallySame = (...x) => {
|
|
52
|
+
const [a, b] = x
|
|
53
|
+
assert(structurallySame(a, b), x)
|
|
54
|
+
}
|
|
55
|
+
|
|
36
56
|
/**
|
|
37
57
|
* Asserts that `a` is neither `null` nor `undefined` and returns it,
|
|
38
58
|
* narrowed to `T`.
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export declare const proof: {
|
|
2
2
|
assertPassesOnTrue: () => void;
|
|
3
3
|
assertEqPassesOnEqual: () => void;
|
|
4
|
+
assertStructurallySamePassesOnSame: () => void;
|
|
4
5
|
throw: {
|
|
5
6
|
assertEqThrowsOnUnequal: () => void;
|
|
6
7
|
assertEqThrowsOnUnequal3: () => void;
|
|
8
|
+
assertStructurallySameThrowsOnDifferent: () => void;
|
|
9
|
+
assertStructurallySameThrowsOnDifferent3: () => void;
|
|
7
10
|
assertThrowsDefaultMsg: () => void;
|
|
8
11
|
assertThrowsCustomMsg: () => void;
|
|
9
12
|
todoThrows: () => never;
|
package/fjs/asserts/proof.f.mjs
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
assert,
|
|
3
|
+
assertEq,
|
|
4
|
+
assertStructurallySame,
|
|
5
|
+
todo,
|
|
6
|
+
} from './module.f.mjs'
|
|
2
7
|
|
|
3
8
|
export const proof = {
|
|
4
9
|
assertPassesOnTrue: () => {
|
|
@@ -9,9 +14,18 @@ export const proof = {
|
|
|
9
14
|
assertEq(1, 1)
|
|
10
15
|
assertEq('x', 'x')
|
|
11
16
|
},
|
|
17
|
+
assertStructurallySamePassesOnSame: () => {
|
|
18
|
+
// the case `assertEq` cannot do: two separately built values
|
|
19
|
+
assertStructurallySame({ a: 1, b: [2, { c: 3 }] }, { b: [2, { c: 3 }], a: 1 })
|
|
20
|
+
assertStructurallySame(1, 1, 'with message')
|
|
21
|
+
},
|
|
12
22
|
throw: {
|
|
13
23
|
assertEqThrowsOnUnequal: () => assertEq(1, 2),
|
|
14
24
|
assertEqThrowsOnUnequal3: () => assertEq(1, 2, "message"),
|
|
25
|
+
assertStructurallySameThrowsOnDifferent:
|
|
26
|
+
() => assertStructurallySame({ a: 1 }, { a: 2 }),
|
|
27
|
+
assertStructurallySameThrowsOnDifferent3:
|
|
28
|
+
() => assertStructurallySame({ a: 1 }, { a: 2 }, 'message'),
|
|
15
29
|
assertThrowsDefaultMsg: () => assert(false),
|
|
16
30
|
assertThrowsCustomMsg: () => assert(false, 'oops'),
|
|
17
31
|
todoThrows: () => todo(),
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @import { Nullable } from '../../types/nullable/types.ts'
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { msb, length, vec
|
|
10
|
+
import { msb, length, vec } from '../../types/bit_vec/module.f.mjs'
|
|
11
11
|
import { baseN } from "../module.f.mjs"
|
|
12
12
|
|
|
13
13
|
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
@@ -61,8 +61,12 @@ export const decode = input => {
|
|
|
61
61
|
const lastChunk = stringToVec(body.slice(body.length - 1))
|
|
62
62
|
if (lastChunk === null) { return null }
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
// No `head`/`realBits` overflow check is needed here: `head` is built
|
|
65
|
+
// from whole 6-bit chunks, so its length is always a multiple of 6, and
|
|
66
|
+
// the largest such length `stringToVec` can return without itself
|
|
67
|
+
// failing is `maxLength - (maxLength % 6)` = `maxLength - 4`. Adding
|
|
68
|
+
// `realBits` (at most 4, when `padChars` is 1) reaches `maxLength`
|
|
69
|
+
// exactly and never exceeds it.
|
|
66
70
|
const [kept, pad] = popFront(realBits)(lastChunk)
|
|
67
71
|
// Padding bits must be zero (RFC 4648 §3.5).
|
|
68
72
|
if (pad !== vec(removeBits)(0n)) { return null }
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
3
|
+
*/
|
|
2
4
|
|
|
3
5
|
import { assertEq } from '../../asserts/module.f.mjs'
|
|
4
6
|
import { empty, vec, repeat, vec8, maxLength } from '../../types/bit_vec/module.f.mjs'
|
|
@@ -100,9 +102,10 @@ export const proof = {
|
|
|
100
102
|
// ...and an invalid final character (the one holding the padding
|
|
101
103
|
// bits) must be rejected via the last-character decode.
|
|
102
104
|
assertEq(decode('A!=='), null)
|
|
103
|
-
// Same as `decodeOverflow`, but with a padded tail
|
|
104
|
-
//
|
|
105
|
-
//
|
|
105
|
+
// Same as `decodeOverflow`, but with a padded tail: `head` (all
|
|
106
|
+
// characters but the last) is still over `maxLength` on its own, so
|
|
107
|
+
// this is rejected by `head`'s own `stringToVec` overflow check, not
|
|
108
|
+
// by a separate `head`-plus-`realBits` measurement.
|
|
106
109
|
assertEq(decode('A'.repeat(174_764) + '='), null)
|
|
107
110
|
},
|
|
108
111
|
encodeAtMaxLengthSucceeds: () => {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
3
|
+
*/
|
|
2
4
|
|
|
3
5
|
import { empty, vec } from '../../types/bit_vec/module.f.mjs'
|
|
4
6
|
import { cBase32ToVec, cBase32ToVec5x, vec5xToCBase32, vecToCBase32 } from './module.f.mjs'
|
package/fjs/bnf/data/proof.f.mjs
CHANGED
|
@@ -9,7 +9,6 @@ import { sort } from '../../types/object/module.f.mjs'
|
|
|
9
9
|
import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs'
|
|
10
10
|
import { emptyTagMap, toData } from './module.f.mjs'
|
|
11
11
|
import { assertEq } from '../../asserts/module.f.mjs'
|
|
12
|
-
|
|
13
12
|
import { stringify } from '../../media/json/module.f.mjs'
|
|
14
13
|
import { classic, deterministic } from '../testlib.f.mjs'
|
|
15
14
|
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
|
|
8
8
|
* computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
9
9
|
*
|
|
10
|
+
* The caller passes physical symbols only; the matcher synthesizes the one
|
|
11
|
+
* logical EOF ({@link eofSymbol}) after them, so a grammar can require the end
|
|
12
|
+
* of input with the `eof` terminal.
|
|
13
|
+
*
|
|
10
14
|
* A failed result also carries a {@link DescentFailure}: the furthest position a
|
|
11
15
|
* terminal was rejected at, which — unlike the result's own index — never
|
|
12
16
|
* rewinds and is what diagnostics should be built from.
|
|
@@ -18,10 +22,21 @@
|
|
|
18
22
|
* @import { TerminalRange } from '../types.ts'
|
|
19
23
|
* @import { Rule as DataRule, Sequence } from '../data/types.ts'
|
|
20
24
|
* @import { Rule as FRule } from '../types.ts'
|
|
21
|
-
* @import { AstTag, AstSequenceMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
25
|
+
* @import { AstRuleMeta, AstTag, AstSequenceMeta, CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
22
26
|
*/
|
|
27
|
+
import type { TerminalRange } from '../types.ts';
|
|
23
28
|
import type { Rule as FRule } from '../types.ts';
|
|
24
|
-
import type { DescentMatch } from './types.ts';
|
|
29
|
+
import type { AstRuleMeta, DescentMatch } from './types.ts';
|
|
30
|
+
export type _Cursor = number;
|
|
31
|
+
export type _Failure = {
|
|
32
|
+
readonly pos: _Cursor;
|
|
33
|
+
readonly expected: readonly TerminalRange[];
|
|
34
|
+
};
|
|
35
|
+
export type _Result<T> = {
|
|
36
|
+
readonly ast: AstRuleMeta<T>;
|
|
37
|
+
readonly success: boolean;
|
|
38
|
+
readonly pos: _Cursor;
|
|
39
|
+
};
|
|
25
40
|
/**
|
|
26
41
|
* Creates a recursive descent parser that preserves metadata for each consumed
|
|
27
42
|
* code point.
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
|
|
8
8
|
* computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
9
9
|
*
|
|
10
|
+
* The caller passes physical symbols only; the matcher synthesizes the one
|
|
11
|
+
* logical EOF ({@link eofSymbol}) after them, so a grammar can require the end
|
|
12
|
+
* of input with the `eof` terminal.
|
|
13
|
+
*
|
|
10
14
|
* A failed result also carries a {@link DescentFailure}: the furthest position a
|
|
11
15
|
* terminal was rejected at, which — unlike the result's own index — never
|
|
12
16
|
* rewinds and is what diagnostics should be built from.
|
|
@@ -18,25 +22,89 @@
|
|
|
18
22
|
* @import { TerminalRange } from '../types.ts'
|
|
19
23
|
* @import { Rule as DataRule, Sequence } from '../data/types.ts'
|
|
20
24
|
* @import { Rule as FRule } from '../types.ts'
|
|
21
|
-
* @import { AstTag, AstSequenceMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
25
|
+
* @import { AstRuleMeta, AstTag, AstSequenceMeta, CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
22
26
|
*/
|
|
23
27
|
|
|
24
|
-
import { rangeDecode } from '../module.f.mjs'
|
|
28
|
+
import { eofSymbol, rangeDecode } from '../module.f.mjs'
|
|
25
29
|
import { contains as rangeContains } from '../../types/range/module.f.mjs'
|
|
26
30
|
import { definedEntries } from '../../types/object/module.f.mjs'
|
|
27
31
|
import { emptyTagMap, toData } from '../data/module.f.mjs'
|
|
28
32
|
|
|
33
|
+
/**
|
|
34
|
+
* A match position that includes EOF consumption: `0 .. cp.length` are the
|
|
35
|
+
* physical positions, and `cp.length + 1` is where the one synthesized EOF has
|
|
36
|
+
* been consumed.
|
|
37
|
+
*
|
|
38
|
+
* This is the complete cursor the design calls `(idx, eofConsumed)`, written as
|
|
39
|
+
* one number: `eofConsumed` can only be true at the physical end, so the pair
|
|
40
|
+
* and the extended position hold the same information, and comparing cursors
|
|
41
|
+
* compares progress — consuming EOF *is* progress even though the public index
|
|
42
|
+
* does not move.
|
|
43
|
+
*
|
|
44
|
+
* @typedef {number} _Cursor
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The furthest-failure record while matching, positioned by the complete
|
|
49
|
+
* cursor. {@link DescentFailure} is its public, physically-positioned form.
|
|
50
|
+
*
|
|
51
|
+
* @typedef {{
|
|
52
|
+
* readonly pos: _Cursor
|
|
53
|
+
* readonly expected: readonly TerminalRange[]
|
|
54
|
+
* }} _Failure
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The machine's own result: a {@link DescentMatchResult} positioned by the
|
|
59
|
+
* complete cursor, and with no failure record — that one is tracked per match
|
|
60
|
+
* rather than per frame.
|
|
61
|
+
*
|
|
62
|
+
* @template T
|
|
63
|
+
* @typedef {{
|
|
64
|
+
* readonly ast: AstRuleMeta<T>
|
|
65
|
+
* readonly success: boolean
|
|
66
|
+
* readonly pos: _Cursor
|
|
67
|
+
* }} _Result
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The public, physical index of a cursor. Consuming EOF moves the cursor past
|
|
72
|
+
* the physical end, and both cursors report `input.length`.
|
|
73
|
+
*
|
|
74
|
+
* @type {(length: number) => (pos: _Cursor) => number}
|
|
75
|
+
*/
|
|
76
|
+
const physicalIdx = length => pos => Math.min(pos, length)
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The semantic symbol a cursor points at: a code point inside the physical
|
|
80
|
+
* input, and the synthesized {@link eofSymbol} at its end. Only meaningful
|
|
81
|
+
* where the cursor still has a symbol, `pos <= cp.length`.
|
|
82
|
+
*
|
|
83
|
+
* @type {<T>(cp: readonly CodePointMeta<T>[], pos: _Cursor) => number}
|
|
84
|
+
*/
|
|
85
|
+
const symbolAt = (cp, pos) => pos < cp.length ? cp[pos][0] : eofSymbol
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* What consuming the symbol at a cursor contributes to the AST: the code point
|
|
89
|
+
* with its metadata, and nothing for the synthesized EOF — it has no physical
|
|
90
|
+
* source element.
|
|
91
|
+
*
|
|
92
|
+
* @type {<T>(cp: readonly CodePointMeta<T>[], pos: _Cursor) => AstSequenceMeta<T>}
|
|
93
|
+
*/
|
|
94
|
+
const leafAt = (cp, pos) => pos < cp.length ? [cp[pos]] : []
|
|
95
|
+
|
|
29
96
|
/**
|
|
30
97
|
* Folds one rejected terminal into the furthest-failure record: further along
|
|
31
|
-
* replaces, the same
|
|
32
|
-
* discarded.
|
|
98
|
+
* replaces, the same cursor accumulates (ignoring repeats), earlier is
|
|
99
|
+
* discarded. The comparison is on the complete cursor, so a failure after EOF
|
|
100
|
+
* was consumed is further than one at the same physical index before it.
|
|
33
101
|
*
|
|
34
|
-
* @type {(failure:
|
|
102
|
+
* @type {(failure: _Failure, pos: _Cursor, terminal: TerminalRange) => _Failure}
|
|
35
103
|
*/
|
|
36
|
-
const recordFailure = (failure,
|
|
37
|
-
if (
|
|
38
|
-
if (
|
|
39
|
-
return {
|
|
104
|
+
const recordFailure = (failure, pos, terminal) => {
|
|
105
|
+
if (pos > failure.pos) { return { pos, expected: [terminal] } }
|
|
106
|
+
if (pos < failure.pos || failure.expected.includes(terminal)) { return failure }
|
|
107
|
+
return { pos, expected: [...failure.expected, terminal] }
|
|
40
108
|
}
|
|
41
109
|
|
|
42
110
|
/**
|
|
@@ -51,6 +119,11 @@ export const descentParser = fr => {
|
|
|
51
119
|
const data = toData(fr)
|
|
52
120
|
const emptyTags = emptyTagMap(data[0])
|
|
53
121
|
|
|
122
|
+
/** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, pos: _Cursor) => _Result<T>} */
|
|
123
|
+
const mrSuccess = (tag, sequence, pos) => ({ ast: {tag, sequence}, success: true, pos })
|
|
124
|
+
/** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, pos: _Cursor) => _Result<T>} */
|
|
125
|
+
const mrFail = (tag, sequence, pos) => ({ ast: {tag, sequence}, success: false, pos })
|
|
126
|
+
|
|
54
127
|
// A suspended sequence match: items[itemIndex] is being matched by the current
|
|
55
128
|
// task; `seq` holds the ASTs of the items already matched.
|
|
56
129
|
/**
|
|
@@ -59,7 +132,7 @@ export const descentParser = fr => {
|
|
|
59
132
|
* readonly tag: AstTag
|
|
60
133
|
* readonly items: Sequence
|
|
61
134
|
* readonly itemIndex: number
|
|
62
|
-
* readonly
|
|
135
|
+
* readonly startPos: _Cursor
|
|
63
136
|
* readonly seq: AstSequenceMeta<T>
|
|
64
137
|
* }} _SeqFrame
|
|
65
138
|
*/
|
|
@@ -72,8 +145,8 @@ export const descentParser = fr => {
|
|
|
72
145
|
* readonly kind: 'variant'
|
|
73
146
|
* readonly entries: readonly (readonly [string, string])[]
|
|
74
147
|
* readonly entryIndex: number
|
|
75
|
-
* readonly
|
|
76
|
-
* readonly emptyResult:
|
|
148
|
+
* readonly pos: _Cursor
|
|
149
|
+
* readonly emptyResult: _Result<T>
|
|
77
150
|
* }} _VariantFrame
|
|
78
151
|
*/
|
|
79
152
|
|
|
@@ -93,7 +166,7 @@ export const descentParser = fr => {
|
|
|
93
166
|
* @typedef {{
|
|
94
167
|
* readonly name: string
|
|
95
168
|
* readonly tag: AstTag
|
|
96
|
-
* readonly
|
|
169
|
+
* readonly pos: _Cursor
|
|
97
170
|
* }} _Task
|
|
98
171
|
*/
|
|
99
172
|
|
|
@@ -104,29 +177,26 @@ export const descentParser = fr => {
|
|
|
104
177
|
// grammar recursion depth — right-recursive rules (e.g. repeat0Plus chains) no longer
|
|
105
178
|
// overflow on long input (see the longInput proof group).
|
|
106
179
|
/** @type {DescentMatchRule<T>} */
|
|
107
|
-
const f = (name, tag, cp,
|
|
108
|
-
|
|
109
|
-
const mrSuccess = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: true, idx })
|
|
110
|
-
/** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, idx: number) => DescentMatchResult<T>} */
|
|
111
|
-
const mrFail = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: false, idx })
|
|
180
|
+
const f = (name, tag, cp, startPos) => {
|
|
181
|
+
const physical = physicalIdx(cp.length)
|
|
112
182
|
|
|
113
183
|
/** @type {_Stack} */
|
|
114
184
|
let stack = null
|
|
115
185
|
/** @type {_Task | null} */
|
|
116
|
-
let task = { name, tag,
|
|
117
|
-
/** @type {
|
|
118
|
-
let result = mrFail(undefined, [],
|
|
186
|
+
let task = { name, tag, pos: startPos }
|
|
187
|
+
/** @type {_Result<T>} */
|
|
188
|
+
let result = mrFail(undefined, [], startPos)
|
|
119
189
|
// High-water mark across the whole match, so it survives the rewinds a
|
|
120
190
|
// failing sequence item does to `result`.
|
|
121
|
-
/** @type {
|
|
122
|
-
let furthest = {
|
|
191
|
+
/** @type {_Failure} */
|
|
192
|
+
let furthest = { pos: 0, expected: [] }
|
|
123
193
|
|
|
124
194
|
while (true) {
|
|
125
195
|
if (task !== null) {
|
|
126
196
|
// The explicit annotation cuts a control-flow inference cycle (TS7022):
|
|
127
197
|
// `name`'s narrowed type feeds `rule`, whose type would otherwise feed the
|
|
128
198
|
// later `task` assignments that `name`'s narrowing depends on.
|
|
129
|
-
const { name, tag,
|
|
199
|
+
const { name, tag, pos } = /** @type {_Task} */ (task)
|
|
130
200
|
task = null
|
|
131
201
|
/** @type {DataRule} */
|
|
132
202
|
const rule = data[0][name]
|
|
@@ -134,67 +204,74 @@ export const descentParser = fr => {
|
|
|
134
204
|
// No nullable case: `emptyTagOf` in `bnf/data` returns `undefined`
|
|
135
205
|
// for every terminal, so `emptyTags[name]` here is always
|
|
136
206
|
// `undefined` and a terminal either consumes one symbol or fails.
|
|
137
|
-
|
|
138
|
-
|
|
207
|
+
// Past the synthesized EOF there is no symbol left to consume.
|
|
208
|
+
if (pos <= cp.length && rangeContains(...rangeDecode(rule))(symbolAt(cp, pos))) {
|
|
209
|
+
result = mrSuccess(tag, leafAt(cp, pos), pos + 1)
|
|
139
210
|
} else {
|
|
140
211
|
// The only place a terminal is rejected, so the only place
|
|
141
212
|
// the furthest failure can advance.
|
|
142
|
-
furthest = recordFailure(furthest,
|
|
143
|
-
result = mrFail(undefined, [],
|
|
213
|
+
furthest = recordFailure(furthest, pos, rule)
|
|
214
|
+
result = mrFail(undefined, [], pos)
|
|
144
215
|
}
|
|
145
216
|
} else if (rule instanceof Array) {
|
|
146
217
|
if (rule.length === 0) {
|
|
147
|
-
result = mrSuccess(tag, [],
|
|
218
|
+
result = mrSuccess(tag, [], pos)
|
|
148
219
|
} else {
|
|
149
|
-
stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0,
|
|
150
|
-
task = { name: rule[0], tag: undefined,
|
|
220
|
+
stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startPos: pos, seq: [] }, rest: stack }
|
|
221
|
+
task = { name: rule[0], tag: undefined, pos }
|
|
151
222
|
}
|
|
152
223
|
} else {
|
|
153
224
|
const entries = definedEntries(rule)
|
|
154
225
|
const emptyTag = emptyTags[name]
|
|
155
|
-
const emptyResult = mrFail(emptyTag, [],
|
|
226
|
+
const emptyResult = mrFail(emptyTag, [], pos)
|
|
156
227
|
if (entries.length === 0) {
|
|
157
228
|
result = emptyResult
|
|
158
229
|
} else {
|
|
159
|
-
stack = { top: { kind: 'variant', entries, entryIndex: 0,
|
|
230
|
+
stack = { top: { kind: 'variant', entries, entryIndex: 0, pos, emptyResult }, rest: stack }
|
|
160
231
|
const [entryTag, entryName] = entries[0]
|
|
161
|
-
task = { name: entryName, tag: entryTag,
|
|
232
|
+
task = { name: entryName, tag: entryTag, pos }
|
|
162
233
|
}
|
|
163
234
|
}
|
|
164
235
|
continue
|
|
165
236
|
}
|
|
166
237
|
|
|
167
238
|
if (stack === null) {
|
|
239
|
+
const { ast, success, pos } = result
|
|
240
|
+
/** @type {DescentMatchResult<T>} */
|
|
241
|
+
const mr = { ast, success, idx: physical(pos) }
|
|
168
242
|
// A success has nothing to diagnose; only a failure carries it.
|
|
169
|
-
return
|
|
243
|
+
return success
|
|
244
|
+
? mr
|
|
245
|
+
: { ...mr, failure: { idx: physical(furthest.pos), expected: furthest.expected } }
|
|
170
246
|
}
|
|
171
247
|
const frame = stack.top
|
|
172
248
|
stack = stack.rest
|
|
173
249
|
|
|
174
250
|
if (frame.kind === 'seq') {
|
|
175
|
-
const { ast: astRule, success,
|
|
251
|
+
const { ast: astRule, success, pos } = result
|
|
176
252
|
if (success === false) {
|
|
177
|
-
result = mrFail(frame.tag, [], frame.
|
|
253
|
+
result = mrFail(frame.tag, [], frame.startPos)
|
|
178
254
|
} else {
|
|
179
255
|
const seq = [...frame.seq, astRule]
|
|
180
256
|
const itemIndex = frame.itemIndex + 1
|
|
181
257
|
if (itemIndex < frame.items.length) {
|
|
182
258
|
stack = { top: { ...frame, itemIndex, seq }, rest: stack }
|
|
183
|
-
task = { name: frame.items[itemIndex], tag: undefined,
|
|
259
|
+
task = { name: frame.items[itemIndex], tag: undefined, pos }
|
|
184
260
|
} else {
|
|
185
|
-
result = mrSuccess(frame.tag, seq,
|
|
261
|
+
result = mrSuccess(frame.tag, seq, pos)
|
|
186
262
|
}
|
|
187
263
|
}
|
|
188
264
|
} else {
|
|
189
265
|
// success that consumed input wins immediately: the frame stays popped and
|
|
190
266
|
// `result` propagates to the frame below, matching the recursive `return m`.
|
|
191
|
-
|
|
267
|
+
// Consuming EOF counts as consumption, because the cursor moved.
|
|
268
|
+
if (!(result.success && frame.pos !== result.pos)) {
|
|
192
269
|
const emptyResult = result.success ? result : frame.emptyResult
|
|
193
270
|
const entryIndex = frame.entryIndex + 1
|
|
194
271
|
if (entryIndex < frame.entries.length) {
|
|
195
272
|
stack = { top: { ...frame, entryIndex, emptyResult }, rest: stack }
|
|
196
273
|
const [entryTag, entryName] = frame.entries[entryIndex]
|
|
197
|
-
task = { name: entryName, tag: entryTag,
|
|
274
|
+
task = { name: entryName, tag: entryTag, pos: frame.pos }
|
|
198
275
|
} else {
|
|
199
276
|
result = emptyResult
|
|
200
277
|
}
|