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
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @import { Unknown } from '../types.ts'
|
|
7
7
|
* @import { Result } from '../../types/result/types.ts'
|
|
8
|
-
* @import { List } from '../../types/list/types.ts'
|
|
9
|
-
* @import { OrderedMap } from '../../types/ordered_map/types.ts'
|
|
10
8
|
* @import { ParseError } from '../parser/types.ts'
|
|
11
9
|
* @import { AstModule } from '../ast/types.ts'
|
|
10
|
+
* @import { Operation } from '../../effects/types.ts'
|
|
11
|
+
* @import { IoChannel } from '../../effects/node/types.ts'
|
|
12
12
|
* @import { Effect } from '../../effects/types.ts'
|
|
13
13
|
* @import { ReadFile } from '../../effects/node/types.ts'
|
|
14
|
+
* @import { ParseContext } from './types.ts'
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
import { error, ok } from '../../types/result/module.f.mjs'
|
|
@@ -20,27 +21,20 @@ import { setReplace, at } from '../../types/ordered_map/module.f.mjs'
|
|
|
20
21
|
import { stringToList } from '../../text/utf16/module.f.mjs'
|
|
21
22
|
import { concat as pathConcat } from '../../path/module.f.mjs'
|
|
22
23
|
import { parseFromTokens } from '../parser/module.f.mjs'
|
|
24
|
+
import { parse as jsonParse } from '../../media/json/module.f.mjs'
|
|
23
25
|
import { run } from '../ast/module.f.mjs'
|
|
24
|
-
import {
|
|
26
|
+
import { pure } from '../../effects/module.f.mjs'
|
|
27
|
+
import { catchStep, foldStep, mapStep, pureError, pureOk, step } from '../../effects/module.f.mjs'
|
|
25
28
|
import { readUtf8File } from '../../effects/node/module.f.mjs'
|
|
26
29
|
|
|
27
30
|
/**
|
|
28
|
-
*
|
|
31
|
+
* Reads a file, reporting any failure as the one `ParseError` a caller can act
|
|
32
|
+
* on. Both readers want this and neither wants the node channel's vocabulary.
|
|
29
33
|
*
|
|
30
|
-
*
|
|
31
|
-
* - `stack`: import chain currently being resolved (used to detect circular dependencies).
|
|
32
|
-
* - `error`: the first parse error encountered, or `null` while everything is clean.
|
|
33
|
-
* @typedef {{
|
|
34
|
-
* readonly complete: OrderedMap<djsResult>
|
|
35
|
-
* readonly stack: List<string>
|
|
36
|
-
* readonly error: ParseError | null
|
|
37
|
-
* }} ParseContext
|
|
38
|
-
*/
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* The evaluated DJS value produced for one successfully transpiled module.
|
|
42
|
-
* @typedef {{ djs: Unknown }} djsResult
|
|
34
|
+
* @type {<O extends Operation>(e: Effect<O, string, IoChannel>) => Effect<O, string, ParseError>}
|
|
43
35
|
*/
|
|
36
|
+
const notFound = e =>
|
|
37
|
+
catchStep(e, () => pureError({ message: 'file not found', metadata: null }))
|
|
44
38
|
|
|
45
39
|
/** @type {(context: ParseContext) => (path: string) => Unknown} */
|
|
46
40
|
const mapDjs = context => path => {
|
|
@@ -52,82 +46,95 @@ const mapDjs = context => path => {
|
|
|
52
46
|
return res.djs
|
|
53
47
|
}
|
|
54
48
|
|
|
55
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* `catchStep` rather than a branch on the read's `Result`: however the read
|
|
51
|
+
* failed — missing file, unreadable, a runner without `readFile` — the answer
|
|
52
|
+
* a transpiler gives is the same `ParseError`, so the node channel is
|
|
53
|
+
* translated once here rather than travelling any further.
|
|
54
|
+
*
|
|
55
|
+
* @type {(path: string) => Effect<ReadFile, AstModule, ParseError>}
|
|
56
|
+
*/
|
|
56
57
|
const parseModule = path => step(
|
|
57
|
-
readUtf8File(path),
|
|
58
|
-
|
|
59
|
-
if (result[0] === 'error') {
|
|
60
|
-
return pure(error({ message: 'file not found', metadata: null }))
|
|
61
|
-
}
|
|
62
|
-
const tokens = tokenize(stringToList(result[1]))(path)
|
|
63
|
-
return pure(parseFromTokens(tokens))
|
|
64
|
-
})
|
|
58
|
+
notFound(readUtf8File(path)),
|
|
59
|
+
text => pure(parseFromTokens(tokenize(stringToList(text))(path))))
|
|
65
60
|
|
|
66
|
-
/** @type {(path: string) => (
|
|
67
|
-
const transpileWithImports = path =>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return pure({
|
|
83
|
-
...contextWithImports,
|
|
84
|
-
stack: drop(1)(contextWithImports.stack),
|
|
85
|
-
complete: setReplace(path)(djs)(contextWithImports.complete),
|
|
86
|
-
})
|
|
61
|
+
/** @type {(path: string) => (module: AstModule) => (context: ParseContext) => Effect<ReadFile, ParseContext, ParseError>} */
|
|
62
|
+
const transpileWithImports = path => module => context => {
|
|
63
|
+
const dir = pathConcat(path)('..')
|
|
64
|
+
const pathsCombine = listMap(pathConcat(dir))(module[0])
|
|
65
|
+
const pathsArray = toArray(pathsCombine)
|
|
66
|
+
const contextWithStack = { ...context, stack: { first: path, tail: context.stack } }
|
|
67
|
+
const x0 = foldStep(pureOk(pathsArray), contextWithStack, foldNextModuleOp)
|
|
68
|
+
return step(
|
|
69
|
+
x0,
|
|
70
|
+
contextWithImports => {
|
|
71
|
+
const args = toArray(listMap(mapDjs(contextWithImports))(pathsCombine))
|
|
72
|
+
const djs = { djs: run(module[1])(args) }
|
|
73
|
+
return pureOk({
|
|
74
|
+
...contextWithImports,
|
|
75
|
+
stack: drop(1)(contextWithImports.stack),
|
|
76
|
+
complete: setReplace(path)(djs)(contextWithImports.complete),
|
|
87
77
|
})
|
|
88
|
-
|
|
89
|
-
return pure({ ...context, error: parseModuleResult[1] })
|
|
78
|
+
})
|
|
90
79
|
}
|
|
91
80
|
|
|
92
|
-
/** @type {(path: string) => (context: ParseContext) => Effect<ReadFile, ParseContext>} */
|
|
81
|
+
/** @type {(path: string) => (context: ParseContext) => Effect<ReadFile, ParseContext, ParseError>} */
|
|
93
82
|
const foldNextModuleOp = path => context => {
|
|
94
|
-
if (context.error !== null) {
|
|
95
|
-
return pure(context)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
83
|
if (includes(path)(context.stack)) {
|
|
99
|
-
return
|
|
84
|
+
return pureError({ message: 'circular dependency', metadata: null })
|
|
100
85
|
}
|
|
101
86
|
|
|
102
87
|
if (at(path)(context.complete) !== null) {
|
|
103
|
-
return
|
|
88
|
+
return pureOk(context)
|
|
104
89
|
}
|
|
105
90
|
|
|
106
91
|
return step(
|
|
107
92
|
parseModule(path),
|
|
108
|
-
|
|
93
|
+
module => transpileWithImports(path)(module)(context))
|
|
109
94
|
}
|
|
110
95
|
|
|
96
|
+
/** @type {(path: string) => Effect<ReadFile, Unknown, ParseError>} */
|
|
97
|
+
const transpileModule = path => mapStep(
|
|
98
|
+
foldNextModuleOp(path)({ stack: null, complete: null }),
|
|
99
|
+
context => at(path)(context.complete)?.djs)
|
|
100
|
+
|
|
111
101
|
/**
|
|
112
|
-
*
|
|
102
|
+
* A JSON document is a value, not a module: it imports nothing and names
|
|
103
|
+
* nothing, so it needs no AST and no evaluation — `fjs/media/json` reads it
|
|
104
|
+
* and the value is the result.
|
|
113
105
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
106
|
+
* That reader reports its errors without a position, so the `ParseError` has
|
|
107
|
+
* no metadata and `fjs/djs`'s `compile` names the file instead of a line and
|
|
108
|
+
* column.
|
|
117
109
|
*
|
|
118
|
-
* @type {(path: string) => Effect<ReadFile,
|
|
110
|
+
* @type {(path: string) => Effect<ReadFile, Unknown, ParseError>}
|
|
119
111
|
*/
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const result = at(path)(context.complete)?.djs
|
|
128
|
-
return pure(ok(result))
|
|
112
|
+
const transpileJson = path => step(
|
|
113
|
+
notFound(readUtf8File(path)),
|
|
114
|
+
text => {
|
|
115
|
+
const json = jsonParse(text)
|
|
116
|
+
return pure(json[0] === 'error'
|
|
117
|
+
? error({ message: json[1], metadata: null })
|
|
118
|
+
: ok(json[1]))
|
|
129
119
|
})
|
|
130
120
|
|
|
121
|
+
/**
|
|
122
|
+
* Transpiles the file at `path` into a single `Unknown` value.
|
|
123
|
+
*
|
|
124
|
+
* The extension names its language: a `.json` file is a JSON document, read by
|
|
125
|
+
* `fjs/media/json`, and anything else is a FunctionalScript module, whose
|
|
126
|
+
* imports are resolved recursively — each of them a module too, whatever it is
|
|
127
|
+
* called ([spec: the `__proto__` key](../../../spec/README.md#the-__proto__-key)).
|
|
128
|
+
*
|
|
129
|
+
* Returns `['ok', value]` on success, or `['error', ParseError]` on a parse
|
|
130
|
+
* failure, a missing file, or a circular dependency.
|
|
131
|
+
*
|
|
132
|
+
* @type {(path: string) => Effect<ReadFile, Unknown, ParseError>}
|
|
133
|
+
*/
|
|
134
|
+
export const transpile = path => path.endsWith('.json')
|
|
135
|
+
? transpileJson(path)
|
|
136
|
+
: transpileModule(path)
|
|
137
|
+
|
|
131
138
|
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
132
139
|
|
|
133
140
|
export const proof = {
|
|
@@ -136,6 +143,6 @@ export const proof = {
|
|
|
136
143
|
// has already resolved into `context.complete`, so the `res === null`
|
|
137
144
|
// guard is an internal-invariant check unreachable through `transpile`'s
|
|
138
145
|
// public API. Call it directly with an empty `complete` map to cover it.
|
|
139
|
-
mapDjsUnresolvedImport: () => mapDjs({ complete: null, stack: null
|
|
146
|
+
mapDjsUnresolvedImport: () => mapDjs({ complete: null, stack: null })('missing.djs'),
|
|
140
147
|
},
|
|
141
148
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the DJS transpiler.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Unknown } from '../types.ts';
|
|
7
|
+
import type { List } from '../../types/list/types.ts';
|
|
8
|
+
import type { OrderedMap } from '../../types/ordered_map/types.ts';
|
|
9
|
+
/** The evaluated DJS value produced for one successfully transpiled module. */
|
|
10
|
+
export type djsResult = {
|
|
11
|
+
djs: Unknown;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* State threaded through the recursive transpilation of a DJS module graph.
|
|
15
|
+
*
|
|
16
|
+
* - `complete`: modules that have been fully parsed and evaluated, keyed by path.
|
|
17
|
+
* - `stack`: import chain currently being resolved (used to detect circular dependencies).
|
|
18
|
+
*
|
|
19
|
+
* There is no `error` field. It used to hold "the first parse error
|
|
20
|
+
* encountered, or `null` while everything is clean" — a hand-rolled error
|
|
21
|
+
* channel that every step had to set, and that three separate places had to
|
|
22
|
+
* test before doing any work. It is the effect's channel now
|
|
23
|
+
* (`Effect<ReadFile, ParseContext, ParseError>`), so `step` short-circuits and
|
|
24
|
+
* a context that exists is a context that is still good.
|
|
25
|
+
*/
|
|
26
|
+
export type ParseContext = {
|
|
27
|
+
readonly complete: OrderedMap<djsResult>;
|
|
28
|
+
readonly stack: List<string>;
|
|
29
|
+
};
|
package/fjs/djs/types.d.ts
CHANGED
|
@@ -4,10 +4,16 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
|
-
import type { Primitive as JsonPrimitive } from '../media/json/types.ts';
|
|
7
|
+
import type { Primitive as JsonPrimitive, TreeMapEntries } from '../media/json/types.ts';
|
|
8
8
|
export type Object = {
|
|
9
9
|
readonly [k in string]?: Unknown;
|
|
10
10
|
};
|
|
11
11
|
export type Array = readonly Unknown[];
|
|
12
12
|
export type Primitive = JsonPrimitive | bigint | undefined;
|
|
13
13
|
export type Unknown = Primitive | Object | Array;
|
|
14
|
+
/**
|
|
15
|
+
* How the serializer orders an object's entries — `sort` for canonical
|
|
16
|
+
* output, `identity` to keep insertion order. The same alias JSON and
|
|
17
|
+
* extended JSON instantiate, at DJS's leaf set.
|
|
18
|
+
*/
|
|
19
|
+
export type _MapEntries = TreeMapEntries<Primitive>;
|
|
@@ -1,24 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Effectful cons-list construction.
|
|
3
|
+
*
|
|
4
|
+
* See `./types.ts` for the type-level API.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Operation } from "../types.ts"
|
|
9
|
+
* @import { Effect } from "../types.ts"
|
|
10
|
+
* @import { List, Next } from "./types.ts"
|
|
11
|
+
*/
|
|
12
|
+
import type { Operation } from "../types.ts";
|
|
13
|
+
import type { Effect } from "../types.ts";
|
|
2
14
|
import type { List, Next } from "./types.ts";
|
|
3
|
-
/** @import { Effect, Operation } from "../types.ts" */
|
|
4
|
-
/** @import { List, Next } from "./types.ts" */
|
|
5
15
|
/**
|
|
6
16
|
* The empty `List`: a pure end-of-stream marker (`undefined`).
|
|
7
17
|
*
|
|
8
|
-
* The explicit `Effect<O, Next<O, T
|
|
9
|
-
* check, so the recursive payload type-checks without a cast.
|
|
10
|
-
* these two combinators
|
|
18
|
+
* The explicit `Effect<O, Next<O, T, E>, E>` return type lets the contextual
|
|
19
|
+
* type drive the check, so the recursive payload type-checks without a cast.
|
|
20
|
+
* Construct streams through these two combinators, and end a stream that
|
|
21
|
+
* *failed* with `pureError` rather than with either of them.
|
|
11
22
|
*
|
|
12
|
-
* Note:
|
|
13
|
-
* `List<O, T>`.
|
|
23
|
+
* Note: the expanded type is written out because TypeScript cannot convert
|
|
24
|
+
* `pureOk(...)` to `List<O, T, E>`.
|
|
14
25
|
*
|
|
15
|
-
* @type {<O extends Operation, T>() => Effect<O, Next<O, T
|
|
26
|
+
* @type {<O extends Operation, T, E>() => Effect<O, Next<O, T, E>, E>}
|
|
16
27
|
*/
|
|
17
|
-
export declare const empty: <O extends Operation, T>() => Effect<O, Next<O, T
|
|
28
|
+
export declare const empty: <O extends Operation, T, E>() => Effect<O, Next<O, T, E>, E>;
|
|
18
29
|
/**
|
|
19
30
|
* Prepends `first` to a {@link List} `tail`, as a pure cons cell. `tail` is an
|
|
20
31
|
* ordinary argument, so it is built before the cell is — see {@link Next}.
|
|
21
32
|
*
|
|
22
|
-
* @type {<O extends Operation, T>(first: T, tail: List<O, T>) => Effect<O, Next<O, T
|
|
33
|
+
* @type {<O extends Operation, T, E>(first: T, tail: List<O, T, E>) => Effect<O, Next<O, T, E>, E>}
|
|
23
34
|
*/
|
|
24
|
-
export declare const nonEmpty: <O extends Operation, T>(first: T, tail: List<O, T>) => Effect<O, Next<O, T
|
|
35
|
+
export declare const nonEmpty: <O extends Operation, T, E>(first: T, tail: List<O, T, E>) => Effect<O, Next<O, T, E>, E>;
|
|
@@ -4,31 +4,35 @@
|
|
|
4
4
|
* See `./types.ts` for the type-level API.
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Operation } from "../types.ts"
|
|
9
|
+
* @import { Effect } from "../types.ts"
|
|
10
|
+
* @import { List, Next } from "./types.ts"
|
|
7
11
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/** @import { List, Next } from "./types.ts" */
|
|
12
|
+
|
|
13
|
+
import { pureOk } from "../module.f.mjs"
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
16
|
* The empty `List`: a pure end-of-stream marker (`undefined`).
|
|
14
17
|
*
|
|
15
|
-
* The explicit `Effect<O, Next<O, T
|
|
16
|
-
* check, so the recursive payload type-checks without a cast.
|
|
17
|
-
* these two combinators
|
|
18
|
+
* The explicit `Effect<O, Next<O, T, E>, E>` return type lets the contextual
|
|
19
|
+
* type drive the check, so the recursive payload type-checks without a cast.
|
|
20
|
+
* Construct streams through these two combinators, and end a stream that
|
|
21
|
+
* *failed* with `pureError` rather than with either of them.
|
|
18
22
|
*
|
|
19
|
-
* Note:
|
|
20
|
-
* `List<O, T>`.
|
|
23
|
+
* Note: the expanded type is written out because TypeScript cannot convert
|
|
24
|
+
* `pureOk(...)` to `List<O, T, E>`.
|
|
21
25
|
*
|
|
22
|
-
* @type {<O extends Operation, T>() => Effect<O, Next<O, T
|
|
26
|
+
* @type {<O extends Operation, T, E>() => Effect<O, Next<O, T, E>, E>}
|
|
23
27
|
*/
|
|
24
28
|
export const empty = () =>
|
|
25
|
-
|
|
29
|
+
pureOk(undefined)
|
|
26
30
|
|
|
27
31
|
/**
|
|
28
32
|
* Prepends `first` to a {@link List} `tail`, as a pure cons cell. `tail` is an
|
|
29
33
|
* ordinary argument, so it is built before the cell is — see {@link Next}.
|
|
30
34
|
*
|
|
31
|
-
* @type {<O extends Operation, T>(first: T, tail: List<O, T>) => Effect<O, Next<O, T
|
|
35
|
+
* @type {<O extends Operation, T, E>(first: T, tail: List<O, T, E>) => Effect<O, Next<O, T, E>, E>}
|
|
32
36
|
*/
|
|
33
37
|
export const nonEmpty = (first, tail) =>
|
|
34
|
-
|
|
38
|
+
pureOk({ first, tail })
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
|
|
6
|
+
import type { Operation } from '../types.ts';
|
|
7
|
+
import type { Effect, NotImplemented } from '../types.ts';
|
|
8
|
+
export type NonEmpty<O extends Operation, T, E> = {
|
|
8
9
|
readonly first: T;
|
|
9
|
-
readonly tail: List<O, T>;
|
|
10
|
+
readonly tail: List<O, T, E>;
|
|
10
11
|
};
|
|
11
12
|
/**
|
|
12
13
|
* The payload of a `List` effect: the next cons cell, or `undefined` at
|
|
@@ -19,8 +20,27 @@ export type NonEmpty<O extends Operation, T> = {
|
|
|
19
20
|
* streaming comes from cells produced inside a command's continuation, where
|
|
20
21
|
* the tail is not reached until a runner performs the command.
|
|
21
22
|
*
|
|
22
|
-
* `Effect<O, Next<O, T
|
|
23
|
-
* be written as a return type (see `empty`).
|
|
23
|
+
* `Effect<O, Next<O, T, E>, E>` is used directly in places where
|
|
24
|
+
* `List<O, T, E>` cannot be written as a return type (see `empty`).
|
|
24
25
|
*/
|
|
25
|
-
export type Next<O extends Operation, T> = NonEmpty<O, T> | undefined;
|
|
26
|
-
|
|
26
|
+
export type Next<O extends Operation, T, E> = NonEmpty<O, T, E> | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* A stream of `T`s, pulled one cell at a time, which may fail with `E`.
|
|
29
|
+
*
|
|
30
|
+
* **The failure belongs to the cell, not to the item.** A producer that cannot
|
|
31
|
+
* deliver ends the stream by failing it, so there is no such thing as a stream
|
|
32
|
+
* that continues after an error and no tail to construct after one. Putting the
|
|
33
|
+
* failure in `T` instead — `List<O, IoResult<Vec>>`, as this used to be — made
|
|
34
|
+
* an `error` item and an `undefined` end-of-stream two values of one union that
|
|
35
|
+
* every consumer had to keep apart by hand, and left a failing producer
|
|
36
|
+
* obliged to supply a tail nobody would ever pull.
|
|
37
|
+
*
|
|
38
|
+
* It also made short-circuiting unfactorable: a combinator generic in `T`
|
|
39
|
+
* cannot look inside it, so every consumer hand-wrote the same
|
|
40
|
+
* `if (t === 'error') return …`. With the failure in the cell, `step` does it.
|
|
41
|
+
*
|
|
42
|
+
* The cost is that a stream can no longer report one bad item and carry on.
|
|
43
|
+
* Nothing wanted that; a reader that did would carry a `Result` in `T`
|
|
44
|
+
* deliberately, which remains expressible and now means what it says.
|
|
45
|
+
*/
|
|
46
|
+
export type List<O extends Operation, T, E = NotImplemented> = Effect<O, Next<O, T, E>, E>;
|
|
@@ -7,19 +7,21 @@
|
|
|
7
7
|
* generation strategy.
|
|
8
8
|
*
|
|
9
9
|
* Memory effects compose with other effects by unioning operation types, for
|
|
10
|
-
* example `Effect<IoOp | MemOp, T>` for a program that performs both I/O and
|
|
10
|
+
* example `Effect<IoOp | MemOp, T, E>` for a program that performs both I/O and
|
|
11
11
|
* memory operations.
|
|
12
12
|
*
|
|
13
13
|
* See `./types.ts` for the `Key`/`MemCreate`/`MemRead`/`MemWrite`/`MemOp`
|
|
14
14
|
* type-level API.
|
|
15
15
|
*
|
|
16
16
|
* @module
|
|
17
|
+
*
|
|
18
|
+
* @import { Nominal } from '../../types/nominal/types.ts'
|
|
19
|
+
* @import { Effect } from '../types.ts'
|
|
20
|
+
* @import { Key, MemCreate, MemRead, MemWrite, _MemKeyHash } from './types.ts'
|
|
17
21
|
*/
|
|
18
22
|
import type { Nominal } from '../../types/nominal/types.ts';
|
|
19
23
|
import type { Effect } from '../types.ts';
|
|
20
24
|
import type { Key, MemCreate, MemRead, MemWrite, _MemKeyHash } from './types.ts';
|
|
21
|
-
/** @import { Effect } from '../types.ts' */
|
|
22
|
-
/** @import { Key, MemCreate, MemRead, MemWrite, _MemKeyHash } from './types.ts' */
|
|
23
25
|
/** @type {(n: Nominal<'MemKey', _MemKeyHash, string>) => string} */
|
|
24
26
|
export declare const asBase: (n: Nominal<'MemKey', _MemKeyHash, string>) => string;
|
|
25
27
|
/** @type {(b: string) => Nominal<'MemKey', _MemKeyHash, string>} */
|
|
@@ -29,4 +31,5 @@ export declare const create: <T>(value: T) => Effect<MemCreate, Key<T>>;
|
|
|
29
31
|
/** Reads the current contents of a typed memory slot. */
|
|
30
32
|
export declare const read: <T>(key: Key<T>) => Effect<MemRead, T>;
|
|
31
33
|
/** Replaces the current contents of a typed memory slot. */
|
|
34
|
+
/** @type {<T>(key: Key<T>, value: T) => Effect<MemWrite, void>} */
|
|
32
35
|
export declare const write: <T>(key: Key<T>, value: T) => Effect<MemWrite, void>;
|
|
@@ -7,20 +7,21 @@
|
|
|
7
7
|
* generation strategy.
|
|
8
8
|
*
|
|
9
9
|
* Memory effects compose with other effects by unioning operation types, for
|
|
10
|
-
* example `Effect<IoOp | MemOp, T>` for a program that performs both I/O and
|
|
10
|
+
* example `Effect<IoOp | MemOp, T, E>` for a program that performs both I/O and
|
|
11
11
|
* memory operations.
|
|
12
12
|
*
|
|
13
13
|
* See `./types.ts` for the `Key`/`MemCreate`/`MemRead`/`MemWrite`/`MemOp`
|
|
14
14
|
* type-level API.
|
|
15
15
|
*
|
|
16
16
|
* @module
|
|
17
|
+
*
|
|
18
|
+
* @import { Nominal } from '../../types/nominal/types.ts'
|
|
19
|
+
* @import { Effect } from '../types.ts'
|
|
20
|
+
* @import { Key, MemCreate, MemRead, MemWrite, _MemKeyHash } from './types.ts'
|
|
17
21
|
*/
|
|
18
22
|
|
|
19
23
|
import { asBase as nominalAsBase, asNominal as nominalAsNominal } from '../../types/nominal/module.f.mjs'
|
|
20
|
-
/** @import { Nominal } from '../../types/nominal/types.ts' */
|
|
21
24
|
import { do_ } from '../module.f.mjs'
|
|
22
|
-
/** @import { Effect } from '../types.ts' */
|
|
23
|
-
/** @import { Key, MemCreate, MemRead, MemWrite, _MemKeyHash } from './types.ts' */
|
|
24
25
|
|
|
25
26
|
/** @type {(n: Nominal<'MemKey', _MemKeyHash, string>) => string} */
|
|
26
27
|
export const asBase = nominalAsBase
|
|
@@ -39,6 +40,5 @@ export const read =
|
|
|
39
40
|
(do_('memRead'))
|
|
40
41
|
|
|
41
42
|
/** Replaces the current contents of a typed memory slot. */
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
(do_('memWrite'))
|
|
43
|
+
/** @type {<T>(key: Key<T>, value: T) => Effect<MemWrite, void>} */
|
|
44
|
+
export const write = do_('memWrite')
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { MemOperationMap } from '../mock/types.ts'
|
|
3
|
+
* @import { Key, MemOp } from './types.ts'
|
|
4
|
+
*/
|
|
5
|
+
|
|
1
6
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
7
|
+
import { ok } from '../../types/result/module.f.mjs'
|
|
2
8
|
import { run } from '../mock/module.f.mjs'
|
|
3
|
-
|
|
4
|
-
import { pure, step } from '../module.f.mjs'
|
|
9
|
+
import { pureOk, step } from '../module.f.mjs'
|
|
5
10
|
import {
|
|
6
11
|
asBase, asNominal,
|
|
7
12
|
create, read, write,
|
|
8
13
|
} from './module.f.mjs'
|
|
9
|
-
/** @import { Key, MemOp } from './types.ts' */
|
|
10
14
|
|
|
11
15
|
/**
|
|
12
16
|
* @typedef {{
|
|
@@ -27,20 +31,22 @@ const mock = {
|
|
|
27
31
|
return [{
|
|
28
32
|
next: state.next + 1,
|
|
29
33
|
values: { ...state.values, [id]: value },
|
|
30
|
-
}, key]
|
|
34
|
+
}, ok(key)]
|
|
31
35
|
},
|
|
32
36
|
memRead: key => state =>
|
|
33
|
-
[state, state.values[asBase(key)]],
|
|
37
|
+
[state, ok(state.values[asBase(key)])],
|
|
34
38
|
memWrite: (key, value) => state => {
|
|
35
39
|
const id = asBase(key)
|
|
36
40
|
assert(id in state.values, id)
|
|
37
41
|
return [{
|
|
38
42
|
...state,
|
|
39
43
|
values: { ...state.values, [id]: value },
|
|
40
|
-
}, undefined]
|
|
44
|
+
}, ok(undefined)]
|
|
41
45
|
},
|
|
42
46
|
}
|
|
43
47
|
|
|
48
|
+
// `step`: each link runs only because the previous one returned `ok`,
|
|
49
|
+
// and a runner that omitted a handler would propagate rather than be ignored.
|
|
44
50
|
const program = step(
|
|
45
51
|
create(1),
|
|
46
52
|
key => {
|
|
@@ -55,7 +61,8 @@ const program = step(
|
|
|
55
61
|
export const proof = {
|
|
56
62
|
roundTrip: () => {
|
|
57
63
|
const [state, result] = run(mock)(initial)(program)
|
|
58
|
-
|
|
64
|
+
assert(result[0] === 'ok', result)
|
|
65
|
+
assertEq(result[1], 42)
|
|
59
66
|
assertEq(state.values.k0, 42, state)
|
|
60
67
|
},
|
|
61
68
|
allocatesFreshKeys: () => {
|
|
@@ -63,8 +70,10 @@ export const proof = {
|
|
|
63
70
|
create('a'),
|
|
64
71
|
a => step(
|
|
65
72
|
create('b'),
|
|
66
|
-
b =>
|
|
67
|
-
const [state,
|
|
73
|
+
b => pureOk(/** @type {const} */ ([asBase(a), asBase(b)]))))
|
|
74
|
+
const [state, result] = run(mock)(initial)(effect)
|
|
75
|
+
assert(result[0] === 'ok', result)
|
|
76
|
+
const [a, b] = result[1]
|
|
68
77
|
assertEq(a, 'k0')
|
|
69
78
|
assertEq(b, 'k1')
|
|
70
79
|
assertEq(state.values.k0, 'a', state)
|
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Phantom } from '../../types/phantom/types.ts';
|
|
7
7
|
import type { Nominal } from '../../types/nominal/types.ts';
|
|
8
|
+
import type { OpResult } from '../node/types.ts';
|
|
8
9
|
/** Nominal brand version for memory keys. */
|
|
9
10
|
export type _MemKeyHash = '3f114fa6036a8da026b827f0c3e6d901f5e81ad9a320e431ccce31451892d286';
|
|
10
11
|
/** Opaque handle for a value stored by the memory interpreter. */
|
|
11
12
|
export type Key<T> = Phantom<Nominal<'MemKey', _MemKeyHash, string>, T>;
|
|
12
13
|
/** Allocates a fresh memory slot and initializes it with `value`. */
|
|
13
|
-
export type MemCreate = readonly ['memCreate', <T>(value: T) => Key<T
|
|
14
|
+
export type MemCreate = readonly ['memCreate', <T>(value: T) => OpResult<Key<T>>];
|
|
14
15
|
/** Reads the current value stored at `key`. */
|
|
15
|
-
export type MemRead = readonly ['memRead', <T>(key: Key<T>) => T];
|
|
16
|
+
export type MemRead = readonly ['memRead', <T>(key: Key<T>) => OpResult<T>];
|
|
16
17
|
/** Replaces the current value stored at `key`. */
|
|
17
|
-
export type MemWrite = readonly ['memWrite', <T>(key: Key<T>, value: T) => void];
|
|
18
|
+
export type MemWrite = readonly ['memWrite', <T>(key: Key<T>, value: T) => OpResult<void>];
|
|
18
19
|
export type MemOp = MemCreate | MemRead | MemWrite;
|
|
@@ -1,6 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Mock effect runtimes for testing effectful programs.
|
|
3
|
+
*
|
|
4
|
+
* See `./types.ts` for the `MemOperationMap`/`RunInstance` type-level API.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*
|
|
8
|
+
* @import { Commands, Effect, MatchResult, Operation } from '../types.ts'
|
|
9
|
+
* @import { MemOperationMap, PartialMemOperationMap, RunInstance } from './types.ts'
|
|
10
|
+
*/
|
|
11
|
+
import type { Commands, Operation } from '../types.ts';
|
|
12
|
+
import type { MemOperationMap, PartialMemOperationMap, RunInstance } from './types.ts';
|
|
5
13
|
/** @type {<O extends Operation, S>(o: MemOperationMap<O, S>) => RunInstance<O, S>} */
|
|
6
14
|
export declare const run: <O extends Operation, S>(o: MemOperationMap<O, S>) => RunInstance<O, S>;
|
|
15
|
+
/**
|
|
16
|
+
* {@link run} for a runner that implements only part of `O`.
|
|
17
|
+
*
|
|
18
|
+
* A command in `commands` with no handler answers `error(notImplemented)`
|
|
19
|
+
* through the ordinary continuation, so a program that asks for something this
|
|
20
|
+
* runner lacks gets its control back and decides what to do. A command outside
|
|
21
|
+
* `commands` still panics — see `partialMatch`.
|
|
22
|
+
*
|
|
23
|
+
* **The injector lives here rather than at the call site.** `partialMatch`
|
|
24
|
+
* cannot build one because the shape of an answer is the runner's, not the
|
|
25
|
+
* operation's; this loop's is `(state) => [state, …]`, and writing it once here
|
|
26
|
+
* is the whole reason each runner supplies its own.
|
|
27
|
+
*
|
|
28
|
+
* @type {<O extends Operation, S>(commands: Commands<O>) => (o: PartialMemOperationMap<O, S>) => RunInstance<O, S>}
|
|
29
|
+
*/
|
|
30
|
+
export declare const partialRun: <O extends Operation, S>(commands: Commands<O>) => (o: PartialMemOperationMap<O, S>) => RunInstance<O, S>;
|