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,21 +5,25 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
*
|
|
8
|
-
* ```
|
|
9
|
-
* import { error, ok,
|
|
8
|
+
* ```js
|
|
9
|
+
* import { error, ok, okThen, unwrap } from './module.f.mjs'
|
|
10
10
|
*
|
|
11
|
-
* const success
|
|
12
|
-
* const failure
|
|
11
|
+
* const success = ok(42)
|
|
12
|
+
* const failure = error('Something went wrong')
|
|
13
13
|
*
|
|
14
14
|
* if (unwrap(success) !== 42) { throw 'error' }
|
|
15
15
|
* const [kind, v] = failure
|
|
16
16
|
* if (kind !== 'error') { throw 'error' }
|
|
17
|
-
* // `v` is
|
|
18
|
-
*
|
|
17
|
+
* // `v` is `'Something went wrong'` here
|
|
18
|
+
*
|
|
19
|
+
* // `okThen` chains; an `error` skips the rest of the chain unchanged.
|
|
20
|
+
* const half = n => n % 2 === 0 ? ok(n / 2) : error('odd')
|
|
21
|
+
* if (unwrap(okThen(half)(success)) !== 21) { throw 'error' }
|
|
19
22
|
* ```
|
|
23
|
+
*
|
|
24
|
+
* @import { Ok, Error, Result } from './types.ts'
|
|
20
25
|
*/
|
|
21
26
|
import type { Ok, Error, Result } from './types.ts';
|
|
22
|
-
/** @import { Ok, Error, Result } from './types.ts' */
|
|
23
27
|
/**
|
|
24
28
|
* Creates a successful result.
|
|
25
29
|
*
|
|
@@ -57,3 +61,29 @@ export declare const invert: <T, E>([k, v]: Result<T, E>) => Result<E, T>;
|
|
|
57
61
|
* @type {<T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>}
|
|
58
62
|
*/
|
|
59
63
|
export declare const mapOk: <T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>;
|
|
64
|
+
/**
|
|
65
|
+
* Chains a `Result`-returning step onto a `Result`, passing an `error` through
|
|
66
|
+
* unchanged. The monadic bind to {@link mapOk}'s functor map, and the pure
|
|
67
|
+
* sibling of the branch `fjs/effects`'s `step` writes for an effect that
|
|
68
|
+
* also performs operations.
|
|
69
|
+
*
|
|
70
|
+
* The two error types are **unioned, not unified**. A validation chain
|
|
71
|
+
* typically widens its error as it goes — a JSON parse failure (`string`)
|
|
72
|
+
* followed by an rtti schema failure (`ValidationError`) — and the hand-written
|
|
73
|
+
* form expressed that by rebuilding the incoming error with `error(v)` purely
|
|
74
|
+
* to retag it into the wider type. `E | F` states the widening in the type
|
|
75
|
+
* instead, so neither side has to be pre-widened and the passed-through
|
|
76
|
+
* `error` stays the very tuple it arrived as.
|
|
77
|
+
*
|
|
78
|
+
* `F` binds on the second arrow, as in {@link mapOk}: `f` alone determines the
|
|
79
|
+
* value types, so one `okThen(f)` applies to results carrying any error type.
|
|
80
|
+
*
|
|
81
|
+
* Reach for it when the step needs **only** the value it is handed. A chain
|
|
82
|
+
* whose later steps also read an earlier one's value would have to nest a
|
|
83
|
+
* closure per link to keep those values in scope, which `fjs/AGENTS.md` §3.4 rules
|
|
84
|
+
* out for the same reason it rules out nested `step`; write those as a flat
|
|
85
|
+
* sequence of guards.
|
|
86
|
+
*
|
|
87
|
+
* @type {<T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>}
|
|
88
|
+
*/
|
|
89
|
+
export declare const okThen: <T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>;
|
|
@@ -5,22 +5,25 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
7
|
*
|
|
8
|
-
* ```
|
|
9
|
-
* import { error, ok,
|
|
8
|
+
* ```js
|
|
9
|
+
* import { error, ok, okThen, unwrap } from './module.f.mjs'
|
|
10
10
|
*
|
|
11
|
-
* const success
|
|
12
|
-
* const failure
|
|
11
|
+
* const success = ok(42)
|
|
12
|
+
* const failure = error('Something went wrong')
|
|
13
13
|
*
|
|
14
14
|
* if (unwrap(success) !== 42) { throw 'error' }
|
|
15
15
|
* const [kind, v] = failure
|
|
16
16
|
* if (kind !== 'error') { throw 'error' }
|
|
17
|
-
* // `v` is
|
|
18
|
-
*
|
|
17
|
+
* // `v` is `'Something went wrong'` here
|
|
18
|
+
*
|
|
19
|
+
* // `okThen` chains; an `error` skips the rest of the chain unchanged.
|
|
20
|
+
* const half = n => n % 2 === 0 ? ok(n / 2) : error('odd')
|
|
21
|
+
* if (unwrap(okThen(half)(success)) !== 21) { throw 'error' }
|
|
19
22
|
* ```
|
|
23
|
+
*
|
|
24
|
+
* @import { Ok, Error, Result } from './types.ts'
|
|
20
25
|
*/
|
|
21
26
|
|
|
22
|
-
/** @import { Ok, Error, Result } from './types.ts' */
|
|
23
|
-
|
|
24
27
|
/**
|
|
25
28
|
* Creates a successful result.
|
|
26
29
|
*
|
|
@@ -65,3 +68,30 @@ export const invert = ([k, v]) => k === 'ok' ? error(v) : ok(v)
|
|
|
65
68
|
* @type {<T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>}
|
|
66
69
|
*/
|
|
67
70
|
export const mapOk = f => r => r[0] === 'ok' ? ok(f(r[1])) : r
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Chains a `Result`-returning step onto a `Result`, passing an `error` through
|
|
74
|
+
* unchanged. The monadic bind to {@link mapOk}'s functor map, and the pure
|
|
75
|
+
* sibling of the branch `fjs/effects`'s `step` writes for an effect that
|
|
76
|
+
* also performs operations.
|
|
77
|
+
*
|
|
78
|
+
* The two error types are **unioned, not unified**. A validation chain
|
|
79
|
+
* typically widens its error as it goes — a JSON parse failure (`string`)
|
|
80
|
+
* followed by an rtti schema failure (`ValidationError`) — and the hand-written
|
|
81
|
+
* form expressed that by rebuilding the incoming error with `error(v)` purely
|
|
82
|
+
* to retag it into the wider type. `E | F` states the widening in the type
|
|
83
|
+
* instead, so neither side has to be pre-widened and the passed-through
|
|
84
|
+
* `error` stays the very tuple it arrived as.
|
|
85
|
+
*
|
|
86
|
+
* `F` binds on the second arrow, as in {@link mapOk}: `f` alone determines the
|
|
87
|
+
* value types, so one `okThen(f)` applies to results carrying any error type.
|
|
88
|
+
*
|
|
89
|
+
* Reach for it when the step needs **only** the value it is handed. A chain
|
|
90
|
+
* whose later steps also read an earlier one's value would have to nest a
|
|
91
|
+
* closure per link to keep those values in scope, which `fjs/AGENTS.md` §3.4 rules
|
|
92
|
+
* out for the same reason it rules out nested `step`; write those as a flat
|
|
93
|
+
* sequence of guards.
|
|
94
|
+
*
|
|
95
|
+
* @type {<T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>}
|
|
96
|
+
*/
|
|
97
|
+
export const okThen = f => r => r[0] === 'error' ? r : f(r[1])
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Impure `Result` companions: capture thrown exceptions as `Result` values,
|
|
3
|
+
* since `try`/`catch` is not allowed in FunctionalScript itself.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*
|
|
7
|
+
* @import { Result } from './types.ts'
|
|
8
|
+
*/
|
|
9
|
+
|
|
2
10
|
import { ok, error } from './module.f.mjs'
|
|
3
11
|
|
|
4
12
|
/** @type {<T>(f: () => T) => Result<T, unknown>} */
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Result } from './types.ts'
|
|
3
|
+
*/
|
|
1
4
|
declare const example: () => void;
|
|
2
5
|
declare const invertTest: () => void;
|
|
3
6
|
declare const mapOkTest: () => void;
|
|
7
|
+
declare const okThenTest: () => void;
|
|
4
8
|
export declare const proof: {
|
|
5
9
|
example: typeof example;
|
|
6
10
|
invertTest: typeof invertTest;
|
|
7
11
|
mapOkTest: typeof mapOkTest;
|
|
12
|
+
okThenTest: typeof okThenTest;
|
|
8
13
|
throw: {
|
|
9
14
|
unwrapError: () => string;
|
|
10
15
|
};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { Result } from './types.ts'
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { error, ok, unwrap, invert, mapOk, okThen } from './module.f.mjs'
|
|
3
6
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
4
7
|
|
|
5
8
|
const example = () => {
|
|
@@ -31,10 +34,27 @@ const mapOkTest = () => {
|
|
|
31
34
|
assert(!(k1 !== 'error' || v1 !== 'oops'), [k1, v1])
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
const okThenTest = () => {
|
|
38
|
+
/** @type {(n: number) => Result<string, string>} */
|
|
39
|
+
const half = n => n % 2 === 0 ? ok(`${n / 2}`) : error('odd')
|
|
40
|
+
const [k0, v0] = okThen(half)(ok(42))
|
|
41
|
+
assert(!(k0 !== 'ok' || v0 !== '21'), [k0, v0])
|
|
42
|
+
// `f` itself failing: the chain reports `f`'s own error.
|
|
43
|
+
const [k1, v1] = okThen(half)(ok(41))
|
|
44
|
+
assert(!(k1 !== 'error' || v1 !== 'odd'), [k1, v1])
|
|
45
|
+
// An incoming `error` skips `f` and passes through unchanged, keeping its
|
|
46
|
+
// own error type: the result is `Result<string, string | number>`.
|
|
47
|
+
/** @type {Result<number, number>} */
|
|
48
|
+
const incoming = error(7)
|
|
49
|
+
const [k2, v2] = okThen(half)(incoming)
|
|
50
|
+
assert(!(k2 !== 'error' || v2 !== 7), [k2, v2])
|
|
51
|
+
}
|
|
52
|
+
|
|
34
53
|
export const proof = {
|
|
35
54
|
example,
|
|
36
55
|
invertTest,
|
|
37
56
|
mapOkTest,
|
|
57
|
+
okThenTest,
|
|
38
58
|
throw: {
|
|
39
59
|
unwrapError: () => unwrap(error('oops')),
|
|
40
60
|
},
|
|
@@ -1,10 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared kernel for RTTI consumers.
|
|
3
|
+
*
|
|
4
|
+
* `parse` (`../parse/module.f.mjs`) is the schema-form consumer; the data form
|
|
5
|
+
* (`../data/module.f.mjs`) is the other, walking a `Data` instead of a thunk
|
|
6
|
+
* graph. They produce the same `Result<T, ValidationError>` outcome and differ
|
|
7
|
+
* in how they dispatch, so this module hosts the parts that do not differ:
|
|
8
|
+
*
|
|
9
|
+
* - The error shape (`ValidationError`, `Path`) and path bookkeeping
|
|
10
|
+
* (`verror`, `prependPath`).
|
|
11
|
+
* - Primitive checks (`primitive0Validate`, `constPrimitiveValidate`).
|
|
12
|
+
* - The `Validate<T>`/`Result<T>` signatures, which `parse` reuses
|
|
13
|
+
* (`Parse<T> = Validate<T>`).
|
|
14
|
+
* - `visit`: a visitor over the `Type` ADT. Callers supply a `Visitor<R>`
|
|
15
|
+
* with one handler per variant; `visit(v)(rtti)` recognizes `rtti` and
|
|
16
|
+
* calls the matching handler. `parse` composes its top-level function from
|
|
17
|
+
* a visitor.
|
|
18
|
+
* - `eachEntry`: the container entry loop (array/record/tuple/struct). Callers
|
|
19
|
+
* choose what (if anything) to accumulate, so a caller that only needs
|
|
20
|
+
* pass/fail pays no allocation per entry.
|
|
21
|
+
* - `orVisit`: the shared `or` handler — try each variant's recursive walker,
|
|
22
|
+
* return the first match.
|
|
23
|
+
*
|
|
24
|
+
* Keeping the kernel here gives schema-driven consumers a stable shared base
|
|
25
|
+
* that does not depend on any one of them.
|
|
26
|
+
*
|
|
27
|
+
* @module
|
|
28
|
+
*
|
|
29
|
+
* @import { Primitive, Unknown } from '../ts/types.ts'
|
|
30
|
+
* @import { Const, Info0, Primitive0, Tag1, Tuple, Type } from '../types.ts'
|
|
31
|
+
* @import { Error, Result as CommonResult } from '../../result/types.ts'
|
|
32
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
33
|
+
* @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts'
|
|
34
|
+
*/
|
|
1
35
|
import type { Primitive, Unknown } from '../ts/types.ts';
|
|
2
36
|
import type { Info0, Primitive0, Type } from '../types.ts';
|
|
3
37
|
import type { Error, Result as CommonResult } from '../../result/types.ts';
|
|
4
38
|
import type { StringMap } from '../../object/types.ts';
|
|
5
39
|
import type { Validate, Visitor, IsContainer, ResultE, ValidateE, ValidationError } from './types.ts';
|
|
6
|
-
/** @import { StringMap } from '../../object/types.ts' */
|
|
7
|
-
/** @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts' */
|
|
8
40
|
/** Builds an error result with empty path and the given message. */
|
|
9
41
|
/** @type {(message: string) => Error<ValidationError>} */
|
|
10
42
|
export declare const verror: (message: string) => Error<ValidationError>;
|
|
@@ -34,10 +66,10 @@ export declare const constPrimitiveValidate: <T extends Primitive>(
|
|
|
34
66
|
* @returns {Validate<T>}
|
|
35
67
|
*/
|
|
36
68
|
rtti: T) => Validate<T>;
|
|
37
|
-
/** `IsContainer` guard for arrays
|
|
69
|
+
/** `IsContainer` guard for arrays. */
|
|
38
70
|
/** @type {IsContainer<ReadonlyArray<Unknown>>} */
|
|
39
71
|
export declare const isArray: IsContainer<ReadonlyArray<Unknown>>;
|
|
40
|
-
/** `IsContainer` guard for records/structs
|
|
72
|
+
/** `IsContainer` guard for records/structs. */
|
|
41
73
|
/** @type {IsContainer<StringMap<Unknown>>} */
|
|
42
74
|
export declare const isObject: IsContainer<StringMap<Unknown>>;
|
|
43
75
|
/**
|
|
@@ -46,21 +78,19 @@ export declare const isObject: IsContainer<StringMap<Unknown>>;
|
|
|
46
78
|
* result into `acc` (starting from `init`) with `accumulate` and returns the
|
|
47
79
|
* final accumulator.
|
|
48
80
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* "did every entry succeed?"
|
|
53
|
-
* pays no allocation per entry
|
|
54
|
-
* pairs, so it folds them into a `List` (see its call site) and converts to
|
|
55
|
-
* an array once at the end.
|
|
81
|
+
* Used by `parse`'s container builders (array/record/tuple/struct), which
|
|
82
|
+
* need the rebuilt `[key, value]` pairs, so they fold them into a `List` (see
|
|
83
|
+
* the call site) and convert to an array once at the end. A caller whose
|
|
84
|
+
* whole question is "did every entry succeed?" passes `undefined`/`acc => acc`
|
|
85
|
+
* instead and pays no allocation per entry.
|
|
56
86
|
*/
|
|
57
87
|
export declare const eachEntry: <V, R, A>(entries: ReadonlyArray<readonly [string, V]>, item: (k: string, v: V) => CommonResult<R, ValidationError>, init: A, accumulate: (acc: A, k: string, value: R) => A) => CommonResult<A, ValidationError>;
|
|
58
88
|
/**
|
|
59
89
|
* First variant in `variants` that `recurse` accepts, else `verror('no match')`.
|
|
60
90
|
*
|
|
61
|
-
* Shared `or` handler
|
|
62
|
-
*
|
|
63
|
-
*
|
|
91
|
+
* Shared `or` handler: try each variant against the value and return the
|
|
92
|
+
* first `'ok'` verbatim, parameterized by the recursive function that walks
|
|
93
|
+
* each variant. `recurse`
|
|
64
94
|
* is typed over the erased `ValidateE` alias — annotating it as `(t: Type) =>
|
|
65
95
|
* Validate<Type>` would itself instantiate `Validate<Type>` and hit TS2589 —
|
|
66
96
|
* so each caller passes its recursive function through one boundary cast.
|
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared kernel for RTTI consumers
|
|
2
|
+
* Shared kernel for RTTI consumers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* This module hosts the parts that do not differ:
|
|
4
|
+
* `parse` (`../parse/module.f.mjs`) is the schema-form consumer; the data form
|
|
5
|
+
* (`../data/module.f.mjs`) is the other, walking a `Data` instead of a thunk
|
|
6
|
+
* graph. They produce the same `Result<T, ValidationError>` outcome and differ
|
|
7
|
+
* in how they dispatch, so this module hosts the parts that do not differ:
|
|
9
8
|
*
|
|
10
9
|
* - The error shape (`ValidationError`, `Path`) and path bookkeeping
|
|
11
10
|
* (`verror`, `prependPath`).
|
|
12
11
|
* - Primitive checks (`primitive0Validate`, `constPrimitiveValidate`).
|
|
13
|
-
* - The `Validate<T>`/`Result<T>` signatures
|
|
12
|
+
* - The `Validate<T>`/`Result<T>` signatures, which `parse` reuses
|
|
13
|
+
* (`Parse<T> = Validate<T>`).
|
|
14
14
|
* - `visit`: a visitor over the `Type` ADT. Callers supply a `Visitor<R>`
|
|
15
15
|
* with one handler per variant; `visit(v)(rtti)` recognizes `rtti` and
|
|
16
|
-
* calls the matching handler.
|
|
17
|
-
*
|
|
18
|
-
* - `eachEntry`: the container entry loop (array/record/tuple/struct)
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* calls the matching handler. `parse` composes its top-level function from
|
|
17
|
+
* a visitor.
|
|
18
|
+
* - `eachEntry`: the container entry loop (array/record/tuple/struct). Callers
|
|
19
|
+
* choose what (if anything) to accumulate, so a caller that only needs
|
|
20
|
+
* pass/fail pays no allocation per entry.
|
|
21
21
|
* - `orVisit`: the shared `or` handler — try each variant's recursive walker,
|
|
22
22
|
* return the first match.
|
|
23
23
|
*
|
|
24
|
-
* Keeping the kernel here
|
|
25
|
-
*
|
|
26
|
-
* sketched in [i143](../../../../issues/README.md)) a stable shared base.
|
|
24
|
+
* Keeping the kernel here gives schema-driven consumers a stable shared base
|
|
25
|
+
* that does not depend on any one of them.
|
|
27
26
|
*
|
|
28
27
|
* @module
|
|
28
|
+
*
|
|
29
|
+
* @import { Primitive, Unknown } from '../ts/types.ts'
|
|
30
|
+
* @import { Const, Info0, Primitive0, Tag1, Tuple, Type } from '../types.ts'
|
|
31
|
+
* @import { Error, Result as CommonResult } from '../../result/types.ts'
|
|
32
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
33
|
+
* @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts'
|
|
29
34
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/** @import { Error, Result as CommonResult } from '../../result/types.ts' */
|
|
35
|
+
|
|
36
|
+
import { assert } from '../../../asserts/module.f.mjs'
|
|
33
37
|
import { error, ok } from '../../result/module.f.mjs'
|
|
34
38
|
import { isArray as commonIsArray } from '../../array/module.f.mjs'
|
|
35
39
|
import { isObject as commonIsObject } from '../../object/module.f.mjs'
|
|
36
|
-
/** @import { StringMap } from '../../object/types.ts' */
|
|
37
|
-
/** @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts' */
|
|
38
40
|
|
|
39
41
|
/** Builds an error result with empty path and the given message. */
|
|
40
42
|
/** @type {(message: string) => Error<ValidationError>} */
|
|
@@ -78,15 +80,15 @@ export const constPrimitiveValidate =
|
|
|
78
80
|
/** @type {<R>(v: Visitor<R>) => (c: Const) => R} */
|
|
79
81
|
const visitConst = v => c =>
|
|
80
82
|
typeof c === 'object' && c !== null
|
|
81
|
-
? (commonIsArray(c) ? v.tuple(c) : v.struct(
|
|
82
|
-
: v.constPrimitive(
|
|
83
|
+
? (commonIsArray(c) ? v.tuple(c) : v.struct(c))
|
|
84
|
+
: v.constPrimitive(c)
|
|
83
85
|
|
|
84
|
-
/** `IsContainer` guard for arrays
|
|
86
|
+
/** `IsContainer` guard for arrays. */
|
|
85
87
|
/** @type {IsContainer<ReadonlyArray<Unknown>>} */
|
|
86
88
|
export const isArray =
|
|
87
89
|
value => commonIsArray(value)
|
|
88
90
|
|
|
89
|
-
/** `IsContainer` guard for records/structs
|
|
91
|
+
/** `IsContainer` guard for records/structs. */
|
|
90
92
|
/** @type {IsContainer<StringMap<Unknown>>} */
|
|
91
93
|
export const isObject =
|
|
92
94
|
value => commonIsObject(value)
|
|
@@ -97,13 +99,11 @@ export const isObject =
|
|
|
97
99
|
* result into `acc` (starting from `init`) with `accumulate` and returns the
|
|
98
100
|
* final accumulator.
|
|
99
101
|
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* "did every entry succeed?"
|
|
104
|
-
* pays no allocation per entry
|
|
105
|
-
* pairs, so it folds them into a `List` (see its call site) and converts to
|
|
106
|
-
* an array once at the end.
|
|
102
|
+
* Used by `parse`'s container builders (array/record/tuple/struct), which
|
|
103
|
+
* need the rebuilt `[key, value]` pairs, so they fold them into a `List` (see
|
|
104
|
+
* the call site) and convert to an array once at the end. A caller whose
|
|
105
|
+
* whole question is "did every entry succeed?" passes `undefined`/`acc => acc`
|
|
106
|
+
* instead and pays no allocation per entry.
|
|
107
107
|
*/
|
|
108
108
|
export const eachEntry =
|
|
109
109
|
/**
|
|
@@ -131,9 +131,9 @@ export const eachEntry =
|
|
|
131
131
|
/**
|
|
132
132
|
* First variant in `variants` that `recurse` accepts, else `verror('no match')`.
|
|
133
133
|
*
|
|
134
|
-
* Shared `or` handler
|
|
135
|
-
*
|
|
136
|
-
*
|
|
134
|
+
* Shared `or` handler: try each variant against the value and return the
|
|
135
|
+
* first `'ok'` verbatim, parameterized by the recursive function that walks
|
|
136
|
+
* each variant. `recurse`
|
|
137
137
|
* is typed over the erased `ValidateE` alias — annotating it as `(t: Type) =>
|
|
138
138
|
* Validate<Type>` would itself instantiate `Validate<Type>` and hit TS2589 —
|
|
139
139
|
* so each caller passes its recursive function through one boundary cast.
|
|
@@ -171,13 +171,19 @@ export const visit =
|
|
|
171
171
|
if (typeof rtti === 'function') {
|
|
172
172
|
const [tag, ...value] = rtti()
|
|
173
173
|
switch (tag) {
|
|
174
|
-
case 'const':
|
|
174
|
+
case 'const': {
|
|
175
|
+
const [c] = value
|
|
176
|
+
// `Type` is `Const | Thunk`, and a `Thunk` is a function, so
|
|
177
|
+
// this is exactly the check that defines `Const`.
|
|
178
|
+
assert(typeof c !== 'function', c)
|
|
179
|
+
return visitConst(v)(c)
|
|
180
|
+
}
|
|
175
181
|
case 'array': return v.array(value[0])
|
|
176
182
|
case 'record': return v.record(value[0])
|
|
177
183
|
case 'unknown': return v.unknown()
|
|
178
184
|
case 'or': return v.or(value)
|
|
179
185
|
}
|
|
180
|
-
return v.primitive0(
|
|
186
|
+
return v.primitive0(tag)
|
|
181
187
|
}
|
|
182
188
|
return visitConst(v)(rtti)
|
|
183
189
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @import { Result } from '../../result/types.ts'
|
|
3
|
+
* @import { ValidationError } from './types.ts'
|
|
4
|
+
*/
|
|
5
|
+
|
|
1
6
|
import { eachEntry } from './module.f.mjs'
|
|
2
|
-
/** @import { Result } from '../../result/types.ts' */
|
|
3
7
|
import { error, ok } from '../../result/module.f.mjs'
|
|
4
|
-
/** @import { ValidationError } from './types.ts' */
|
|
5
8
|
import { assert, assertEq } from '../../../asserts/module.f.mjs'
|
|
6
9
|
|
|
7
10
|
/** @typedef {ReadonlyArray<readonly [string, number]>} _Entries */
|
|
@@ -16,12 +19,12 @@ const collect = (acc, k, v) => [...acc, [k, v]]
|
|
|
16
19
|
|
|
17
20
|
export const proof = {
|
|
18
21
|
empty: () => {
|
|
19
|
-
const r = eachEntry(
|
|
22
|
+
const r = eachEntry([], item, [], collect)
|
|
20
23
|
assert(r[0] === 'ok')
|
|
21
24
|
assertEq(r[1].length, 0)
|
|
22
25
|
},
|
|
23
26
|
allOk: () => {
|
|
24
|
-
const r = eachEntry([['a', 1], ['b', 2]], item,
|
|
27
|
+
const r = eachEntry([['a', 1], ['b', 2]], item, [], collect)
|
|
25
28
|
assert(r[0] === 'ok')
|
|
26
29
|
assertEq(r[1].length, 2)
|
|
27
30
|
assertEq(r[1][0][0], 'a')
|
|
@@ -36,7 +39,7 @@ export const proof = {
|
|
|
36
39
|
assertEq(r[1], undefined)
|
|
37
40
|
},
|
|
38
41
|
firstErrorWins: () => {
|
|
39
|
-
const r = eachEntry([['a', -1], ['b', -2]], item,
|
|
42
|
+
const r = eachEntry([['a', -1], ['b', -2]], item, [], collect)
|
|
40
43
|
assert(r[0] === 'error')
|
|
41
44
|
assertEq(r[1].message, 'negative at a')
|
|
42
45
|
},
|
|
@@ -47,7 +50,7 @@ export const proof = {
|
|
|
47
50
|
calls++
|
|
48
51
|
return item(k, v)
|
|
49
52
|
}
|
|
50
|
-
const r = eachEntry([['a', -1], ['b', -2], ['c', -3]], counting,
|
|
53
|
+
const r = eachEntry([['a', -1], ['b', -2], ['c', -3]], counting, [], collect)
|
|
51
54
|
assert(r[0] === 'error')
|
|
52
55
|
assertEq(calls, 1)
|
|
53
56
|
},
|
|
@@ -55,7 +58,7 @@ export const proof = {
|
|
|
55
58
|
/** @type {(k: string, v: number) => Result<number, ValidationError>} */
|
|
56
59
|
const nested = (k, v) =>
|
|
57
60
|
v < 0 ? error({ path: ['inner'], message: 'bad' }) : ok(v)
|
|
58
|
-
const r = eachEntry([['outer', -1]], nested,
|
|
61
|
+
const r = eachEntry([['outer', -1]], nested, [], collect)
|
|
59
62
|
assert(r[0] === 'error')
|
|
60
63
|
assertEq(r[1].path.length, 2)
|
|
61
64
|
assertEq(r[1].path[0], 'outer')
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The serializable RTTI data form and the {@link toData} conversion from the
|
|
3
|
+
* thunk form.
|
|
4
|
+
*
|
|
5
|
+
* A schema denotes a set of values. The data form partitions that set into
|
|
6
|
+
* six disjoint kinds — unit values (`null`, `undefined`, `false`, `true`),
|
|
7
|
+
* numbers, strings, bigints, arrays and objects — so that all schema algebra
|
|
8
|
+
* (union normalization, coverage collapse, {@link equal}, {@link subset},
|
|
9
|
+
* canonical ordering via {@link cmp}) reduces to kind-wise set operations.
|
|
10
|
+
* {@link toData} is the single bridge from the thunk form; {@link validate}
|
|
11
|
+
* is the data-driven counterpart of `../validate`. The form serializes as
|
|
12
|
+
* DJS — plain JSON when no `bigint` literals are involved. See `./README.md`
|
|
13
|
+
* for the design rationale and serialization notes, and `./types.ts` for the
|
|
14
|
+
* type-level API.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*
|
|
18
|
+
* @import { Const, ConstObject, Type } from '../types.ts'
|
|
19
|
+
* @import { Primitive, Unknown } from '../ts/types.ts'
|
|
20
|
+
* @import { ResultE } from '../common/types.ts'
|
|
21
|
+
* @import { StringMap } from '../../object/types.ts'
|
|
22
|
+
* @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from './types.ts'
|
|
23
|
+
*/
|
|
24
|
+
import type { Const, Type } from '../types.ts';
|
|
25
|
+
import type { Primitive, Unknown } from '../ts/types.ts';
|
|
26
|
+
import type { ResultE } from '../common/types.ts';
|
|
27
|
+
import type { StringMap } from '../../object/types.ts';
|
|
28
|
+
import type { Data, Node, RuleSet, UnionSet } from './types.ts';
|
|
29
|
+
/**
|
|
30
|
+
* The unit kind's enumeration: bit `1 << i` of a {@link UnionSet}'s `unit`
|
|
31
|
+
* bitset stands for `unitList[i]`.
|
|
32
|
+
*/
|
|
33
|
+
export declare const unitList: readonly ['null', 'undefined', 'false', 'true'];
|
|
34
|
+
/**
|
|
35
|
+
* The `unit` bit of one unit value.
|
|
36
|
+
*
|
|
37
|
+
* @type {(v: null | undefined | boolean) => number}
|
|
38
|
+
*/
|
|
39
|
+
export declare const unitBit: (v: null | undefined | boolean) => number;
|
|
40
|
+
/**
|
|
41
|
+
* The data form of the empty set — rtti `never`.
|
|
42
|
+
*
|
|
43
|
+
* @type {UnionSet}
|
|
44
|
+
*/
|
|
45
|
+
export declare const never: UnionSet;
|
|
46
|
+
/**
|
|
47
|
+
* The data form of the set of all values — rtti `unknown`.
|
|
48
|
+
*
|
|
49
|
+
* @type {UnionSet}
|
|
50
|
+
*/
|
|
51
|
+
export declare const unknown: UnionSet;
|
|
52
|
+
/**
|
|
53
|
+
* The union with the given unit bits removed — set subtraction restricted to
|
|
54
|
+
* the unit kind. Dropping `undefined` from an optional property's value set is
|
|
55
|
+
* the motivating case.
|
|
56
|
+
*
|
|
57
|
+
* The other five kinds are carried through untouched rather than copied field
|
|
58
|
+
* by field. That is not only shorter: a caller that enumerates `UnionSet`'s
|
|
59
|
+
* members to rebuild the node silently **drops** any kind added to the type
|
|
60
|
+
* later, whereas spreading cannot. Removing every unit bit removes the `unit`
|
|
61
|
+
* key entirely, since an empty kind is an absent property here, never a zero.
|
|
62
|
+
*
|
|
63
|
+
* @type {(bits: number) => (n: UnionSet) => UnionSet}
|
|
64
|
+
*/
|
|
65
|
+
export declare const withoutUnits: (bits: number) => (n: UnionSet) => UnionSet;
|
|
66
|
+
/**
|
|
67
|
+
* Total order over the data form: negative, zero or positive, with zero
|
|
68
|
+
* exactly on structural identity. {@link toData} output is canonical, so two
|
|
69
|
+
* conversions of equivalent thunk schemas compare equal — this is what makes
|
|
70
|
+
* the data form comparable and sortable.
|
|
71
|
+
*
|
|
72
|
+
* @type {(a: Data) => (b: Data) => number}
|
|
73
|
+
*/
|
|
74
|
+
export declare const cmp: (a: Data) => (b: Data) => number;
|
|
75
|
+
/**
|
|
76
|
+
* Structural equality of canonical forms: `equal(toData(a))(toData(b))`
|
|
77
|
+
* holds exactly when `a` and `b` normalize to the same data — e.g.
|
|
78
|
+
* `or(a, b)` and `or(b, a)` are equal. Recursive definitions compare by
|
|
79
|
+
* their rule names, which are derived from the defining functions' names.
|
|
80
|
+
*
|
|
81
|
+
* @type {(a: Data) => (b: Data) => boolean}
|
|
82
|
+
*/
|
|
83
|
+
export declare const equal: (a: Data) => (b: Data) => boolean;
|
|
84
|
+
export type _Ctx = readonly [RuleSet, RuleSet];
|
|
85
|
+
export type _Assumed = StringMap<StringMap<true>>;
|
|
86
|
+
export type _Keyed = readonly [Node, string | undefined];
|
|
87
|
+
/**
|
|
88
|
+
* Sound subset test: `true` means every value of `a` is a value of `b`.
|
|
89
|
+
* Kind-wise on unions, pattern-wise on arrays/objects, coinductive on
|
|
90
|
+
* reference cycles. Incomplete in the known-hard corners of semantic
|
|
91
|
+
* subtyping (see `./README.md`): it may answer `false` for an inclusion
|
|
92
|
+
* that only holds by distributing a union across positions, or one whose
|
|
93
|
+
* left side is a non-syntactic empty set — never `true` for a non-inclusion.
|
|
94
|
+
*
|
|
95
|
+
* @type {(a: Data) => (b: Data) => boolean}
|
|
96
|
+
*/
|
|
97
|
+
export declare const subset: (a: Data) => (b: Data) => boolean;
|
|
98
|
+
export type _NodeMap = (n: Node) => Node;
|
|
99
|
+
export type _Thunk = Exclude<Type, Const>;
|
|
100
|
+
export type _Key = Exclude<Type, Primitive>;
|
|
101
|
+
export type _State = {
|
|
102
|
+
readonly converting: readonly _Thunk[];
|
|
103
|
+
readonly names: readonly (readonly [_Thunk, string])[];
|
|
104
|
+
readonly done: readonly (readonly [_Key, UnionSet])[];
|
|
105
|
+
readonly deferred: readonly (readonly [_Thunk, _Thunk])[];
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Converts a thunk-form schema into its canonical data form.
|
|
109
|
+
*
|
|
110
|
+
* Runs once per consumer need; schemas that are built but never consumed pay
|
|
111
|
+
* nothing. The output is normalized — unions are flattened and merged
|
|
112
|
+
* kind-wise, literals are sorted and deduplicated, subsumed array/object
|
|
113
|
+
* patterns are dropped, rules are pruned to the reachable set and sorted,
|
|
114
|
+
* and a union equal to a rule's body reads back as a reference — so schema
|
|
115
|
+
* identity is a property of this form: `toData(or(a, b))` and
|
|
116
|
+
* `toData(or(b, a))` are structurally identical even though the two thunks
|
|
117
|
+
* are distinct, and `or` is idempotent on recursive schemas.
|
|
118
|
+
*
|
|
119
|
+
* Only recursive definitions become named rules (named after their defining
|
|
120
|
+
* functions), everything else is inlined; a schema with no reference cycles
|
|
121
|
+
* converts to `[{}, unionSet]`.
|
|
122
|
+
*
|
|
123
|
+
* @type {(t: Type) => Data}
|
|
124
|
+
*/
|
|
125
|
+
export declare const toData: (t: Type) => Data;
|
|
126
|
+
/**
|
|
127
|
+
* Data-driven validation — the counterpart of `../validate` that consumes a
|
|
128
|
+
* {@link Data} produced by {@link toData} instead of walking the thunk
|
|
129
|
+
* graph. Returns the original value on success, or the first
|
|
130
|
+
* `{ path, message }` error.
|
|
131
|
+
*
|
|
132
|
+
* @type {(data: Data) => (value: Unknown) => ResultE}
|
|
133
|
+
*/
|
|
134
|
+
export declare const validate: (data: Data) => (value: Unknown) => ResultE;
|