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/README.md
CHANGED
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
FunctionalScript is a safe, purely functional programming language and a strict subset of
|
|
6
6
|
[ECMAScript](https://en.wikipedia.org/wiki/ECMAScript)/[JavaScript](https://en.wikipedia.org/wiki/JavaScript). It's inspired by
|
|
7
7
|
|
|
8
|
-
- [JSON](https://en.wikipedia.org/wiki/JSON) and [JSON5](https://json5.org/) as subsets of JavaScript.
|
|
9
|
-
JSON is also a subset of FunctionalScript.
|
|
8
|
+
- [JSON](https://en.wikipedia.org/wiki/JSON) and [JSON5](https://json5.org/) as subsets of JavaScript values.
|
|
9
|
+
JSON is also a subset of FunctionalScript values.
|
|
10
10
|
- [asm.JS](https://en.wikipedia.org/wiki/Asm.js) (a precursor of [WebAssembly](https://en.wikipedia.org/wiki/WebAssembly)),
|
|
11
11
|
as a subset of JavaScript.
|
|
12
12
|
- [TypeScript](https://en.wikipedia.org/wiki/TypeScript), as a superset of JavaScript.
|
|
13
13
|
|
|
14
|
-
[
|
|
14
|
+
[The FunctionalScript specification](./spec/README.md) describes the language
|
|
15
|
+
the compiler accepts today; features not implemented yet are in
|
|
16
|
+
[`spec/todo/`](./spec/todo/README.md).
|
|
15
17
|
|
|
16
18
|
Learn more about
|
|
17
19
|
|
package/fjs/asn.1/module.f.mjs
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
vec,
|
|
20
20
|
vec8,
|
|
21
21
|
} from '../types/bit_vec/module.f.mjs'
|
|
22
|
+
import { assert } from '../asserts/module.f.mjs'
|
|
22
23
|
import { identity } from '../types/function/module.f.mjs'
|
|
23
24
|
import { max } from '../types/function/compare/module.f.mjs'
|
|
24
25
|
import { encode as b128encode, decode as b128decode } from '../basen/base128/module.f.mjs'
|
|
@@ -65,7 +66,13 @@ const parsedTagEncode = ([classPc, number]) => {
|
|
|
65
66
|
/** @type {(v: Vec) => readonly[_ParsedTag, Vec]} */
|
|
66
67
|
const parsedTagDecode = v => {
|
|
67
68
|
const [firstByte, rest] = pop8(v)
|
|
68
|
-
const classPc =
|
|
69
|
+
const classPc = firstByte & classPcMask
|
|
70
|
+
// `classPcMask` is the top three bits, so the result is one of eight values;
|
|
71
|
+
// the assert is what narrows `bigint` to `_ClassPc`.
|
|
72
|
+
assert(classPc === 0b000_00000n || classPc === 0b001_00000n
|
|
73
|
+
|| classPc === 0b010_00000n || classPc === 0b011_00000n
|
|
74
|
+
|| classPc === 0b100_00000n || classPc === 0b101_00000n
|
|
75
|
+
|| classPc === 0b110_00000n || classPc === 0b111_00000n, classPc)
|
|
69
76
|
const firstByteNumber = firstByte & tagNumberMask
|
|
70
77
|
const [number, rest1] = firstByteNumber < tagNumberMask
|
|
71
78
|
? [firstByteNumber, rest]
|
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,11 +42,22 @@ 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;
|
|
44
49
|
withArc: () => void;
|
|
45
50
|
};
|
|
46
51
|
unknownTag: () => void;
|
|
52
|
+
tagClass: {
|
|
53
|
+
universalPrimitive: () => void;
|
|
54
|
+
universalConstructed: () => void;
|
|
55
|
+
applicationPrimitive: () => void;
|
|
56
|
+
applicationConstructed: () => void;
|
|
57
|
+
contextPrimitive: () => void;
|
|
58
|
+
contextConstructed: () => void;
|
|
59
|
+
privatePrimitive: () => void;
|
|
60
|
+
privateConstructed: () => void;
|
|
61
|
+
};
|
|
47
62
|
raw: (() => void)[];
|
|
48
63
|
};
|
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: () => {
|
|
@@ -284,6 +296,22 @@ export const proof = {
|
|
|
284
296
|
// Re-encoding an UnsupportedRecord returns it unchanged (it is already the TLV bytes)
|
|
285
297
|
assertEq(encode(decoded), raw, 'encode should round-trip UnsupportedRecord')
|
|
286
298
|
},
|
|
299
|
+
// parsedTagDecode narrows the top three bits of the tag's first byte
|
|
300
|
+
// (class + primitive/constructed) to one of exactly eight values via an
|
|
301
|
+
// 8-way `||` assert. Every other test in this file only ever exercises
|
|
302
|
+
// the universal-primitive tag (top bits 000), so each of the other seven
|
|
303
|
+
// comparisons has never had a case where it's the one that turns the
|
|
304
|
+
// assert true — one round trip per class×P/C combination covers them all.
|
|
305
|
+
tagClass: {
|
|
306
|
+
universalPrimitive: () => check(0x02n, vec8(0x42n), empty),
|
|
307
|
+
universalConstructed: () => check(0x22n, vec8(0x42n), empty),
|
|
308
|
+
applicationPrimitive: () => check(0x42n, vec8(0x42n), empty),
|
|
309
|
+
applicationConstructed: () => check(0x62n, vec8(0x42n), empty),
|
|
310
|
+
contextPrimitive: () => check(0x82n, vec8(0x42n), empty),
|
|
311
|
+
contextConstructed: () => check(0xA2n, vec8(0x42n), empty),
|
|
312
|
+
privatePrimitive: () => check(0xC2n, vec8(0x42n), empty),
|
|
313
|
+
privateConstructed: () => check(0xE2n, vec8(0x42n), empty),
|
|
314
|
+
},
|
|
287
315
|
raw: [
|
|
288
316
|
() => {
|
|
289
317
|
const e = encodeRaw([0x00n, vec8(0x23n)])
|
|
@@ -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(),
|
|
@@ -6,12 +6,27 @@
|
|
|
6
6
|
* @import { Vec } from '../../types/bit_vec/types.ts'
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { mask } from '../../types/bigint/module.f.mjs'
|
|
9
10
|
import { vec8, msb, empty } from '../../types/bit_vec/module.f.mjs'
|
|
10
11
|
|
|
11
12
|
const { concat, popFront } = msb
|
|
12
13
|
|
|
13
14
|
const pop8 = popFront(8n)
|
|
14
15
|
|
|
16
|
+
/**
|
|
17
|
+
* The varint layout both halves below agree on, stated once: each byte carries
|
|
18
|
+
* seven payload bits in its low end, and its top bit is set on every byte
|
|
19
|
+
* except the last.
|
|
20
|
+
*
|
|
21
|
+
* `encode` and `decode` are exact inverses, so the two must agree bit for bit.
|
|
22
|
+
* The masks are derived from `payloadBits` rather than written as `0x7f` and
|
|
23
|
+
* `0x80` so that agreement is structural rather than a pair of literals a
|
|
24
|
+
* reader has to match up.
|
|
25
|
+
*/
|
|
26
|
+
const payloadBits = 7n
|
|
27
|
+
const payloadMask = mask(payloadBits)
|
|
28
|
+
const continuationFlag = 1n << payloadBits
|
|
29
|
+
|
|
15
30
|
/**
|
|
16
31
|
* Encodes a bigint into an MSB Base128 vector.
|
|
17
32
|
*
|
|
@@ -22,10 +37,12 @@ export const encode = uint => {
|
|
|
22
37
|
/** @type {Vec} */
|
|
23
38
|
let result = empty
|
|
24
39
|
while (true) {
|
|
25
|
-
const item = uint &
|
|
26
|
-
|
|
40
|
+
const item = uint & payloadMask
|
|
41
|
+
// The first byte built is the last one emitted, so it is the only one
|
|
42
|
+
// without the continuation flag.
|
|
43
|
+
const flag = result === empty ? 0n : continuationFlag
|
|
27
44
|
result = concat(vec8(flag | item))(result)
|
|
28
|
-
uint >>=
|
|
45
|
+
uint >>= payloadBits
|
|
29
46
|
if (uint === 0n) {
|
|
30
47
|
return result
|
|
31
48
|
}
|
|
@@ -42,8 +59,8 @@ export const decode = v => {
|
|
|
42
59
|
let result = 0n
|
|
43
60
|
while (true) {
|
|
44
61
|
const [byte, rest] = pop8(v)
|
|
45
|
-
result = (result <<
|
|
46
|
-
if (byte
|
|
62
|
+
result = (result << payloadBits) | (byte & payloadMask)
|
|
63
|
+
if ((byte & continuationFlag) === 0n) {
|
|
47
64
|
return [result, rest]
|
|
48
65
|
}
|
|
49
66
|
v = rest
|
|
@@ -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'
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* {@link toData} conversion from the functional grammar.
|
|
4
4
|
*
|
|
5
5
|
* This module is the pure, parser-agnostic substrate: it defines the
|
|
6
|
-
* {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange
|
|
7
|
-
* converts a functional grammar into it. The automaton builders
|
|
8
|
-
* {@link RuleSet} live in their own sibling modules
|
|
9
|
-
* `fjs/bnf/descent`, …), so the IR stays free of any one
|
|
6
|
+
* {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange |
|
|
7
|
+
* Repeat`) and converts a functional grammar into it. The automaton builders
|
|
8
|
+
* that consume a {@link RuleSet} live in their own sibling modules
|
|
9
|
+
* (`fjs/bnf/ll1`, `fjs/bnf/descent`, …), so the IR stays free of any one
|
|
10
|
+
* parser's machinery.
|
|
10
11
|
*
|
|
11
12
|
* See `./types.ts` for the type-level API.
|
|
12
13
|
*
|
|
@@ -14,11 +15,23 @@
|
|
|
14
15
|
*
|
|
15
16
|
* @import { DataRule, Rule as FRule, Sequence as FSequence } from '../types.ts'
|
|
16
17
|
* @import { StringMap } from '../../types/object/types.ts'
|
|
17
|
-
* @import {
|
|
18
|
+
* @import { StringSet } from '../../types/string_set/types.ts'
|
|
19
|
+
* @import { EmptyTag, Repeat, Rule, RuleSet, Sequence, Variant } from './types.ts'
|
|
18
20
|
*/
|
|
19
21
|
import type { Rule as FRule } from '../types.ts';
|
|
20
22
|
import type { StringMap } from '../../types/object/types.ts';
|
|
21
|
-
import type { EmptyTag, Rule, RuleSet } from './types.ts';
|
|
23
|
+
import type { EmptyTag, Repeat, Rule, RuleSet } from './types.ts';
|
|
24
|
+
/**
|
|
25
|
+
* Whether a data rule is a {@link Repeat}.
|
|
26
|
+
*
|
|
27
|
+
* Every rule-dispatch site asks this instead of testing for a string inline, so
|
|
28
|
+
* the repetition rule kind has exactly one discriminator to move when the
|
|
29
|
+
* surrounding rule model changes.
|
|
30
|
+
*
|
|
31
|
+
* @param {Rule} rule
|
|
32
|
+
* @returns {rule is Repeat}
|
|
33
|
+
*/
|
|
34
|
+
export declare const isRepeat: (rule: Rule) => rule is Repeat;
|
|
22
35
|
export type _EmptyTagMap = StringMap<EmptyTag>;
|
|
23
36
|
/**
|
|
24
37
|
* Computes, for every rule in the set, whether it can match empty input, by
|
|
@@ -38,6 +51,19 @@ export type _EmptyTagMap = StringMap<EmptyTag>;
|
|
|
38
51
|
export declare const emptyTagMap: (ruleSet: RuleSet) => _EmptyTagMap;
|
|
39
52
|
export type _FRuleMap = StringMap<FRule>;
|
|
40
53
|
export type _NewRule = (m: _FRuleMap) => readonly [_FRuleMap, RuleSet, Rule];
|
|
54
|
+
/**
|
|
55
|
+
* Rewrites every right-recursive 0-or-more rule of a {@link RuleSet} into a
|
|
56
|
+
* {@link Repeat}, and drops the rules that the rewrite orphans.
|
|
57
|
+
*
|
|
58
|
+
* The dropped rules are the recursive branch and, unless something else still
|
|
59
|
+
* refers to it, the empty one: both are reachable only through the variant that
|
|
60
|
+
* the {@link Repeat} replaces. Pruning them keeps the invariant that every rule
|
|
61
|
+
* of a generated set is reachable from its entry, so the serialized form holds
|
|
62
|
+
* no dead grammar.
|
|
63
|
+
*
|
|
64
|
+
* @type {(ruleSet: RuleSet, entry: string) => RuleSet}
|
|
65
|
+
*/
|
|
66
|
+
export declare const detectRepeat: (ruleSet: RuleSet, entry: string) => RuleSet;
|
|
41
67
|
/**
|
|
42
68
|
* Converts a functional grammar rule into serializable BNF data and returns
|
|
43
69
|
* the generated rule set with the entry rule identifier.
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* {@link toData} conversion from the functional grammar.
|
|
4
4
|
*
|
|
5
5
|
* This module is the pure, parser-agnostic substrate: it defines the
|
|
6
|
-
* {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange
|
|
7
|
-
* converts a functional grammar into it. The automaton builders
|
|
8
|
-
* {@link RuleSet} live in their own sibling modules
|
|
9
|
-
* `fjs/bnf/descent`, …), so the IR stays free of any one
|
|
6
|
+
* {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange |
|
|
7
|
+
* Repeat`) and converts a functional grammar into it. The automaton builders
|
|
8
|
+
* that consume a {@link RuleSet} live in their own sibling modules
|
|
9
|
+
* (`fjs/bnf/ll1`, `fjs/bnf/descent`, …), so the IR stays free of any one
|
|
10
|
+
* parser's machinery.
|
|
10
11
|
*
|
|
11
12
|
* See `./types.ts` for the type-level API.
|
|
12
13
|
*
|
|
@@ -14,13 +15,27 @@
|
|
|
14
15
|
*
|
|
15
16
|
* @import { DataRule, Rule as FRule, Sequence as FSequence } from '../types.ts'
|
|
16
17
|
* @import { StringMap } from '../../types/object/types.ts'
|
|
17
|
-
* @import {
|
|
18
|
+
* @import { StringSet } from '../../types/string_set/types.ts'
|
|
19
|
+
* @import { EmptyTag, Repeat, Rule, RuleSet, Sequence, Variant } from './types.ts'
|
|
18
20
|
*/
|
|
19
21
|
|
|
20
22
|
import { stringToCodePointList } from '../../text/utf16/module.f.mjs'
|
|
21
23
|
import { map, toArray } from '../../types/list/module.f.mjs'
|
|
22
24
|
import { oneEncode } from '../module.f.mjs'
|
|
23
|
-
import { definedEntries } from '../../types/object/module.f.mjs'
|
|
25
|
+
import { definedEntries, definedValues } from '../../types/object/module.f.mjs'
|
|
26
|
+
import { contains, set } from '../../types/string_set/module.f.mjs'
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Whether a data rule is a {@link Repeat}.
|
|
30
|
+
*
|
|
31
|
+
* Every rule-dispatch site asks this instead of testing for a string inline, so
|
|
32
|
+
* the repetition rule kind has exactly one discriminator to move when the
|
|
33
|
+
* surrounding rule model changes.
|
|
34
|
+
*
|
|
35
|
+
* @param {Rule} rule
|
|
36
|
+
* @returns {rule is Repeat}
|
|
37
|
+
*/
|
|
38
|
+
export const isRepeat = rule => typeof rule === 'string'
|
|
24
39
|
|
|
25
40
|
/** @typedef {StringMap<EmptyTag>} _EmptyTagMap */
|
|
26
41
|
|
|
@@ -30,6 +45,10 @@ const emptyTagOf = map => rule => {
|
|
|
30
45
|
return undefined
|
|
31
46
|
} else if (rule instanceof Array) {
|
|
32
47
|
return rule.every(item => map[item] !== undefined) ? true : undefined
|
|
48
|
+
} else if (isRepeat(rule)) {
|
|
49
|
+
// Zero repetitions is a match whatever the body does, and it carries no
|
|
50
|
+
// tag of its own — a repetition is a sequence of items, not a choice.
|
|
51
|
+
return true
|
|
33
52
|
} else {
|
|
34
53
|
/** @type {EmptyTag} */
|
|
35
54
|
let tag = undefined
|
|
@@ -176,6 +195,92 @@ const toDataAdd = map => fr => {
|
|
|
176
195
|
return [map2, { ...set, [id]: rule }, id]
|
|
177
196
|
}
|
|
178
197
|
|
|
198
|
+
//
|
|
199
|
+
|
|
200
|
+
const { fromEntries } = Object
|
|
201
|
+
|
|
202
|
+
/** @type {(rule: Rule) => Sequence} */
|
|
203
|
+
const refs = rule => {
|
|
204
|
+
if (typeof rule === 'number') {
|
|
205
|
+
return []
|
|
206
|
+
} else if (rule instanceof Array) {
|
|
207
|
+
return rule
|
|
208
|
+
} else if (isRepeat(rule)) {
|
|
209
|
+
return [rule]
|
|
210
|
+
} else {
|
|
211
|
+
return definedValues(rule)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** @type {(ruleSet: RuleSet) => (visited: StringSet, name: string) => StringSet} */
|
|
216
|
+
const visit = ruleSet => (visited, name) =>
|
|
217
|
+
contains(name)(visited)
|
|
218
|
+
? visited
|
|
219
|
+
: refs(ruleSet[name]).reduce(visit(ruleSet), set(name)(visited))
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Every rule the entry rule can reach, itself included.
|
|
223
|
+
*
|
|
224
|
+
* @type {(ruleSet: RuleSet) => (entry: string) => StringSet}
|
|
225
|
+
*/
|
|
226
|
+
const reachable = ruleSet => entry => visit(ruleSet)(null, entry)
|
|
227
|
+
|
|
228
|
+
/** @type {(rule: Rule) => boolean} */
|
|
229
|
+
const isNone = rule => rule instanceof Array && rule.length === 0
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* The {@link Repeat} — the name of the item to repeat — that `name` encodes as
|
|
233
|
+
* right-recursion, or `undefined` when it encodes something else.
|
|
234
|
+
*
|
|
235
|
+
* The shape recognized is exactly the unambiguous 0-or-more list: a two-branch
|
|
236
|
+
* variant whose branches are an empty sequence and `[item, name]`, in either
|
|
237
|
+
* order. Everything looser stays as it is — an operator-style tree, a separated
|
|
238
|
+
* list, or a 1-or-more chain all reach `name` again, but their extra items make
|
|
239
|
+
* the grouping a real choice rather than a list, so folding them into a flat
|
|
240
|
+
* sequence would discard structure no rule name is left to recover.
|
|
241
|
+
*
|
|
242
|
+
* Two further conditions keep the fold sound rather than merely plausible:
|
|
243
|
+
* `item` must not lead back to `name`, so `name`'s only self-reference is the
|
|
244
|
+
* tail one, and `item` must not match empty, since a body that can consume
|
|
245
|
+
* nothing has infinitely many parses of the same input.
|
|
246
|
+
*
|
|
247
|
+
* @type {(ruleSet: RuleSet, emptyTags: _EmptyTagMap) => (name: string) => Repeat | undefined}
|
|
248
|
+
*/
|
|
249
|
+
const repeatOf = (ruleSet, emptyTags) => name => {
|
|
250
|
+
const rule = ruleSet[name]
|
|
251
|
+
if (typeof rule === 'number' || rule instanceof Array || isRepeat(rule)) { return undefined }
|
|
252
|
+
const branches = definedValues(rule)
|
|
253
|
+
if (branches.length !== 2) { return undefined }
|
|
254
|
+
const [a, b] = branches
|
|
255
|
+
const step = isNone(ruleSet[a]) ? b : isNone(ruleSet[b]) ? a : undefined
|
|
256
|
+
if (step === undefined) { return undefined }
|
|
257
|
+
const stepRule = ruleSet[step]
|
|
258
|
+
if (!(stepRule instanceof Array) || stepRule.length !== 2 || stepRule[1] !== name) { return undefined }
|
|
259
|
+
const [item] = stepRule
|
|
260
|
+
if (emptyTags[item] !== undefined || contains(name)(reachable(ruleSet)(item))) { return undefined }
|
|
261
|
+
return item
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Rewrites every right-recursive 0-or-more rule of a {@link RuleSet} into a
|
|
266
|
+
* {@link Repeat}, and drops the rules that the rewrite orphans.
|
|
267
|
+
*
|
|
268
|
+
* The dropped rules are the recursive branch and, unless something else still
|
|
269
|
+
* refers to it, the empty one: both are reachable only through the variant that
|
|
270
|
+
* the {@link Repeat} replaces. Pruning them keeps the invariant that every rule
|
|
271
|
+
* of a generated set is reachable from its entry, so the serialized form holds
|
|
272
|
+
* no dead grammar.
|
|
273
|
+
*
|
|
274
|
+
* @type {(ruleSet: RuleSet, entry: string) => RuleSet}
|
|
275
|
+
*/
|
|
276
|
+
export const detectRepeat = (ruleSet, entry) => {
|
|
277
|
+
const repeat = repeatOf(ruleSet, emptyTagMap(ruleSet))
|
|
278
|
+
/** @type {RuleSet} */
|
|
279
|
+
const next = fromEntries(entries(ruleSet).map(([k, v]) => [k, repeat(k) ?? v]))
|
|
280
|
+
const live = reachable(next)(entry)
|
|
281
|
+
return fromEntries(entries(next).filter(([k]) => contains(k)(live)))
|
|
282
|
+
}
|
|
283
|
+
|
|
179
284
|
/**
|
|
180
285
|
* Converts a functional grammar rule into serializable BNF data and returns
|
|
181
286
|
* the generated rule set with the entry rule identifier.
|
|
@@ -184,5 +289,5 @@ const toDataAdd = map => fr => {
|
|
|
184
289
|
*/
|
|
185
290
|
export const toData = fr => {
|
|
186
291
|
const [, ruleSet, id] = toDataAdd({})(fr)
|
|
187
|
-
return [ruleSet, id]
|
|
292
|
+
return [detectRepeat(ruleSet, id), id]
|
|
188
293
|
}
|