functionalscript 0.44.0 → 0.46.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 +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +15 -0
- package/fjs/asn.1/proof.f.mjs +31 -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/module.f.mjs +22 -5
- 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/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -4
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +34 -5
- package/fjs/bnf/descent/module.f.mjs +176 -54
- package/fjs/bnf/descent/proof.f.d.mts +3 -0
- package/fjs/bnf/descent/proof.f.mjs +189 -27
- package/fjs/bnf/descent/types.d.ts +24 -18
- package/fjs/bnf/ll1/module.f.d.mts +74 -6
- package/fjs/bnf/ll1/module.f.mjs +297 -95
- package/fjs/bnf/ll1/proof.f.d.mts +17 -2
- package/fjs/bnf/ll1/proof.f.mjs +372 -137
- package/fjs/bnf/ll1/types.d.ts +25 -27
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- 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/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- 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/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +4 -4
- package/fjs/cas/cli/proof.f.mjs +47 -34
- package/fjs/cas/evo/module.f.d.mts +71 -31
- package/fjs/cas/evo/module.f.mjs +223 -138
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +311 -226
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +164 -176
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- 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 +3 -3
- package/fjs/ci/config/module.f.mjs +3 -3
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +4 -4
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +13 -8
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +21 -18
- package/fjs/cli/types.d.ts +2 -3
- 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/hmac/module.f.mjs +2 -2
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +4 -1
- package/fjs/crypto/sha2/proof.f.mjs +27 -1
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- 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 +17 -5
- package/fjs/dev/module.f.mjs +60 -30
- package/fjs/dev/update/module.f.d.mts +11 -3
- package/fjs/dev/update/module.f.mjs +16 -11
- package/fjs/dev/update/proof.f.d.mts +4 -3
- package/fjs/dev/update/proof.f.mjs +11 -7
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +16 -3
- package/fjs/djs/parser/module.f.mjs +135 -16
- package/fjs/djs/parser/proof.f.d.mts +8 -1
- package/fjs/djs/parser/proof.f.mjs +287 -13
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +20 -1
- package/fjs/djs/proof.f.mjs +190 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +66 -19
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +120 -73
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +86 -67
- package/fjs/djs/transpiler/module.f.d.mts +13 -19
- package/fjs/djs/transpiler/module.f.mjs +79 -72
- package/fjs/djs/transpiler/types.d.ts +29 -0
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +23 -12
- package/fjs/effects/list/module.f.mjs +16 -12
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +6 -3
- package/fjs/effects/memory/module.f.mjs +7 -7
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +18 -9
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +28 -4
- package/fjs/effects/mock/module.f.mjs +39 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +12 -2
- package/fjs/effects/module.f.d.mts +469 -281
- package/fjs/effects/module.f.mjs +538 -299
- package/fjs/effects/module.mjs +11 -2
- package/fjs/effects/node/memory/module.d.mts +7 -2
- package/fjs/effects/node/memory/module.mjs +9 -5
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +12 -5
- package/fjs/effects/node/module.d.mts +8 -2
- package/fjs/effects/node/module.f.d.mts +183 -43
- package/fjs/effects/node/module.f.mjs +260 -62
- package/fjs/effects/node/module.mjs +61 -50
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +21 -4
- package/fjs/effects/node/virtual/module.f.mjs +113 -70
- package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
- package/fjs/effects/node/virtual/proof.f.mjs +201 -8
- package/fjs/effects/proof.f.d.mts +69 -34
- package/fjs/effects/proof.f.mjs +413 -130
- package/fjs/effects/types.d.ts +161 -33
- 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 +22 -10
- package/fjs/emergent_testing/module.f.mjs +119 -85
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +169 -35
- package/fjs/emergent_testing/types.d.ts +22 -4
- 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/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +5 -0
- package/fjs/fsm/proof.f.mjs +87 -115
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +30 -3
- package/fjs/js/tokenizer/module.f.mjs +161 -211
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +39 -4
- package/fjs/mcp/module.f.mjs +14 -12
- package/fjs/mcp/proof.f.d.mts +13 -1
- package/fjs/mcp/proof.f.mjs +120 -61
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +7 -5
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +133 -72
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +38 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +12 -12
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +218 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -1
- package/fjs/media/json/schema/proof.f.mjs +220 -9
- package/fjs/media/json/serializer/module.f.d.mts +44 -0
- package/fjs/media/json/serializer/module.f.mjs +71 -9
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +31 -8
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- 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/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +83 -7
- package/fjs/media/revision/module.f.mjs +127 -23
- package/fjs/media/revision/proof.f.d.mts +14 -0
- package/fjs/media/revision/proof.f.mjs +93 -2
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +53 -18
- package/fjs/media/type/module.f.mjs +87 -97
- package/fjs/media/type/proof.f.d.mts +17 -0
- package/fjs/media/type/proof.f.mjs +73 -13
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +33 -10
- package/fjs/module.mjs +6 -0
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +7 -3
- package/fjs/proof.f.mjs +41 -12
- package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
- package/fjs/protocol/json_rpc/module.f.mjs +10 -7
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +16 -3
- package/fjs/protocol/mcp/proof.f.mjs +224 -69
- package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
- package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
- package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +4 -0
- package/fjs/sul/id/module.f.mjs +6 -6
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +6 -4
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +7 -4
- 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 +23 -17
- 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 +29 -3
- package/fjs/text/code_point/module.f.mjs +32 -9
- package/fjs/text/code_point/proof.f.d.mts +2 -0
- package/fjs/text/code_point/proof.f.mjs +39 -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 +6 -5
- package/fjs/text/sgr/module.f.mjs +8 -8
- 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 +38 -35
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +19 -2
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +20 -20
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +16 -4
- 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 -16
- package/fjs/types/bit_vec/module.f.mjs +99 -95
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +31 -5
- 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 +10 -10
- 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 +14 -17
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +16 -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 +20 -4
- package/fjs/types/byte_set/module.f.mjs +18 -8
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +10 -8
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +13 -5
- 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 +10 -3
- package/fjs/types/list/module.f.mjs +6 -4
- 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 +26 -6
- package/fjs/types/nullable/module.f.mjs +25 -6
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- 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 +26 -4
- package/fjs/types/object/module.f.mjs +26 -7
- 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 +27 -12
- 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 +44 -14
- package/fjs/types/rtti/common/module.f.mjs +42 -36
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +10 -7
- package/fjs/types/rtti/data/module.f.d.mts +134 -0
- package/fjs/types/rtti/data/module.f.mjs +1053 -0
- package/fjs/types/rtti/data/proof.f.d.mts +76 -0
- package/fjs/types/rtti/data/proof.f.mjs +589 -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 +48 -0
- package/fjs/types/rtti/parse/module.f.mjs +45 -34
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +51 -52
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +6 -2
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +258 -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 +25 -1
- package/fjs/types/rtti/types.d.ts +40 -0
- 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 +49 -1
- package/fjs/types/sorted_set/module.f.mjs +26 -2
- package/fjs/types/sorted_set/proof.f.d.mts +4 -1
- package/fjs/types/sorted_set/proof.f.mjs +19 -2
- 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 +5 -2
- package/fjs/website/module.f.mjs +6 -8
- package/fjs/website/proof.f.mjs +2 -1
- 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/package_json/module.f.d.mts +0 -32
- package/fjs/dev/package_json/module.f.mjs +0 -37
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- 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/module.f.d.mts +0 -10
- package/fjs/effects/eff/module.f.mjs +0 -68
- package/fjs/effects/eff/proof.f.d.mts +0 -12
- package/fjs/effects/eff/proof.f.mjs +0 -66
- package/fjs/effects/eff/types.d.ts +0 -71
- 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.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/module.f.d.mts +0 -6
- package/fjs/types/rtti/validate/module.f.mjs +0 -169
- package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
- package/fjs/types/rtti/validate/proof.f.mjs +0 -437
- package/fjs/types/rtti/validate/types.d.ts +0 -6
- 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/bnf/ll1/types.d.ts
CHANGED
|
@@ -6,41 +6,40 @@
|
|
|
6
6
|
import type { CodePoint } from '../../text/utf16/types.ts';
|
|
7
7
|
import type { RangeMapArray } from '../../types/range_map/types.ts';
|
|
8
8
|
import type { StringMap } from '../../types/object/types.ts';
|
|
9
|
-
import type {
|
|
10
|
-
/**
|
|
9
|
+
import type { Ast } from '../matcher/types.ts';
|
|
10
|
+
/**
|
|
11
|
+
* A rule's dispatch entry: its first set as a range map, and — for a variant
|
|
12
|
+
* that can match empty — the branch a dispatch miss selects.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
11
16
|
export type _DispatchRule = {
|
|
12
|
-
readonly
|
|
17
|
+
readonly empty: _DispatchBranch | undefined;
|
|
13
18
|
readonly rangeMap: _Dispatch;
|
|
14
19
|
};
|
|
15
20
|
/** @internal */
|
|
16
21
|
export type _Dispatch = RangeMapArray<_DispatchResult>;
|
|
17
22
|
/** @internal */
|
|
18
|
-
export type _DispatchResult =
|
|
19
|
-
/** @internal */
|
|
20
|
-
export type _DispatchRuleOrName = _DispatchRule | string;
|
|
21
|
-
/** @internal */
|
|
22
|
-
export type _DispatchRuleCollection = {
|
|
23
|
-
readonly tag: string | undefined;
|
|
24
|
-
readonly rules: _DispatchRuleOrName[];
|
|
25
|
-
};
|
|
26
|
-
/** @internal */
|
|
27
|
-
export type _DispatchMap = StringMap<_DispatchRule>;
|
|
23
|
+
export type _DispatchResult = _DispatchBranch | null;
|
|
28
24
|
/**
|
|
29
|
-
*
|
|
25
|
+
* A branch as dispatch selects it: the name of the rule to invoke — a name
|
|
26
|
+
* into the {@link _DispatchMap} — and the tag its node gets. Only a variant's
|
|
27
|
+
* entries are ever read as branches; every other rule kind consults its range
|
|
28
|
+
* map solely for first-set membership.
|
|
30
29
|
*
|
|
31
30
|
* @internal
|
|
32
31
|
*/
|
|
33
|
-
export type
|
|
34
|
-
readonly tag:
|
|
35
|
-
readonly
|
|
32
|
+
export type _DispatchBranch = {
|
|
33
|
+
readonly tag: string | undefined;
|
|
34
|
+
readonly name: string;
|
|
36
35
|
};
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
-
*/
|
|
40
|
-
export type AstSequence = readonly (_AstRule | CodePoint)[];
|
|
41
|
-
export type AstTag = string | true | undefined;
|
|
36
|
+
/** @internal */
|
|
37
|
+
export type _DispatchMap = StringMap<_DispatchRule>;
|
|
42
38
|
/**
|
|
43
39
|
* Represents the remaining input after a match attempt, or `null` if no match is possible.
|
|
40
|
+
*
|
|
41
|
+
* The remainder is physical: consuming the synthesized end-of-input symbol
|
|
42
|
+
* leaves it empty rather than making it `null`.
|
|
44
43
|
*/
|
|
45
44
|
export type Remainder = readonly CodePoint[] | null;
|
|
46
45
|
/**
|
|
@@ -48,12 +47,11 @@ export type Remainder = readonly CodePoint[] | null;
|
|
|
48
47
|
*
|
|
49
48
|
* Represents the result of a match operation, including the parsed AST rule and the remainder of the input.
|
|
50
49
|
*/
|
|
51
|
-
export type MatchResult = readonly [
|
|
50
|
+
export type MatchResult = readonly [Ast<CodePoint>, boolean, Remainder];
|
|
52
51
|
/**
|
|
53
52
|
* LL(1) parser function for matching by rule name.
|
|
53
|
+
*
|
|
54
|
+
* `s` holds physical symbols only; the matcher synthesizes the one logical
|
|
55
|
+
* end-of-input symbol after them.
|
|
54
56
|
*/
|
|
55
57
|
export type Match = (name: string, s: readonly CodePoint[]) => MatchResult;
|
|
56
|
-
/**
|
|
57
|
-
* Internal match function signature used by compiled dispatch rules.
|
|
58
|
-
*/
|
|
59
|
-
export type MatchRule = (dr: _DispatchRule, s: readonly CodePoint[]) => MatchResult;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The layer every BNF matcher backend shares: the {@link Cursor} it matches at,
|
|
3
|
+
* the {@link Ast} it builds, and the constructors that pair them.
|
|
4
|
+
*
|
|
5
|
+
* `fjs/bnf/ll1` and `fjs/bnf/descent` are two machines over one contract, and
|
|
6
|
+
* the contract is what lives here — not the machines. Backtracking, frame
|
|
7
|
+
* shapes, failure reporting and the public result type are each backend's own,
|
|
8
|
+
* and deliberately different; where the input sits, what a consumed symbol
|
|
9
|
+
* contributes to the AST, and how a node is built are not.
|
|
10
|
+
*
|
|
11
|
+
* The three are one module rather than three because they are interdependent:
|
|
12
|
+
* {@link leafAt} produces AST leaves, and {@link mrSuccess} builds AST nodes
|
|
13
|
+
* positioned by a cursor. Splitting them would put one concept behind three
|
|
14
|
+
* imports.
|
|
15
|
+
*
|
|
16
|
+
* See `./types.ts` for the type-level API and `./README.md` for the contract
|
|
17
|
+
* this implements.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*
|
|
21
|
+
* @import { Ast, AstResult, AstSequence, AstTag, Cursor } from './types.ts'
|
|
22
|
+
*/
|
|
23
|
+
import type { AstResult, AstSequence, AstTag, Cursor } from './types.ts';
|
|
24
|
+
/**
|
|
25
|
+
* What consuming the symbol at a cursor contributes to the AST: the leaf
|
|
26
|
+
* itself, and nothing for the synthesized end-of-input symbol — it has no
|
|
27
|
+
* physical source element, so it never reaches an AST.
|
|
28
|
+
*
|
|
29
|
+
* @type {<L>(input: readonly L[], pos: Cursor) => AstSequence<L>}
|
|
30
|
+
*/
|
|
31
|
+
export declare const leafAt: <L>(input: readonly L[], pos: Cursor) => AstSequence<L>;
|
|
32
|
+
/**
|
|
33
|
+
* The semantic symbol a cursor points at: one read out of the physical input,
|
|
34
|
+
* and the synthesized {@link eofSymbol} at its end. Only meaningful where the
|
|
35
|
+
* cursor still has a symbol, `pos <= input.length`.
|
|
36
|
+
*
|
|
37
|
+
* `symbolOf` is the one place backends differ — it is how a leaf yields its
|
|
38
|
+
* symbol, `identity` where the leaf *is* the code point and a destructuring
|
|
39
|
+
* where it carries metadata alongside. Each backend binds its own partial
|
|
40
|
+
* application once at module scope.
|
|
41
|
+
*
|
|
42
|
+
* @type {<L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number}
|
|
43
|
+
*/
|
|
44
|
+
export declare const symbolAt: <L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number;
|
|
45
|
+
/**
|
|
46
|
+
* The public, physical index of a cursor. Consuming the synthesized
|
|
47
|
+
* end-of-input symbol moves the cursor past the physical end, and both cursors
|
|
48
|
+
* report `length`.
|
|
49
|
+
*
|
|
50
|
+
* @type {(length: number) => (pos: Cursor) => number}
|
|
51
|
+
*/
|
|
52
|
+
export declare const physicalIdx: (length: number) => (pos: Cursor) => number;
|
|
53
|
+
export type _Mr<L, P> = (tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
|
|
54
|
+
/**
|
|
55
|
+
* A matched node at a position.
|
|
56
|
+
*
|
|
57
|
+
* @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
|
|
58
|
+
*/
|
|
59
|
+
export declare const mrSuccess: <L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
|
|
60
|
+
/**
|
|
61
|
+
* A node that did not match, at the position the caller should resume from —
|
|
62
|
+
* which a backtracking backend rewinds and a predictive one does not.
|
|
63
|
+
*
|
|
64
|
+
* @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
|
|
65
|
+
*/
|
|
66
|
+
export declare const mrFail: <L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The layer every BNF matcher backend shares: the {@link Cursor} it matches at,
|
|
3
|
+
* the {@link Ast} it builds, and the constructors that pair them.
|
|
4
|
+
*
|
|
5
|
+
* `fjs/bnf/ll1` and `fjs/bnf/descent` are two machines over one contract, and
|
|
6
|
+
* the contract is what lives here — not the machines. Backtracking, frame
|
|
7
|
+
* shapes, failure reporting and the public result type are each backend's own,
|
|
8
|
+
* and deliberately different; where the input sits, what a consumed symbol
|
|
9
|
+
* contributes to the AST, and how a node is built are not.
|
|
10
|
+
*
|
|
11
|
+
* The three are one module rather than three because they are interdependent:
|
|
12
|
+
* {@link leafAt} produces AST leaves, and {@link mrSuccess} builds AST nodes
|
|
13
|
+
* positioned by a cursor. Splitting them would put one concept behind three
|
|
14
|
+
* imports.
|
|
15
|
+
*
|
|
16
|
+
* See `./types.ts` for the type-level API and `./README.md` for the contract
|
|
17
|
+
* this implements.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*
|
|
21
|
+
* @import { Ast, AstResult, AstSequence, AstTag, Cursor } from './types.ts'
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { eofSymbol } from '../module.f.mjs'
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* What consuming the symbol at a cursor contributes to the AST: the leaf
|
|
28
|
+
* itself, and nothing for the synthesized end-of-input symbol — it has no
|
|
29
|
+
* physical source element, so it never reaches an AST.
|
|
30
|
+
*
|
|
31
|
+
* @type {<L>(input: readonly L[], pos: Cursor) => AstSequence<L>}
|
|
32
|
+
*/
|
|
33
|
+
export const leafAt = (input, pos) => pos < input.length ? [input[pos]] : []
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The semantic symbol a cursor points at: one read out of the physical input,
|
|
37
|
+
* and the synthesized {@link eofSymbol} at its end. Only meaningful where the
|
|
38
|
+
* cursor still has a symbol, `pos <= input.length`.
|
|
39
|
+
*
|
|
40
|
+
* `symbolOf` is the one place backends differ — it is how a leaf yields its
|
|
41
|
+
* symbol, `identity` where the leaf *is* the code point and a destructuring
|
|
42
|
+
* where it carries metadata alongside. Each backend binds its own partial
|
|
43
|
+
* application once at module scope.
|
|
44
|
+
*
|
|
45
|
+
* @type {<L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number}
|
|
46
|
+
*/
|
|
47
|
+
export const symbolAt = symbolOf => (input, pos) =>
|
|
48
|
+
pos < input.length ? symbolOf(input[pos]) : eofSymbol
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The public, physical index of a cursor. Consuming the synthesized
|
|
52
|
+
* end-of-input symbol moves the cursor past the physical end, and both cursors
|
|
53
|
+
* report `length`.
|
|
54
|
+
*
|
|
55
|
+
* @type {(length: number) => (pos: Cursor) => number}
|
|
56
|
+
*/
|
|
57
|
+
export const physicalIdx = length => pos => Math.min(pos, length)
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @template L
|
|
61
|
+
* @template P
|
|
62
|
+
* @typedef {(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>} _Mr
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
/** @type {<L, P>(success: boolean) => _Mr<L, P>} */
|
|
66
|
+
const mr = success => (tag, sequence, pos) => ({ ast: { tag, sequence }, success, pos })
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A matched node at a position.
|
|
70
|
+
*
|
|
71
|
+
* @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
|
|
72
|
+
*/
|
|
73
|
+
export const mrSuccess = mr(true)
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A node that did not match, at the position the caller should resume from —
|
|
77
|
+
* which a backtracking backend rewinds and a predictive one does not.
|
|
78
|
+
*
|
|
79
|
+
* @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
|
|
80
|
+
*/
|
|
81
|
+
export const mrFail = mr(false)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { CodePointMeta } from '../descent/types.ts'
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { assertEq } from '../../asserts/module.f.mjs'
|
|
6
|
+
import { identity } from '../../types/function/module.f.mjs'
|
|
7
|
+
import { eofSymbol } from '../module.f.mjs'
|
|
8
|
+
import { leafAt, mrFail, mrSuccess, physicalIdx, symbolAt } from './module.f.mjs'
|
|
9
|
+
|
|
10
|
+
/** @type {readonly CodePointMeta<string>[]} */
|
|
11
|
+
const withMeta = [[0x41, 'a'], [0x42, 'b']]
|
|
12
|
+
|
|
13
|
+
/** @type {(leaf: CodePointMeta<string>) => number} */
|
|
14
|
+
const metaSymbolOf = ([symbol]) => symbol
|
|
15
|
+
|
|
16
|
+
export const proof = {
|
|
17
|
+
leafAt: [
|
|
18
|
+
() => {
|
|
19
|
+
// Inside the physical input a leaf is contributed whole, whatever a
|
|
20
|
+
// backend chose a leaf to be.
|
|
21
|
+
assertEq(JSON.stringify(leafAt([65, 66], 0)), '[65]')
|
|
22
|
+
assertEq(JSON.stringify(leafAt([65, 66], 1)), '[66]')
|
|
23
|
+
assertEq(JSON.stringify(leafAt(withMeta, 0)), '[[65,"a"]]')
|
|
24
|
+
},
|
|
25
|
+
() => {
|
|
26
|
+
// At and past the physical end there is nothing to contribute: the
|
|
27
|
+
// synthesized end-of-input symbol has no source element, so it never
|
|
28
|
+
// reaches an AST.
|
|
29
|
+
assertEq(JSON.stringify(leafAt([65, 66], 2)), '[]')
|
|
30
|
+
assertEq(JSON.stringify(leafAt([65, 66], 3)), '[]')
|
|
31
|
+
assertEq(JSON.stringify(leafAt([], 0)), '[]')
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
symbolAt: [
|
|
35
|
+
() => {
|
|
36
|
+
// `identity` is the leaf reader of a backend whose leaf *is* the
|
|
37
|
+
// symbol; a pair's reader takes its first half. Same positions, same
|
|
38
|
+
// symbols.
|
|
39
|
+
/** @type {(leaf: number) => number} */
|
|
40
|
+
const symbolOf = identity
|
|
41
|
+
assertEq(symbolAt(symbolOf)([65, 66], 0), 65)
|
|
42
|
+
assertEq(symbolAt(metaSymbolOf)(withMeta, 0), 65)
|
|
43
|
+
assertEq(symbolAt(metaSymbolOf)(withMeta, 1), 66)
|
|
44
|
+
},
|
|
45
|
+
() => {
|
|
46
|
+
// The one synthesized end-of-input symbol sits at the physical end,
|
|
47
|
+
// for either leaf shape.
|
|
48
|
+
/** @type {(leaf: number) => number} */
|
|
49
|
+
const symbolOf = identity
|
|
50
|
+
assertEq(symbolAt(symbolOf)([65, 66], 2), eofSymbol)
|
|
51
|
+
assertEq(symbolAt(metaSymbolOf)(withMeta, 2), eofSymbol)
|
|
52
|
+
assertEq(symbolAt(symbolOf)([], 0), eofSymbol)
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
physicalIdx: () => {
|
|
56
|
+
const physical = physicalIdx(2)
|
|
57
|
+
assertEq(physical(0), 0)
|
|
58
|
+
assertEq(physical(2), 2)
|
|
59
|
+
// Consuming the end-of-input symbol moves the cursor past the physical
|
|
60
|
+
// end, and both cursors report the same public index — which is what
|
|
61
|
+
// keeps a public position physical.
|
|
62
|
+
assertEq(physical(3), 2)
|
|
63
|
+
},
|
|
64
|
+
mrSuccess: () => {
|
|
65
|
+
assertEq(
|
|
66
|
+
JSON.stringify(mrSuccess('some', [65], 1)),
|
|
67
|
+
'{"ast":{"tag":"some","sequence":[65]},"success":true,"pos":1}')
|
|
68
|
+
// The position type is the backend's own: `null` is how a predictive
|
|
69
|
+
// backend says it ran out of input.
|
|
70
|
+
assertEq(
|
|
71
|
+
JSON.stringify(mrSuccess(undefined, [], null)),
|
|
72
|
+
'{"ast":{"sequence":[]},"success":true,"pos":null}')
|
|
73
|
+
},
|
|
74
|
+
mrFail: () => {
|
|
75
|
+
assertEq(
|
|
76
|
+
JSON.stringify(mrFail(true, [], 0)),
|
|
77
|
+
'{"ast":{"tag":true,"sequence":[]},"success":false,"pos":0}')
|
|
78
|
+
},
|
|
79
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-level API for the layer every BNF matcher backend shares: the position
|
|
3
|
+
* it matches at, the AST it builds, and the result that pairs them.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Tag of an AST node: the variant branch that matched, `true` where a rule
|
|
9
|
+
* matched empty input without naming a branch, and `undefined` where the rule
|
|
10
|
+
* is not a choice at all.
|
|
11
|
+
*/
|
|
12
|
+
export type AstTag = string | true | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* An AST over leaves of type `L`. A backend picks `L` for what it keeps of a
|
|
15
|
+
* consumed symbol — the code point alone, or the code point with metadata.
|
|
16
|
+
*/
|
|
17
|
+
export type Ast<L> = {
|
|
18
|
+
readonly tag: AstTag;
|
|
19
|
+
readonly sequence: AstSequence<L>;
|
|
20
|
+
};
|
|
21
|
+
/** The children of an {@link Ast} node: nested nodes and consumed leaves. */
|
|
22
|
+
export type AstSequence<L> = readonly (Ast<L> | L)[];
|
|
23
|
+
/**
|
|
24
|
+
* A match position over input of `length` leaves: `0 .. length` are the
|
|
25
|
+
* physical positions, and `length + 1` is where the one synthesized
|
|
26
|
+
* end-of-input symbol has been consumed.
|
|
27
|
+
*
|
|
28
|
+
* This is the complete cursor `(idx, eofConsumed)` of
|
|
29
|
+
* [the BNF contract](../README.md#logical-eof-in-parser-input) written as one
|
|
30
|
+
* number. `eofConsumed` can only be true at the physical end, so the pair and
|
|
31
|
+
* the extended position hold the same information — and being one number is
|
|
32
|
+
* what makes every ordering a backend needs a plain `<`, because consuming EOF
|
|
33
|
+
* *is* progress even though the public index does not move. A backend that
|
|
34
|
+
* treated it as no progress would loop forever on a repetition over a rule that
|
|
35
|
+
* can match EOF.
|
|
36
|
+
*
|
|
37
|
+
* Public positions are physical, so a cursor is converted back with
|
|
38
|
+
* `physicalIdx` before it leaves a backend.
|
|
39
|
+
*/
|
|
40
|
+
export type Cursor = number;
|
|
41
|
+
/**
|
|
42
|
+
* A matcher's own result: the AST built so far, whether it matched, and where
|
|
43
|
+
* it stopped.
|
|
44
|
+
*
|
|
45
|
+
* `P` is the position type. A backend whose match always has one uses
|
|
46
|
+
* {@link Cursor}; one that also reports running out of input uses
|
|
47
|
+
* `Cursor | null`. Public results are each backend's own type — this is the
|
|
48
|
+
* shape they are built from, not the shape they return.
|
|
49
|
+
*/
|
|
50
|
+
export type AstResult<L, P> = {
|
|
51
|
+
readonly ast: Ast<L>;
|
|
52
|
+
readonly success: boolean;
|
|
53
|
+
readonly pos: P;
|
|
54
|
+
};
|
package/fjs/bnf/module.f.d.mts
CHANGED
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import type { Tuple } from '../types/array/types.ts';
|
|
14
14
|
import type { TerminalRange, Sequence, Rule, RangeVariant, None, Option, Repeat0Plus, Repeat1Plus, Join1Plus, Repeat } from './types.ts';
|
|
15
|
+
/**
|
|
16
|
+
* The logical end-of-input symbol.
|
|
17
|
+
*
|
|
18
|
+
* `-1` is outside the non-negative physical-symbol domain, so no alphabet
|
|
19
|
+
* adapter can produce it and no ordinary symbol has to be reserved for it.
|
|
20
|
+
* Parser backends synthesize it exactly once, after the physical input.
|
|
21
|
+
*/
|
|
22
|
+
export declare const eofSymbol = -1;
|
|
15
23
|
/** @type {(a: number, b: number) => TerminalRange} */
|
|
16
24
|
export declare const rangeEncode: (a: number, b: number) => TerminalRange;
|
|
17
25
|
/**
|
|
@@ -21,16 +29,17 @@ export declare const rangeEncode: (a: number, b: number) => TerminalRange;
|
|
|
21
29
|
*/
|
|
22
30
|
export declare const oneEncode: (a: number) => TerminalRange;
|
|
23
31
|
/**
|
|
24
|
-
* End-of-file marker:
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* real code point.
|
|
32
|
+
* End-of-file marker: the singleton range of {@link eofSymbol}. Deliberately
|
|
33
|
+
* outside the ordinary symbol domain — and so outside Unicode — so it can
|
|
34
|
+
* never collide with a real code point.
|
|
28
35
|
*
|
|
29
36
|
* @type {TerminalRange}
|
|
30
37
|
*/
|
|
31
38
|
export declare const eof: TerminalRange;
|
|
32
39
|
/**
|
|
33
|
-
*
|
|
40
|
+
* Every ordinary symbol packed into a single {@link TerminalRange}. EOF is not
|
|
41
|
+
* one of them, so complements over this range never include it.
|
|
42
|
+
*
|
|
34
43
|
* @type {TerminalRange}
|
|
35
44
|
*/
|
|
36
45
|
export declare const fullRange: TerminalRange;
|
|
@@ -44,7 +53,7 @@ export declare const unicodeRange: TerminalRange;
|
|
|
44
53
|
*/
|
|
45
54
|
export declare const unicodeMax: string;
|
|
46
55
|
/**
|
|
47
|
-
* Decodes a packed range into `[start, end]` symbols.
|
|
56
|
+
* Decodes a packed range into `[start, end]` semantic symbols.
|
|
48
57
|
*
|
|
49
58
|
* @type {(r: number) => Tuple<2, number>}
|
|
50
59
|
*/
|
package/fjs/bnf/module.f.mjs
CHANGED
|
@@ -31,12 +31,52 @@ const offset = 24
|
|
|
31
31
|
|
|
32
32
|
const mask = (1 << offset) - 1
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* How many stored endpoint codes one 24-bit half holds: `2 ** 24`.
|
|
36
|
+
*/
|
|
37
|
+
const terminalSize = mask + 1
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The logical end-of-input symbol.
|
|
41
|
+
*
|
|
42
|
+
* `-1` is outside the non-negative physical-symbol domain, so no alphabet
|
|
43
|
+
* adapter can produce it and no ordinary symbol has to be reserved for it.
|
|
44
|
+
* Parser backends synthesize it exactly once, after the physical input.
|
|
45
|
+
*/
|
|
46
|
+
export const eofSymbol = -1
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The largest ordinary symbol, `2 ** 24 - 2`: the semantic domain is
|
|
50
|
+
* `[-1] | [0, 2 ** 24 - 2]`, exactly `2 ** 24` terminals, one per stored code.
|
|
51
|
+
*/
|
|
52
|
+
const maxSymbol = mask - 1
|
|
53
|
+
|
|
54
|
+
const isValid = contains(eofSymbol, maxSymbol)
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Semantic terminal to its stored 24-bit endpoint code. Branchless: EOF wraps
|
|
58
|
+
* to `2 ** 24 - 1` (the top of the stored space) and every ordinary symbol
|
|
59
|
+
* keeps its own value as its code.
|
|
60
|
+
*
|
|
61
|
+
* @type {(value: number) => number}
|
|
62
|
+
*/
|
|
63
|
+
const encodeTerminal = value => (value + terminalSize) & mask
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The inverse of `encodeTerminal`, also branchless.
|
|
67
|
+
*
|
|
68
|
+
* Stored codes are an implementation representation, not semantic terminal
|
|
69
|
+
* ordering — `2 ** 24 - 1` is the largest code but the smallest terminal — so
|
|
70
|
+
* range operations that care about ordering must compare decoded values.
|
|
71
|
+
*
|
|
72
|
+
* @type {(value: number) => number}
|
|
73
|
+
*/
|
|
74
|
+
const decodeTerminal = value => ((value + 1) & mask) - 1
|
|
35
75
|
|
|
36
76
|
/** @type {(a: number, b: number) => TerminalRange} */
|
|
37
77
|
export const rangeEncode = (a, b) => {
|
|
38
78
|
assert(isValid(a) && isValid(b) && a <= b)
|
|
39
|
-
return Number((BigInt(a) << BigInt(offset)) | BigInt(b))
|
|
79
|
+
return Number((BigInt(encodeTerminal(a)) << BigInt(offset)) | BigInt(encodeTerminal(b)))
|
|
40
80
|
}
|
|
41
81
|
|
|
42
82
|
/**
|
|
@@ -47,20 +87,21 @@ export const rangeEncode = (a, b) => {
|
|
|
47
87
|
export const oneEncode = a => rangeEncode(a, a)
|
|
48
88
|
|
|
49
89
|
/**
|
|
50
|
-
* End-of-file marker:
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* real code point.
|
|
90
|
+
* End-of-file marker: the singleton range of {@link eofSymbol}. Deliberately
|
|
91
|
+
* outside the ordinary symbol domain — and so outside Unicode — so it can
|
|
92
|
+
* never collide with a real code point.
|
|
54
93
|
*
|
|
55
94
|
* @type {TerminalRange}
|
|
56
95
|
*/
|
|
57
|
-
export const eof = oneEncode(
|
|
96
|
+
export const eof = oneEncode(eofSymbol)
|
|
58
97
|
|
|
59
98
|
/**
|
|
60
|
-
*
|
|
99
|
+
* Every ordinary symbol packed into a single {@link TerminalRange}. EOF is not
|
|
100
|
+
* one of them, so complements over this range never include it.
|
|
101
|
+
*
|
|
61
102
|
* @type {TerminalRange}
|
|
62
103
|
*/
|
|
63
|
-
export const fullRange =
|
|
104
|
+
export const fullRange = rangeEncode(0, maxSymbol)
|
|
64
105
|
|
|
65
106
|
/**
|
|
66
107
|
* Unicode scalar value range packed into a single {@link TerminalRange}.
|
|
@@ -74,12 +115,12 @@ export const unicodeRange = 0x000000_10FFFF
|
|
|
74
115
|
export const unicodeMax = codePointListToString([0x10FFFF])
|
|
75
116
|
|
|
76
117
|
/**
|
|
77
|
-
* Decodes a packed range into `[start, end]` symbols.
|
|
118
|
+
* Decodes a packed range into `[start, end]` semantic symbols.
|
|
78
119
|
*
|
|
79
120
|
* @type {(r: number) => Tuple<2, number>}
|
|
80
121
|
*/
|
|
81
122
|
export const rangeDecode = r =>
|
|
82
|
-
[Number(BigInt(r) >> BigInt(offset)), r & mask]
|
|
123
|
+
[decodeTerminal(Number(BigInt(r) >> BigInt(offset))), decodeTerminal(r & mask)]
|
|
83
124
|
|
|
84
125
|
const mapOneEncode = map(oneEncode)
|
|
85
126
|
|
package/fjs/bnf/proof.f.d.mts
CHANGED
package/fjs/bnf/proof.f.mjs
CHANGED
|
@@ -4,8 +4,18 @@
|
|
|
4
4
|
* @import { Rule } from './types.ts'
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { assert, assertEq } from '../asserts/module.f.mjs'
|
|
8
7
|
import {
|
|
8
|
+
assert,
|
|
9
|
+
assertEq,
|
|
10
|
+
assertStructurallySame,
|
|
11
|
+
} from '../asserts/module.f.mjs'
|
|
12
|
+
import {
|
|
13
|
+
eof,
|
|
14
|
+
eofSymbol,
|
|
15
|
+
fullRange,
|
|
16
|
+
not,
|
|
17
|
+
notSet,
|
|
18
|
+
rangeDecode,
|
|
9
19
|
rangeEncode,
|
|
10
20
|
str,
|
|
11
21
|
set,
|
|
@@ -15,8 +25,14 @@ import {
|
|
|
15
25
|
oneEncode,
|
|
16
26
|
repeat1Plus,
|
|
17
27
|
} from './module.f.mjs'
|
|
28
|
+
import { definedValues } from '../types/object/module.f.mjs'
|
|
18
29
|
import { classic, deterministic } from './testlib.f.mjs'
|
|
19
30
|
|
|
31
|
+
// The last ordinary symbol, `2 ** 24 - 2`. Written out because the range codec
|
|
32
|
+
// is what these tests check: deriving it from the codec would move both sides
|
|
33
|
+
// of every assertion together.
|
|
34
|
+
const maxSymbol = 0xFFFFFE
|
|
35
|
+
|
|
20
36
|
export const proof = {
|
|
21
37
|
test: () => {
|
|
22
38
|
classic()
|
|
@@ -24,8 +40,14 @@ export const proof = {
|
|
|
24
40
|
},
|
|
25
41
|
throw: {
|
|
26
42
|
rangeEncodeInvalid: [
|
|
27
|
-
|
|
28
|
-
() => { rangeEncode(
|
|
43
|
+
// one below `eofSymbol`, the smallest semantic terminal
|
|
44
|
+
() => { rangeEncode(-2, 0) },
|
|
45
|
+
() => { rangeEncode(0, -2) },
|
|
46
|
+
// one above the largest ordinary symbol: `2 ** 24 - 1` is EOF's
|
|
47
|
+
// stored code, not a terminal of its own
|
|
48
|
+
() => { rangeEncode(0, maxSymbol + 1) },
|
|
49
|
+
// semantic ordering, so EOF is below every ordinary symbol
|
|
50
|
+
() => { rangeEncode(0, eofSymbol) },
|
|
29
51
|
() => { rangeEncode(5, 3) },
|
|
30
52
|
],
|
|
31
53
|
rangeInvalid: [
|
|
@@ -33,6 +55,60 @@ export const proof = {
|
|
|
33
55
|
() => { range('abc') },
|
|
34
56
|
],
|
|
35
57
|
},
|
|
58
|
+
terminal: [
|
|
59
|
+
() => {
|
|
60
|
+
// EOF is the singleton `[-1, -1]` and keeps the stored code
|
|
61
|
+
// `2 ** 24 - 1` at both endpoints.
|
|
62
|
+
assertEq(eof, 0xFFFFFF_FFFFFF)
|
|
63
|
+
const [a, b] = rangeDecode(eof)
|
|
64
|
+
assertEq(a, eofSymbol)
|
|
65
|
+
assertEq(b, eofSymbol)
|
|
66
|
+
},
|
|
67
|
+
() => {
|
|
68
|
+
// `fullRange` holds the ordinary symbols only.
|
|
69
|
+
const [a, b] = rangeDecode(fullRange)
|
|
70
|
+
assertEq(a, 0)
|
|
71
|
+
assertEq(b, maxSymbol)
|
|
72
|
+
},
|
|
73
|
+
() => {
|
|
74
|
+
// Round trips over the whole semantic domain: EOF, the ordinary
|
|
75
|
+
// minimum, an ordinary symbol, and the ordinary maximum.
|
|
76
|
+
for (const v of [eofSymbol, 0, 0x10FFFF, maxSymbol]) {
|
|
77
|
+
const [a, b] = rangeDecode(oneEncode(v))
|
|
78
|
+
assertEq(a, v)
|
|
79
|
+
assertEq(b, v)
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
() => {
|
|
83
|
+
// Ordinary symbols keep their own value as their stored code, so a
|
|
84
|
+
// packed literal still reads as its endpoints.
|
|
85
|
+
assertEq(oneEncode(0x20), 0x000020_000020)
|
|
86
|
+
const [a, b] = rangeDecode(0x000030_000039)
|
|
87
|
+
assertEq(a, 0x30)
|
|
88
|
+
assertEq(b, 0x39)
|
|
89
|
+
},
|
|
90
|
+
() => {
|
|
91
|
+
// A range may span EOF and ordinary symbols; the endpoints are
|
|
92
|
+
// ordered semantically, not by stored code.
|
|
93
|
+
const [a, b] = rangeDecode(rangeEncode(eofSymbol, maxSymbol))
|
|
94
|
+
assertEq(a, eofSymbol)
|
|
95
|
+
assertEq(b, maxSymbol)
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
complement: [
|
|
99
|
+
() => {
|
|
100
|
+
// The complement of nothing over `fullRange` is `fullRange`: EOF is
|
|
101
|
+
// not an ordinary symbol, so no complement can produce it.
|
|
102
|
+
const r = definedValues(not({}))
|
|
103
|
+
assertEq(r.length, 1)
|
|
104
|
+
assertEq(r[0], fullRange)
|
|
105
|
+
},
|
|
106
|
+
() => {
|
|
107
|
+
const r = definedValues(notSet('a'))
|
|
108
|
+
const decoded = r.map(rangeDecode)
|
|
109
|
+
assertStructurallySame(decoded, [[0, 0x60], [0x62, maxSymbol]])
|
|
110
|
+
},
|
|
111
|
+
],
|
|
36
112
|
str: [
|
|
37
113
|
() => {
|
|
38
114
|
const result = str('a')
|