functionalscript 0.36.0 → 0.38.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 +1 -1
- package/{fs → fjs}/asn.1/module.f.js +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/module.f.js +3 -3
- package/{fs → fjs}/base_n/proof.f.js +15 -39
- package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
- package/{fs → fjs/basen}/base128/module.f.js +1 -1
- package/{fs → fjs/basen}/base128/proof.f.js +3 -3
- package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/base64/module.f.js +25 -15
- package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
- package/{fs → fjs/basen}/base64/proof.f.js +26 -6
- package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
- package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +56 -6
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +59 -24
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +59 -28
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +14 -15
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/module.f.js +7 -7
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +37 -74
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/fjs/cas/mcp/module.f.js +267 -0
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
- package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +36 -10
- package/{fs → fjs}/cas/proof.f.d.ts +8 -2
- package/{fs → fjs}/cas/proof.f.js +85 -94
- package/{fs → fjs}/ci/bun/module.f.js +2 -2
- package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
- package/{fs → fjs}/ci/common/module.f.js +4 -4
- package/fjs/ci/config/module.f.d.ts +42 -0
- package/{fs → fjs}/ci/config/module.f.js +6 -8
- package/fjs/ci/deno/module.f.js +20 -0
- package/{fs → fjs}/ci/module.f.js +9 -9
- package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
- package/{fs → fjs}/ci/node/module.f.js +3 -5
- package/{fs → fjs}/ci/playwright/module.f.js +3 -3
- package/{fs → fjs}/ci/proof.f.js +27 -22
- package/{fs → fjs}/ci/rust/module.f.js +11 -3
- package/{fs → fjs}/cli/module.f.js +3 -3
- package/{fs → fjs}/cli/proof.f.js +25 -66
- package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
- package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
- package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
- package/{fs → fjs}/crypto/pow/module.f.js +3 -3
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/module.f.js +2 -2
- package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
- package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
- package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +11 -8
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
- package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
- package/{fs → fjs}/dev/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
- package/{fs → fjs}/dev/proof.f.js +3 -5
- package/{fs → fjs}/djs/ast/module.f.js +2 -2
- package/{fs → fjs}/djs/ast/proof.f.js +8 -16
- package/fjs/djs/examples/m.f.d.ts +2 -0
- package/{fs → fjs}/djs/module.f.d.ts +1 -1
- package/{fs → fjs}/djs/module.f.js +5 -5
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +24 -4
- package/{fs → fjs}/djs/parser/proof.f.js +145 -407
- package/{fs → fjs}/djs/proof.f.js +16 -39
- package/{fs → fjs}/djs/serializer/module.f.js +6 -6
- package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +447 -446
- package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/fjs/djs/transpiler/proof.f.js +67 -0
- package/{fs → fjs}/effects/memory/module.f.js +4 -4
- package/{fs → fjs}/effects/memory/proof.f.js +11 -24
- package/{fs → fjs}/effects/module.f.js +1 -1
- package/{fs → fjs}/effects/node/memory/module.js +2 -2
- package/{fs → fjs}/effects/node/memory/proof.js +8 -15
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.js +7 -7
- package/{fs → fjs}/effects/node/module.js +13 -13
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/module.f.js +7 -7
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
- package/{fs → fjs}/effects/proof.f.js +18 -47
- package/fjs/emergent_testing/all.test.js +4 -0
- package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
- package/{fs → fjs}/emergent_testing/module.f.js +6 -6
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
- package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
- package/fjs/emergent_testing/scenarios/all.js +1 -0
- package/{fs → fjs}/fsc/bnf.f.js +2 -2
- package/{fs → fjs}/fsc/json.f.js +1 -1
- package/{fs → fjs}/fsc/module.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +16 -38
- package/{fs → fjs}/fsm/module.f.js +9 -9
- package/{fs → fjs}/fsm/proof.f.js +12 -19
- package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
- package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
- package/{fs → fjs}/mcp/module.f.d.ts +20 -13
- package/{fs → fjs}/mcp/module.f.js +16 -9
- package/{fs → fjs}/mcp/proof.f.js +17 -17
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
- package/{fs → fjs/media}/html/module.f.d.ts +3 -3
- package/{fs → fjs/media}/html/module.f.js +9 -9
- package/{fs → fjs/media}/html/proof.f.js +12 -33
- package/fjs/media/json/module.f.d.ts +50 -0
- package/{fs → fjs/media}/json/module.f.js +7 -7
- package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
- package/{fs → fjs/media}/json/parser/module.f.js +21 -7
- package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
- package/{fs → fjs/media}/json/proof.f.js +4 -4
- package/fjs/media/json/rpc/module.f.d.ts +114 -0
- package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
- package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
- package/fjs/media/json/schema/module.f.d.ts +78 -0
- package/{fs → fjs/media}/json/schema/module.f.js +25 -41
- package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
- package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
- package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
- package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
- package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
- package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
- package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
- package/fjs/media/module.f.d.ts +37 -0
- package/fjs/media/module.f.js +23 -0
- package/fjs/media/proof.f.d.ts +9 -0
- package/fjs/media/proof.f.js +58 -0
- package/fjs/media/revision/module.f.d.ts +78 -0
- package/fjs/media/revision/module.f.js +122 -0
- package/fjs/media/revision/proof.f.d.ts +31 -0
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
- package/{fs/mime → fjs/media/type}/module.f.js +6 -6
- package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
- package/fjs/module.f.d.ts +2 -0
- package/{fs/fjs → fjs}/module.f.js +9 -9
- package/fjs/module.js +4 -0
- package/{fs → fjs}/path/module.f.js +2 -2
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs/fjs → fjs}/proof.f.js +6 -4
- package/{fs → fjs}/sul/id/module.f.js +9 -9
- package/{fs → fjs}/sul/id/proof.f.js +12 -26
- package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
- package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
- package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
- package/{fs → fjs}/sul/module.f.js +3 -3
- package/{fs → fjs}/sul/proof.f.js +3 -3
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/fjs/text/ascii/proof.f.js +14 -0
- package/{fs → fjs}/text/code_point/module.f.js +12 -12
- package/{fs → fjs}/text/code_point/proof.f.js +1 -1
- package/{fs → fjs}/text/module.f.js +5 -5
- package/{fs → fjs}/text/proof.f.js +7 -12
- package/{fs → fjs}/text/sgr/module.f.js +2 -2
- package/{fs → fjs}/text/sgr/proof.f.js +8 -17
- package/{fs → fjs}/text/utf16/module.f.js +6 -6
- package/{fs → fjs}/text/utf16/proof.f.js +27 -70
- package/{fs → fjs}/text/utf8/module.f.js +22 -17
- package/{fs → fjs}/text/utf8/proof.f.js +59 -128
- package/{fs → fjs}/types/array/module.f.js +1 -1
- package/{fs → fjs}/types/array/proof.f.js +21 -55
- package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/module.f.js +2 -2
- package/{fs → fjs}/types/bigint/proof.f.js +51 -147
- package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
- package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
- package/{fs → fjs}/types/btree/find/module.f.js +1 -1
- package/fjs/types/btree/find/proof.f.d.ts +3 -0
- package/fjs/types/btree/find/proof.f.js +108 -0
- package/{fs → fjs}/types/btree/module.f.js +2 -2
- package/fjs/types/btree/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/btree/proof.f.js +12 -19
- package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
- package/fjs/types/btree/remove/proof.f.d.ts +9 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
- package/{fs → fjs}/types/btree/set/module.f.js +8 -5
- package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
- package/{fs → fjs}/types/byte_set/module.f.js +2 -2
- package/fjs/types/byte_set/proof.f.js +79 -0
- package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
- package/fjs/types/function/operator/proof.f.d.ts +23 -0
- package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
- package/{fs → fjs}/types/function/proof.f.js +3 -4
- package/{fs → fjs}/types/list/module.f.js +2 -2
- package/fjs/types/list/proof.f.d.ts +30 -0
- package/{fs → fjs}/types/list/proof.f.js +59 -167
- package/{fs → fjs}/types/map/proof.f.js +6 -14
- package/fjs/types/nibble_set/proof.f.js +60 -0
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/{fs → fjs}/types/nullable/module.f.js +2 -2
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/module.f.js +5 -5
- package/{fs → fjs}/types/number/proof.f.js +10 -25
- package/{fs → fjs}/types/object/module.f.js +4 -4
- package/{fs → fjs}/types/object/proof.f.js +4 -7
- package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
- package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
- package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
- package/{fs → fjs}/types/prime_field/module.f.js +3 -8
- package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/module.f.js +4 -4
- package/{fs → fjs}/types/range_map/proof.f.js +35 -88
- package/{fs → fjs}/types/result/module.js +1 -1
- package/fjs/types/result/proof.f.d.ts +12 -0
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +48 -4
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/module.f.d.ts +2 -2
- package/{fs → fjs}/types/rtti/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
- package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
- package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
- package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
- package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
- package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
- package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
- package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
- package/{fs → fjs}/types/string/module.f.js +4 -4
- package/fjs/types/string/proof.f.js +77 -0
- package/{fs → fjs}/types/string_set/module.f.js +6 -6
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
- package/{fs → fjs}/types/ts/proof.f.js +16 -43
- package/{fs → fjs}/types/uint8array/module.f.js +10 -10
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
- package/{fs → fjs}/website/module.f.js +3 -3
- package/fjs/website/proof.f.js +13 -0
- package/package.json +8 -8
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/cas/mcp/module.f.js +0 -249
- package/fs/ci/config/module.f.d.ts +0 -43
- package/fs/ci/deno/module.f.js +0 -16
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/examples/m.f.d.ts +0 -2
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/djs/transpiler/proof.f.js +0 -68
- package/fs/emergent_testing/all.test.js +0 -4
- package/fs/emergent_testing/scenarios/all.js +0 -1
- package/fs/fjs/module.f.d.ts +0 -2
- package/fs/fjs/module.js +0 -4
- package/fs/json/module.f.d.ts +0 -50
- package/fs/json/rpc/module.f.d.ts +0 -114
- package/fs/json/schema/module.f.d.ts +0 -77
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/text/ascii/proof.f.js +0 -24
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/btree/find/proof.f.js +0 -151
- package/fs/types/btree/proof.f.d.ts +0 -7
- package/fs/types/btree/remove/proof.f.d.ts +0 -4
- package/fs/types/byte_set/proof.f.js +0 -120
- package/fs/types/function/operator/proof.f.d.ts +0 -12
- package/fs/types/list/proof.f.d.ts +0 -22
- package/fs/types/nibble_set/proof.f.js +0 -89
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/patricia_trie/proof.f.d.ts +0 -7
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.d.ts +0 -1
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.d.ts +0 -6
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- package/fs/website/proof.f.js +0 -16
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs/basen}/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs/basen}/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
- /package/{fs/types → fjs/common}/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/html/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs/types/btree/find → fjs/types/function/compare}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs/types/function → fjs/types/range}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { eachEntry } from './module.f.js';
|
|
2
|
+
import { error, ok } from '../../result/module.f.js';
|
|
3
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
4
|
+
const item = (k, v) => v < 0 ? error({ path: [], message: `negative at ${k}` }) : ok(v * 2);
|
|
5
|
+
/** Mirrors `parse`'s accumulate step, kept simple (a small test list, not a `List`). */
|
|
6
|
+
const collect = (acc, k, v) => [...acc, [k, v]];
|
|
7
|
+
export const proof = {
|
|
8
|
+
empty: () => {
|
|
9
|
+
const r = eachEntry([], item, [], collect);
|
|
10
|
+
assert(r[0] === 'ok');
|
|
11
|
+
assertEq(r[1].length, 0);
|
|
12
|
+
},
|
|
13
|
+
allOk: () => {
|
|
14
|
+
const r = eachEntry([['a', 1], ['b', 2]], item, [], collect);
|
|
15
|
+
assert(r[0] === 'ok');
|
|
16
|
+
assertEq(r[1].length, 2);
|
|
17
|
+
assertEq(r[1][0][0], 'a');
|
|
18
|
+
assertEq(r[1][0][1], 2);
|
|
19
|
+
assertEq(r[1][1][0], 'b');
|
|
20
|
+
assertEq(r[1][1][1], 4);
|
|
21
|
+
},
|
|
22
|
+
// Mirrors `validate`'s usage: nothing is collected, only pass/fail matters.
|
|
23
|
+
noAccumulate: () => {
|
|
24
|
+
const r = eachEntry([['a', 1]], item, undefined, () => undefined);
|
|
25
|
+
assert(r[0] === 'ok');
|
|
26
|
+
assertEq(r[1], undefined);
|
|
27
|
+
},
|
|
28
|
+
firstErrorWins: () => {
|
|
29
|
+
const r = eachEntry([['a', -1], ['b', -2]], item, [], collect);
|
|
30
|
+
assert(r[0] === 'error');
|
|
31
|
+
assertEq(r[1].message, 'negative at a');
|
|
32
|
+
},
|
|
33
|
+
shortCircuits: () => {
|
|
34
|
+
let calls = 0;
|
|
35
|
+
const counting = (k, v) => {
|
|
36
|
+
calls++;
|
|
37
|
+
return item(k, v);
|
|
38
|
+
};
|
|
39
|
+
const r = eachEntry([['a', -1], ['b', -2], ['c', -3]], counting, [], collect);
|
|
40
|
+
assert(r[0] === 'error');
|
|
41
|
+
assertEq(calls, 1);
|
|
42
|
+
},
|
|
43
|
+
pathPrefixed: () => {
|
|
44
|
+
const nested = (k, v) => v < 0 ? error({ path: ['inner'], message: 'bad' }) : ok(v);
|
|
45
|
+
const r = eachEntry([['outer', -1]], nested, [], collect);
|
|
46
|
+
assert(r[0] === 'error');
|
|
47
|
+
assertEq(r[1].path.length, 2);
|
|
48
|
+
assertEq(r[1].path[0], 'outer');
|
|
49
|
+
assertEq(r[1].path[1], 'inner');
|
|
50
|
+
},
|
|
51
|
+
};
|
|
@@ -9,7 +9,7 @@ export type ConstObject = Struct | Tuple;
|
|
|
9
9
|
export type Struct = StringMap<string, Type>;
|
|
10
10
|
/** A tuple schema: readonly array whose elements are nested `Type`s. */
|
|
11
11
|
export type Tuple = readonly Type[];
|
|
12
|
-
declare const primitive0List: readonly [
|
|
12
|
+
declare const primitive0List: readonly ['bigint', 'boolean', 'number', 'string'];
|
|
13
13
|
export type Primitive0 = typeof primitive0List[number];
|
|
14
14
|
export declare const tag0List: readonly ["bigint", "boolean", "number", "string", "unknown"];
|
|
15
15
|
/** Tags for nullary (zero-parameter) type schemas. */
|
|
@@ -40,7 +40,7 @@ export declare const bigint: Bigint;
|
|
|
40
40
|
export type Unknown = Type0<'unknown'>;
|
|
41
41
|
/** Schema that validates any DJS-compatible value. */
|
|
42
42
|
export declare const unknown: Unknown;
|
|
43
|
-
declare const tag1List: readonly [
|
|
43
|
+
declare const tag1List: readonly ['array', 'record'];
|
|
44
44
|
export declare const isTag1: Includes<string, typeof tag1List>;
|
|
45
45
|
/** Tags for unary (one-parameter) type schemas. */
|
|
46
46
|
export type Tag1 = typeof tag1List[number];
|
|
@@ -26,20 +26,20 @@
|
|
|
26
26
|
*
|
|
27
27
|
* @module
|
|
28
28
|
*/
|
|
29
|
-
import {} from
|
|
30
|
-
import { ok } from
|
|
31
|
-
import {
|
|
32
|
-
import { constPrimitiveValidate, isArray, isObject,
|
|
33
|
-
export {} from
|
|
29
|
+
import {} from '../module.f.js';
|
|
30
|
+
import { ok } from '../../result/module.f.js';
|
|
31
|
+
import { reverse, toArray } from '../../list/module.f.js';
|
|
32
|
+
import { constPrimitiveValidate, eachEntry, isArray, isObject, orVisit, primitive0Validate, verror, visit, } from '../common/module.f.js';
|
|
33
|
+
export {} from '../common/module.f.js';
|
|
34
34
|
const { entries } = Object;
|
|
35
|
-
const keyedFirstError = (results) => {
|
|
36
|
-
const e = results.find(([, r]) => r[0] === 'error');
|
|
37
|
-
return e === undefined ? null : [e[0], e[1]];
|
|
38
|
-
};
|
|
39
35
|
const arrayRebuild = entries => entries.map(([, v]) => v);
|
|
40
36
|
const recordRebuild = entries => Object.fromEntries(entries);
|
|
41
|
-
/**
|
|
42
|
-
const
|
|
37
|
+
/** `eachEntry`'s accumulator seed: entries are consed on in reverse as they parse. */
|
|
38
|
+
const emptyEntries = null;
|
|
39
|
+
/** `eachEntry`'s accumulate step: an O(1) prepend, unlike rebuilding an array on every entry. */
|
|
40
|
+
const consEntry = (acc, k, v) => ({ first: [k, v], tail: acc });
|
|
41
|
+
/** Restores forward order from `consEntry`'s reverse-order list, in one linear pass. */
|
|
42
|
+
const orderedEntries = (list) => toArray(reverse(list));
|
|
43
43
|
/**
|
|
44
44
|
* Builds a parser for `array` or `record` schemas. Mirrors `validate`'s
|
|
45
45
|
* `containerValidate`, but rebuilds a fresh container from each item's parsed
|
|
@@ -56,11 +56,8 @@ const containerParse = (isContainer, rebuild) => (item) => value => {
|
|
|
56
56
|
return ok(rebuild([]));
|
|
57
57
|
}
|
|
58
58
|
const itemParse = parse(item);
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
return err === null
|
|
62
|
-
? ok(rebuild(okEntries(results)))
|
|
63
|
-
: prependPath(err[0], err[1]);
|
|
59
|
+
const r = eachEntry(e, (_k, v) => itemParse(v), emptyEntries, consEntry);
|
|
60
|
+
return r[0] === 'error' ? r : ok(rebuild(orderedEntries(r[1])));
|
|
64
61
|
};
|
|
65
62
|
const arrayParse = containerParse(isArray, arrayRebuild);
|
|
66
63
|
const recordParse = containerParse(isObject, recordRebuild);
|
|
@@ -74,18 +71,12 @@ const constContainerParse = (isContainer, getItem, rebuild) => (rtti) => value =
|
|
|
74
71
|
if (!isContainer(value)) {
|
|
75
72
|
return verror('unexpected value');
|
|
76
73
|
}
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
return err === null
|
|
80
|
-
? ok(rebuild(okEntries(results)))
|
|
81
|
-
: prependPath(err[0], err[1]);
|
|
74
|
+
const r = eachEntry(entries(rtti), (k, t) => parse(t)(getItem(value, k)), emptyEntries, consEntry);
|
|
75
|
+
return r[0] === 'error' ? r : ok(rebuild(orderedEntries(r[1])));
|
|
82
76
|
};
|
|
83
77
|
const tupleParse = constContainerParse(isArray, (value, k) => value[Number(k)], arrayRebuild);
|
|
84
78
|
const structParse = constContainerParse(isObject, (value, k) => value[k], recordRebuild);
|
|
85
|
-
const
|
|
86
|
-
const orParse = (rtti) =>
|
|
87
|
-
// `parse(t)` where t: Type forces Ts<Type> evaluation → TS2589; cast keeps result as any.
|
|
88
|
-
value => findFirst(listMap(t => parse(t)(value))(rtti));
|
|
79
|
+
const orParse = (rtti) => orVisit(parse)(rtti);
|
|
89
80
|
/**
|
|
90
81
|
* Creates a parser function for the given RTTI schema.
|
|
91
82
|
*
|
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
import { parse } from
|
|
2
|
-
import { boolean, number, string, bigint, unknown, array, record, or, option } from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const assertError = ([k]) => { if (k !== 'error') {
|
|
7
|
-
throw 'expected error';
|
|
8
|
-
} };
|
|
1
|
+
import { parse } from './module.f.js';
|
|
2
|
+
import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.js';
|
|
3
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
4
|
+
const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok'); };
|
|
5
|
+
const assertError = ([k]) => { assertEq(k, 'error', 'expected error'); };
|
|
9
6
|
const unwrap = (r) => {
|
|
10
|
-
|
|
11
|
-
throw 'expected ok';
|
|
12
|
-
}
|
|
7
|
+
assert(r[0] === 'ok', 'expected ok');
|
|
13
8
|
return r[1];
|
|
14
9
|
};
|
|
15
10
|
const assertErrorPath = (expected) => (r) => {
|
|
16
|
-
|
|
17
|
-
throw 'expected error';
|
|
18
|
-
}
|
|
11
|
+
assert(r[0] === 'error', 'expected error');
|
|
19
12
|
const e = r[1];
|
|
20
13
|
if (e.path.length !== expected.length) {
|
|
21
14
|
throw `path length ${e.path.length} != ${expected.length}`;
|
|
@@ -207,9 +200,7 @@ export const proof = {
|
|
|
207
200
|
freshArray: () => {
|
|
208
201
|
const input = [1, 2, 3];
|
|
209
202
|
const out = unwrap(parse(array(number))(input));
|
|
210
|
-
|
|
211
|
-
throw 'expected a fresh array';
|
|
212
|
-
}
|
|
203
|
+
assert(out !== input, 'expected a fresh array');
|
|
213
204
|
assertDeepEqual(out, [1, 2, 3]);
|
|
214
205
|
},
|
|
215
206
|
error: () => {
|
|
@@ -236,9 +227,7 @@ export const proof = {
|
|
|
236
227
|
freshRecord: () => {
|
|
237
228
|
const input = { a: 1, b: 2 };
|
|
238
229
|
const out = unwrap(parse(record(number))(input));
|
|
239
|
-
|
|
240
|
-
throw 'expected a fresh record';
|
|
241
|
-
}
|
|
230
|
+
assert(out !== input, 'expected a fresh record');
|
|
242
231
|
assertDeepEqual(out, { a: 1, b: 2 });
|
|
243
232
|
},
|
|
244
233
|
error: () => {
|
|
@@ -11,9 +11,15 @@ export type Primitive = null | boolean | number | string | undefined | bigint;
|
|
|
11
11
|
* The TypeScript type that rtti's `unknown` schema validates — any value that
|
|
12
12
|
* an rtti schema can represent: a primitive, an array, or an object.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* This is the single source of truth for the rtti value domain: every rtti
|
|
15
|
+
* module (`common`, `validate`, `parse`, …) imports `Unknown`/`Primitive`
|
|
16
|
+
* from here, not from `djs`, keeping `rtti` free of a `djs` dependency (djs
|
|
17
|
+
* depends on rtti, not the other way around).
|
|
18
|
+
*
|
|
19
|
+
* The relationship to djs is a subset one — `djs.Unknown ⊆ rtti.Unknown` — not
|
|
20
|
+
* equality: the two happen to coincide today, but `rtti.Unknown` may widen to
|
|
21
|
+
* admit values djs cannot represent (e.g. functions) without djs following.
|
|
22
|
+
* Do not re-point rtti imports at `djs.Unknown` on the assumption they match.
|
|
17
23
|
*/
|
|
18
24
|
export type Unknown = Primitive | Array | Object;
|
|
19
25
|
/** A read-only array of {@link Unknown} values. */
|
|
@@ -54,7 +60,7 @@ export type StructTs<T extends Struct> = (keyof OptionalFields<T> extends never
|
|
|
54
60
|
*
|
|
55
61
|
* **Recursive schemas and TS2589:** when a schema is self-referential, `StructTs` would
|
|
56
62
|
* expand infinitely and TypeScript raises TS2589. Break the cycle by annotating the
|
|
57
|
-
* schema value with `Phantom<typeof myThunk, MyType>` from `
|
|
63
|
+
* schema value with `Phantom<typeof myThunk, MyType>` from `fjs/types/phantom/module.f.ts`.
|
|
58
64
|
* `Ts<>` detects the phantom key and returns `MyType` directly without recursing:
|
|
59
65
|
*
|
|
60
66
|
* ```ts
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* The runtime `toTs` function mirrors `Ts<T>` at value level, returning a TypeScript
|
|
8
8
|
* type expression string for a given RTTI schema.
|
|
9
9
|
*/
|
|
10
|
-
import { primitive, union, printer as tsPrinter } from
|
|
10
|
+
import { primitive, union, printer as tsPrinter } from '../../ts/module.f.js';
|
|
11
11
|
/**
|
|
12
12
|
* Creates a printer that converts an RTTI schema `Type` to its TypeScript type expression as a string.
|
|
13
13
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { printer } from
|
|
2
|
-
import { boolean, number, string, bigint, unknown, array, record, or, option, never } from
|
|
1
|
+
import { printer } from './module.f.js';
|
|
2
|
+
import { boolean, number, string, bigint, unknown, array, record, or, option, never } from '../module.f.js';
|
|
3
3
|
const toTs = printer();
|
|
4
4
|
const toTsMut = printer(true);
|
|
5
5
|
const eqMut = (rtti, expected) => {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {} from
|
|
2
|
-
import { ok } from
|
|
3
|
-
import { constPrimitiveValidate, isArray, isObject,
|
|
4
|
-
export { constPrimitiveValidate, prependPath, primitive0Validate, verror, } from
|
|
1
|
+
import {} from '../module.f.js';
|
|
2
|
+
import { ok } from '../../result/module.f.js';
|
|
3
|
+
import { constPrimitiveValidate, eachEntry, isArray, isObject, orVisit, primitive0Validate, verror, visit, } from '../common/module.f.js';
|
|
4
|
+
export { constPrimitiveValidate, prependPath, primitive0Validate, verror, } from '../common/module.f.js';
|
|
5
5
|
const { entries } = Object;
|
|
6
|
+
/** `validate` has nothing to collect from a successful entry — only pass/fail matters. */
|
|
7
|
+
const noAccumulate = () => undefined;
|
|
6
8
|
/**
|
|
7
9
|
* Builds a validator for `array` or `record` schemas.
|
|
8
10
|
* The inner item validator is instantiated lazily (only when the container is
|
|
@@ -19,15 +21,10 @@ const containerValidate = (isContainer) => (item) => value => {
|
|
|
19
21
|
// Note: we shouldn't instantiate `itemValidate` until we make sure `entries` is not empty.
|
|
20
22
|
// Otherwise, we can get infinite recursion on empty arrays and objects
|
|
21
23
|
const itemValidate = validate(item);
|
|
22
|
-
|
|
23
|
-
const r = itemValidate(v);
|
|
24
|
-
if (r[0] === 'error') {
|
|
25
|
-
return prependPath(k, r);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
24
|
+
const r = eachEntry(e, (_k, v) => itemValidate(v), undefined, noAccumulate);
|
|
28
25
|
// `value` is Container<K>, but Ts<Info1<K,I>> = readonly Ts<I>[] | Record<string,Ts<I>>.
|
|
29
26
|
// TypeScript can't narrow the container's element types through the validation loop.
|
|
30
|
-
return ok(value);
|
|
27
|
+
return r[0] === 'error' ? r : ok(value);
|
|
31
28
|
};
|
|
32
29
|
const arrayValidate = containerValidate(isArray);
|
|
33
30
|
const recordValidate = containerValidate(isObject);
|
|
@@ -40,32 +37,14 @@ const constContainerValidate = (isContainer, getItem) => (rtti) => value => {
|
|
|
40
37
|
if (!isContainer(value)) {
|
|
41
38
|
return verror('unexpected value');
|
|
42
39
|
}
|
|
43
|
-
|
|
44
|
-
const item = getItem(value, k);
|
|
45
|
-
const r = validate(v)(item);
|
|
46
|
-
if (r[0] === 'error') {
|
|
47
|
-
return prependPath(k, r);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
40
|
+
const r = eachEntry(Object.entries(rtti), (k, v) => validate(v)(getItem(value, k)), undefined, noAccumulate);
|
|
50
41
|
// `value` is C (Unknown container), but Ts<T> for T extends Tuple|Struct is not
|
|
51
42
|
// structurally equivalent to C — TypeScript can't narrow element types through the loop.
|
|
52
|
-
return ok(value);
|
|
43
|
+
return r[0] === 'error' ? r : ok(value);
|
|
53
44
|
};
|
|
54
45
|
const tupleValidate = constContainerValidate(isArray, (value, k) => value[Number(k)]);
|
|
55
46
|
const structValidate = constContainerValidate(isObject, (value, k) => value[k]);
|
|
56
|
-
const orValidate = (rtti) =>
|
|
57
|
-
const all = rtti.map(r => validate(r));
|
|
58
|
-
return value => {
|
|
59
|
-
for (const i of all) {
|
|
60
|
-
// `i` is Validate<Type>; calling without cast forces Ts<Type> evaluation → TS2589.
|
|
61
|
-
const r = i(value);
|
|
62
|
-
if (r[0] === 'ok') {
|
|
63
|
-
return r;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return verror('no match');
|
|
67
|
-
};
|
|
68
|
-
};
|
|
47
|
+
const orValidate = (rtti) => orVisit(validate)(rtti);
|
|
69
48
|
/**
|
|
70
49
|
* Creates a validator function for the given RTTI schema.
|
|
71
50
|
*
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { validate } from
|
|
2
|
-
import { boolean, number, string, bigint, unknown, array, record, or, option } from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const assertError = ([k]) => { if (k !== 'error') {
|
|
7
|
-
throw 'expected error';
|
|
8
|
-
} };
|
|
1
|
+
import { validate } from './module.f.js';
|
|
2
|
+
import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.js';
|
|
3
|
+
import { assert, assertEq } from '../../../asserts/module.f.js';
|
|
4
|
+
const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok'); };
|
|
5
|
+
const assertError = ([k]) => { assertEq(k, 'error', 'expected error'); };
|
|
9
6
|
const assertErrorPath = (expected) => (r) => {
|
|
10
|
-
|
|
11
|
-
throw 'expected error';
|
|
12
|
-
}
|
|
7
|
+
assert(r[0] === 'error', 'expected error');
|
|
13
8
|
const e = r[1];
|
|
14
9
|
if (e.path.length !== expected.length) {
|
|
15
10
|
throw `path length ${e.path.length} != ${expected.length}`;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { bsearch } from
|
|
7
|
-
import { next } from
|
|
8
|
-
import { identity } from
|
|
6
|
+
import { bsearch } from '../function/compare/module.f.js';
|
|
7
|
+
import { next } from '../list/module.f.js';
|
|
8
|
+
import { identity } from '../function/module.f.js';
|
|
9
9
|
/**
|
|
10
10
|
* Two-way sorted-list merge.
|
|
11
11
|
* `reduceOp` returns `[output, sign, nextState]` where sign `-1` advances `a`, `1` advances `b`, `0` advances both; `null` output skips emission.
|
|
@@ -1,59 +1,46 @@
|
|
|
1
|
-
import { find, merge } from
|
|
2
|
-
import { stringify } from
|
|
3
|
-
import { sort } from
|
|
4
|
-
import { toArray, countdown, length } from
|
|
5
|
-
import { flip } from
|
|
6
|
-
import { cmp } from
|
|
1
|
+
import { find, merge } from './module.f.js';
|
|
2
|
+
import { stringify } from '../../media/json/module.f.js';
|
|
3
|
+
import { sort } from '../object/module.f.js';
|
|
4
|
+
import { toArray, countdown, length } from '../list/module.f.js';
|
|
5
|
+
import { flip } from '../function/module.f.js';
|
|
6
|
+
import { cmp } from '../number/module.f.js';
|
|
7
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
7
8
|
const str = stringify(sort);
|
|
8
9
|
const reverseCmp = flip(cmp);
|
|
9
10
|
export const proof = {
|
|
10
11
|
sortedMergre: [
|
|
11
12
|
() => {
|
|
12
13
|
const result = str(toArray(merge(cmp)([2, 3, 4])([1, 3, 5])));
|
|
13
|
-
|
|
14
|
-
throw result;
|
|
15
|
-
}
|
|
14
|
+
assertEq(result, '[1,2,3,4,5]');
|
|
16
15
|
},
|
|
17
16
|
() => {
|
|
18
17
|
const result = str(toArray(merge(cmp)([1, 2, 3])([])));
|
|
19
|
-
|
|
20
|
-
throw result;
|
|
21
|
-
}
|
|
18
|
+
assertEq(result, '[1,2,3]');
|
|
22
19
|
},
|
|
23
20
|
() => {
|
|
24
21
|
const n = 10_000;
|
|
25
22
|
const list = countdown(n);
|
|
26
23
|
const result = merge(reverseCmp)(list)(list);
|
|
27
24
|
const len = length(result);
|
|
28
|
-
|
|
29
|
-
throw result;
|
|
30
|
-
}
|
|
25
|
+
assert(len == n, result);
|
|
31
26
|
}
|
|
32
27
|
],
|
|
33
28
|
find: [
|
|
34
29
|
() => {
|
|
35
30
|
const result = find(cmp)(0)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
36
|
-
|
|
37
|
-
throw result;
|
|
38
|
-
}
|
|
31
|
+
assertEq(result, 0);
|
|
39
32
|
},
|
|
40
33
|
() => {
|
|
41
34
|
const result = find(cmp)(3)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
42
|
-
|
|
43
|
-
throw result;
|
|
44
|
-
}
|
|
35
|
+
assertEq(result, null);
|
|
45
36
|
},
|
|
46
37
|
() => {
|
|
47
38
|
const result = find(cmp)(77)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
48
|
-
|
|
49
|
-
throw result;
|
|
50
|
-
}
|
|
39
|
+
assertEq(result, null);
|
|
51
40
|
},
|
|
52
41
|
() => {
|
|
53
42
|
const result = find(cmp)(80)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
54
|
-
|
|
55
|
-
throw result;
|
|
56
|
-
}
|
|
43
|
+
assertEq(result, 80);
|
|
57
44
|
}
|
|
58
45
|
]
|
|
59
46
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toArray } from "../list/module.f.js";
|
|
2
|
-
import { merge, intersect as listIntersect, find } from
|
|
2
|
+
import { merge, intersect as listIntersect, find } from '../sorted_list/module.f.js';
|
|
3
3
|
export const union = cmp => a => b => toArray(merge(cmp)(a)(b));
|
|
4
4
|
export const intersect = cmp => a => b => toArray(listIntersect(cmp)(a)(b));
|
|
5
5
|
export const has = cmp => value => set => find(cmp)(value)(set) === value;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { has, intersect, union } from
|
|
2
|
-
import { stringify } from
|
|
3
|
-
import { sort } from
|
|
4
|
-
import { toArray, countdown, length } from
|
|
5
|
-
import { flip } from
|
|
6
|
-
import { cmp } from
|
|
1
|
+
import { has, intersect, union } from './module.f.js';
|
|
2
|
+
import { stringify } from '../../media/json/module.f.js';
|
|
3
|
+
import { sort } from '../object/module.f.js';
|
|
4
|
+
import { toArray, countdown, length } from '../list/module.f.js';
|
|
5
|
+
import { flip } from '../function/module.f.js';
|
|
6
|
+
import { cmp } from '../number/module.f.js';
|
|
7
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
7
8
|
const str = a => stringify(sort)(a);
|
|
8
9
|
const reverseCmp = flip(cmp);
|
|
9
10
|
export const proof = {
|
|
@@ -12,81 +13,55 @@ export const proof = {
|
|
|
12
13
|
const setA = [1, 3, 5];
|
|
13
14
|
const setB = [3, 4, 5];
|
|
14
15
|
const unionSet = union(cmp)(setA)(setB); // [1, 3, 4, 5]
|
|
15
|
-
|
|
16
|
-
throw 0;
|
|
17
|
-
}
|
|
16
|
+
assertEq(str(unionSet), '[1,3,4,5]', 0);
|
|
18
17
|
const intersectionSet = intersect(cmp)(setA)(setB); // [3, 5]
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (!has(cmp)(3)(setA)) {
|
|
23
|
-
throw 2;
|
|
24
|
-
}
|
|
25
|
-
if (has(cmp)(2)(setA)) {
|
|
26
|
-
throw 3;
|
|
27
|
-
}
|
|
18
|
+
assertEq(str(intersectionSet), '[3,5]', 1);
|
|
19
|
+
assert(has(cmp)(3)(setA), 2);
|
|
20
|
+
assert(!(has(cmp)(2)(setA)), 3);
|
|
28
21
|
},
|
|
29
22
|
union: [
|
|
30
23
|
() => {
|
|
31
24
|
const result = str(toArray(union(cmp)([2, 3, 4])([1, 3, 5])));
|
|
32
|
-
|
|
33
|
-
throw result;
|
|
34
|
-
}
|
|
25
|
+
assertEq(result, '[1,2,3,4,5]');
|
|
35
26
|
},
|
|
36
27
|
() => {
|
|
37
28
|
const result = str(toArray(union(cmp)([1, 2, 3])([])));
|
|
38
|
-
|
|
39
|
-
throw result;
|
|
40
|
-
}
|
|
29
|
+
assertEq(result, '[1,2,3]');
|
|
41
30
|
},
|
|
42
31
|
() => {
|
|
43
32
|
const n = 10_000;
|
|
44
33
|
const sortedSet = toArray(countdown(n));
|
|
45
34
|
const result = union(reverseCmp)(sortedSet)(sortedSet);
|
|
46
35
|
const len = length(result);
|
|
47
|
-
|
|
48
|
-
throw result;
|
|
49
|
-
}
|
|
36
|
+
assert(len == n, result);
|
|
50
37
|
}
|
|
51
38
|
],
|
|
52
39
|
intersect: [
|
|
53
40
|
() => {
|
|
54
41
|
const result = str(toArray(intersect(cmp)([2, 3, 4])([1, 3, 5])));
|
|
55
|
-
|
|
56
|
-
throw result;
|
|
57
|
-
}
|
|
42
|
+
assertEq(result, '[3]');
|
|
58
43
|
},
|
|
59
44
|
() => {
|
|
60
45
|
const result = str(toArray(intersect(cmp)([1, 2, 3])([])));
|
|
61
|
-
|
|
62
|
-
throw result;
|
|
63
|
-
}
|
|
46
|
+
assertEq(result, '[]');
|
|
64
47
|
}
|
|
65
48
|
],
|
|
66
49
|
has: [
|
|
67
50
|
() => {
|
|
68
51
|
const result = has(cmp)(0)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
69
|
-
|
|
70
|
-
throw result;
|
|
71
|
-
}
|
|
52
|
+
assert(result, result);
|
|
72
53
|
},
|
|
73
54
|
() => {
|
|
74
55
|
const result = has(cmp)(3)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
75
|
-
|
|
76
|
-
throw result;
|
|
77
|
-
}
|
|
56
|
+
assert(!(result), result);
|
|
78
57
|
},
|
|
79
58
|
() => {
|
|
80
59
|
const result = has(cmp)(77)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
81
|
-
|
|
82
|
-
throw result;
|
|
83
|
-
}
|
|
60
|
+
assert(!(result), result);
|
|
84
61
|
},
|
|
85
62
|
() => {
|
|
86
63
|
const result = has(cmp)(80)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
|
|
87
|
-
|
|
88
|
-
throw result;
|
|
89
|
-
}
|
|
64
|
+
assert(result, result);
|
|
90
65
|
}
|
|
91
66
|
]
|
|
92
67
|
};
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* cmp('apple')('banana') // -1
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
-
import { reduce as listReduce, repeat as listRepeat } from
|
|
19
|
-
import { compose } from
|
|
20
|
-
import { cmp as uCmp } from
|
|
21
|
-
import { join as joinOp, concat as concatOp } from
|
|
18
|
+
import { reduce as listReduce, repeat as listRepeat } from '../list/module.f.js';
|
|
19
|
+
import { compose } from '../function/module.f.js';
|
|
20
|
+
import { cmp as uCmp } from '../function/compare/module.f.js';
|
|
21
|
+
import { join as joinOp, concat as concatOp } from '../function/operator/module.f.js';
|
|
22
22
|
const reduce = o => listReduce(o)('');
|
|
23
23
|
export const join = compose(joinOp)(reduce);
|
|
24
24
|
export const concat = reduce(concatOp);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { join, concat, repeat, cmp, splitAt } from './module.f.js';
|
|
2
|
+
import { repeat as repeatList } from '../list/module.f.js';
|
|
3
|
+
import { assert, assertEq } from '../../asserts/module.f.js';
|
|
4
|
+
export const proof = {
|
|
5
|
+
example: () => {
|
|
6
|
+
const words = ['hello', 'world'];
|
|
7
|
+
assertEq(join(' ')(words), 'hello world', 0);
|
|
8
|
+
assertEq(concat(words), 'helloworld', 1);
|
|
9
|
+
assertEq(repeat('abc')(3), 'abcabcabc', 2);
|
|
10
|
+
assertEq(cmp('apple')('banana'), -1, 3);
|
|
11
|
+
},
|
|
12
|
+
join: {
|
|
13
|
+
0: () => {
|
|
14
|
+
const result = join('/')([]);
|
|
15
|
+
assertEq(result, '');
|
|
16
|
+
},
|
|
17
|
+
1: () => {
|
|
18
|
+
const result = join('/')(['']);
|
|
19
|
+
assertEq(result, '');
|
|
20
|
+
},
|
|
21
|
+
3: () => {
|
|
22
|
+
const result = join(' ')(['hello', 'world', '!']);
|
|
23
|
+
assertEq(result, 'hello world !');
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
concat: () => {
|
|
27
|
+
const result = concat(['hello', 'world']);
|
|
28
|
+
assertEq(result, 'helloworld');
|
|
29
|
+
},
|
|
30
|
+
repeatList: {
|
|
31
|
+
0: () => {
|
|
32
|
+
const s = join('.')(repeatList('x')(0));
|
|
33
|
+
assert(s == '', s);
|
|
34
|
+
},
|
|
35
|
+
5: () => {
|
|
36
|
+
const s = join('.')(repeatList('x')(5));
|
|
37
|
+
assert(s == 'x.x.x.x.x', s);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
repeat: () => {
|
|
41
|
+
const s = repeat('x')(5);
|
|
42
|
+
if (s != 'xxxxx') {
|
|
43
|
+
throw s;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
cmp: () => {
|
|
47
|
+
const result = cmp('3')('4');
|
|
48
|
+
assertEq(result, -1);
|
|
49
|
+
},
|
|
50
|
+
splitAt: {
|
|
51
|
+
middle: () => {
|
|
52
|
+
const [a, b] = splitAt(3)('hello');
|
|
53
|
+
assertEq(a, 'hel');
|
|
54
|
+
assertEq(b, 'lo');
|
|
55
|
+
},
|
|
56
|
+
zero: () => {
|
|
57
|
+
const [a, b] = splitAt(0)('hello');
|
|
58
|
+
assertEq(a, '');
|
|
59
|
+
assertEq(b, 'hello');
|
|
60
|
+
},
|
|
61
|
+
full: () => {
|
|
62
|
+
const [a, b] = splitAt(5)('hello');
|
|
63
|
+
assertEq(a, 'hello');
|
|
64
|
+
assertEq(b, '');
|
|
65
|
+
},
|
|
66
|
+
beyond: () => {
|
|
67
|
+
const [a, b] = splitAt(10)('hello');
|
|
68
|
+
assertEq(a, 'hello');
|
|
69
|
+
assertEq(b, '');
|
|
70
|
+
},
|
|
71
|
+
empty: () => {
|
|
72
|
+
const [a, b] = splitAt(0)('');
|
|
73
|
+
assertEq(a, '');
|
|
74
|
+
assertEq(b, '');
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
};
|