functionalscript 0.44.0 → 0.45.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/fjs/asn.1/proof.f.d.mts +5 -0
- package/fjs/asn.1/proof.f.mjs +15 -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/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/proof.f.mjs +0 -1
- package/fjs/bnf/descent/module.f.d.mts +17 -2
- package/fjs/bnf/descent/module.f.mjs +118 -41
- package/fjs/bnf/descent/proof.f.d.mts +1 -0
- package/fjs/bnf/descent/proof.f.mjs +77 -1
- package/fjs/bnf/descent/types.d.ts +12 -4
- package/fjs/bnf/ll1/module.f.d.mts +28 -2
- package/fjs/bnf/ll1/module.f.mjs +180 -38
- package/fjs/bnf/ll1/proof.f.d.mts +2 -0
- package/fjs/bnf/ll1/proof.f.mjs +62 -1
- package/fjs/bnf/ll1/types.d.ts +14 -8
- 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/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/proof.f.d.mts +3 -1
- package/fjs/cas/cli/proof.f.mjs +3 -1
- package/fjs/cas/evo/module.f.d.mts +7 -13
- package/fjs/cas/evo/module.f.mjs +103 -96
- package/fjs/cas/evo/proof.f.mjs +6 -3
- package/fjs/cas/module.f.mjs +96 -109
- 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 +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/nix/proof.f.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +4 -3
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +4 -2
- 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/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +3 -1
- package/fjs/crypto/sha2/proof.f.mjs +3 -1
- 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 +5 -2
- package/fjs/dev/module.f.mjs +5 -4
- package/fjs/dev/package_json/module.f.d.mts +7 -0
- package/fjs/dev/package_json/module.f.mjs +10 -7
- package/fjs/dev/update/module.f.d.mts +3 -0
- package/fjs/dev/update/module.f.mjs +3 -2
- package/fjs/dev/update/proof.f.d.mts +3 -0
- package/fjs/dev/update/proof.f.mjs +1 -2
- package/fjs/djs/parser/module.f.d.mts +3 -0
- package/fjs/djs/parser/module.f.mjs +18 -0
- package/fjs/djs/parser/proof.f.d.mts +3 -0
- package/fjs/djs/parser/proof.f.mjs +13 -1
- package/fjs/djs/proof.f.d.mts +3 -0
- package/fjs/djs/proof.f.mjs +4 -1
- package/fjs/djs/serializer/module.f.mjs +5 -4
- package/fjs/djs/tokenizer/module.f.mjs +21 -13
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +14 -2
- package/fjs/djs/transpiler/module.f.d.mts +1 -12
- package/fjs/djs/transpiler/module.f.mjs +1 -20
- package/fjs/djs/transpiler/types.d.ts +25 -0
- package/fjs/effects/eff/module.f.d.mts +10 -0
- package/fjs/effects/eff/module.f.mjs +4 -2
- package/fjs/effects/eff/proof.f.d.mts +3 -0
- package/fjs/effects/eff/proof.f.mjs +4 -1
- package/fjs/effects/list/module.f.d.mts +10 -2
- package/fjs/effects/list/module.f.mjs +4 -2
- package/fjs/effects/memory/module.f.d.mts +4 -2
- package/fjs/effects/memory/module.f.mjs +4 -3
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +5 -2
- package/fjs/effects/mock/module.f.d.mts +10 -2
- package/fjs/effects/mock/module.f.mjs +4 -2
- package/fjs/effects/module.d.mts +8 -0
- package/fjs/effects/module.f.d.mts +6 -4
- package/fjs/effects/module.f.mjs +6 -5
- package/fjs/effects/module.mjs +9 -1
- package/fjs/effects/node/memory/module.d.mts +3 -0
- package/fjs/effects/node/memory/module.mjs +3 -2
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +2 -1
- package/fjs/effects/node/module.d.mts +5 -0
- package/fjs/effects/node/module.f.d.mts +17 -12
- package/fjs/effects/node/module.f.mjs +6 -12
- package/fjs/effects/node/module.mjs +5 -17
- package/fjs/effects/node/virtual/module.f.d.mts +6 -3
- package/fjs/effects/node/virtual/module.f.mjs +6 -5
- package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
- package/fjs/effects/node/virtual/proof.f.mjs +13 -1
- package/fjs/effects/proof.f.d.mts +3 -0
- package/fjs/effects/proof.f.mjs +4 -1
- 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 +6 -1
- package/fjs/emergent_testing/module.f.mjs +40 -66
- package/fjs/emergent_testing/proof.f.mjs +5 -5
- 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/proof.f.d.mts +3 -0
- package/fjs/fsm/proof.f.mjs +4 -1
- package/fjs/js/tokenizer/module.f.d.mts +7 -0
- package/fjs/js/tokenizer/module.f.mjs +19 -55
- package/fjs/mcp/module.f.d.mts +36 -1
- package/fjs/mcp/module.f.mjs +9 -7
- package/fjs/mcp/proof.f.d.mts +11 -1
- package/fjs/mcp/proof.f.mjs +11 -18
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +6 -4
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -1
- package/fjs/media/json/parser/module.f.d.mts +1 -1
- package/fjs/media/json/parser/module.f.mjs +25 -8
- package/fjs/media/json/parser/types.d.ts +5 -0
- package/fjs/media/json/rtti/proof.f.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +3 -3
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +228 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -0
- package/fjs/media/json/schema/proof.f.mjs +219 -7
- package/fjs/media/json/serializer/module.f.d.mts +13 -0
- package/fjs/media/json/serializer/module.f.mjs +7 -7
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +24 -5
- 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/revision/module.f.d.mts +5 -0
- package/fjs/media/revision/module.f.mjs +8 -11
- package/fjs/media/revision/proof.f.d.mts +4 -0
- package/fjs/media/revision/proof.f.mjs +5 -2
- package/fjs/media/type/module.f.d.mts +28 -11
- package/fjs/media/type/module.f.mjs +69 -85
- package/fjs/media/type/proof.f.d.mts +16 -0
- package/fjs/media/type/proof.f.mjs +44 -4
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +4 -2
- package/fjs/module.mjs +6 -0
- package/fjs/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +4 -0
- package/fjs/proof.f.mjs +5 -2
- package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
- package/fjs/protocol/json_rpc/module.f.mjs +7 -4
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
- package/fjs/protocol/mcp/proof.f.d.mts +4 -0
- package/fjs/protocol/mcp/proof.f.mjs +47 -24
- package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
- package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
- package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/sul/id/module.f.d.mts +5 -0
- package/fjs/sul/id/module.f.mjs +5 -4
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +4 -3
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +5 -2
- 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 +5 -4
- 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 +21 -3
- package/fjs/text/code_point/module.f.mjs +24 -8
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +28 -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 +4 -1
- package/fjs/text/sgr/module.f.mjs +4 -3
- 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 +31 -33
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +18 -1
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +16 -18
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +2 -2
- 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 -14
- package/fjs/types/bit_vec/module.f.mjs +61 -71
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +29 -3
- 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 +9 -9
- 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 +5 -6
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +4 -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 +10 -1
- package/fjs/types/byte_set/module.f.mjs +5 -3
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +3 -1
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +3 -2
- 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 +9 -2
- package/fjs/types/list/module.f.mjs +5 -3
- 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 +8 -2
- package/fjs/types/nullable/module.f.mjs +4 -2
- 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 +14 -2
- package/fjs/types/object/module.f.mjs +15 -6
- 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 +2 -2
- 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 +35 -2
- package/fjs/types/rtti/common/module.f.mjs +9 -7
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +5 -2
- package/fjs/types/rtti/data/module.f.d.mts +120 -0
- package/fjs/types/rtti/data/module.f.mjs +1030 -0
- package/fjs/types/rtti/data/proof.f.d.mts +75 -0
- package/fjs/types/rtti/data/proof.f.mjs +566 -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 +38 -0
- package/fjs/types/rtti/parse/module.f.mjs +9 -7
- package/fjs/types/rtti/parse/proof.f.mjs +18 -38
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +262 -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 +11 -0
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/rtti/validate/module.f.d.mts +36 -1
- package/fjs/types/rtti/validate/module.f.mjs +6 -4
- 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 +31 -1
- package/fjs/types/sorted_set/module.f.mjs +4 -2
- package/fjs/types/sorted_set/proof.f.d.mts +3 -1
- package/fjs/types/sorted_set/proof.f.mjs +3 -1
- 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 +3 -0
- package/fjs/website/module.f.mjs +3 -2
- 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/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/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.d.ts +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/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
|
@@ -18,7 +18,7 @@ export declare const images: {
|
|
|
18
18
|
readonly arm: 'windows-11-arm';
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
|
-
export declare const functionalscript = /** @type {const} */ "0.
|
|
21
|
+
export declare const functionalscript = /** @type {const} */ "0.44.0";
|
|
22
22
|
export declare const bun = "1.3.14";
|
|
23
23
|
export declare const deno = "2.9.5";
|
|
24
24
|
export declare const node: {
|
|
@@ -40,6 +40,6 @@ export declare const actions: {
|
|
|
40
40
|
readonly 'oven-sh/setup-bun': 'v2.2.0';
|
|
41
41
|
readonly 'bytecodealliance/actions/wasmtime/setup': 'v1.1.3';
|
|
42
42
|
readonly 'wasmerio/setup-wasmer': 'v3.1';
|
|
43
|
-
readonly 'cachix/install-nix-action': 'v31.11.
|
|
43
|
+
readonly 'cachix/install-nix-action': 'v31.11.1';
|
|
44
44
|
readonly 'dtolnay/rust-toolchain': '1.97.1';
|
|
45
45
|
};
|
|
@@ -25,7 +25,7 @@ export const images = /** @type {const} */({
|
|
|
25
25
|
// published FunctionalScript release; do not tie it to package.json's current
|
|
26
26
|
// in-repo version.
|
|
27
27
|
// https://www.npmjs.com/package/functionalscript
|
|
28
|
-
export const functionalscript = /** @type {const} */ '0.
|
|
28
|
+
export const functionalscript = /** @type {const} */ '0.44.0'
|
|
29
29
|
|
|
30
30
|
// https://bun.sh/
|
|
31
31
|
export const bun = '1.3.14'
|
|
@@ -83,7 +83,7 @@ export const actions = /** @type {const} */({
|
|
|
83
83
|
'wasmerio/setup-wasmer': 'v3.1',
|
|
84
84
|
// https://github.com/marketplace/actions/install-nix
|
|
85
85
|
// Enables the `nix-command` and `flakes` experimental features by default.
|
|
86
|
-
'cachix/install-nix-action': 'v31.11.
|
|
86
|
+
'cachix/install-nix-action': 'v31.11.1',
|
|
87
87
|
// https://rust-lang.org/ - value is Rust version, not action version
|
|
88
88
|
'dtolnay/rust-toolchain': '1.97.1',
|
|
89
89
|
})
|
package/fjs/ci/nix/proof.f.d.mts
CHANGED
package/fjs/ci/nix/proof.f.mjs
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Proofs for generated CI flakes.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
|
+
*
|
|
6
|
+
* @import { NixJob } from './types.ts'
|
|
5
7
|
*/
|
|
6
8
|
|
|
7
|
-
/** @import { NixJob } from './types.ts' */
|
|
8
|
-
|
|
9
9
|
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
10
10
|
import { step } from '../../effects/module.f.mjs'
|
|
11
11
|
import { readUtf8File } from '../../effects/node/module.f.mjs'
|
package/fjs/ci/proof.f.d.mts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { MetaStep, Os, GitHubAction } from './common/types.ts'
|
|
3
|
+
* @import { Dir, State } from '../effects/node/virtual/types.ts'
|
|
4
|
+
*/
|
|
3
5
|
export declare const proof: {
|
|
4
6
|
matrixShape: () => void;
|
|
5
7
|
rust: () => void;
|
package/fjs/ci/proof.f.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { MetaStep, Os, GitHubAction } from './common/types.ts'
|
|
3
|
+
* @import { Dir, State } from '../effects/node/virtual/types.ts'
|
|
4
|
+
*/
|
|
3
5
|
|
|
4
6
|
import { ci, main } from './module.f.mjs'
|
|
5
7
|
import { functionalscript, node } from './config/module.f.mjs'
|
|
@@ -11,7 +13,6 @@ import { assert, assertEq } from '../asserts/module.f.mjs'
|
|
|
11
13
|
import { emptyState, virtual } from '../effects/node/virtual/module.f.mjs'
|
|
12
14
|
import { unwrap } from '../types/result/module.f.mjs'
|
|
13
15
|
import { definedValues } from '../types/object/module.f.mjs'
|
|
14
|
-
|
|
15
16
|
import { parse as jsonParse } from '../media/json/module.f.mjs'
|
|
16
17
|
|
|
17
18
|
/** @type {(cmd: string) => (gha: GitHubAction) => boolean} */
|
package/fjs/cli/proof.f.d.mts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeOp, NodeProgramOptions } from '../effects/node/types.ts'
|
|
3
|
+
* @import { Commands } from './types.ts'
|
|
4
|
+
*/
|
|
3
5
|
export declare const proof: {
|
|
4
6
|
knownCommand: () => void;
|
|
5
7
|
alias: () => void;
|
package/fjs/cli/proof.f.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @import { NodeOp, NodeProgramOptions } from '../effects/node/types.ts'
|
|
3
|
+
* @import { Commands } from './types.ts'
|
|
4
|
+
*/
|
|
3
5
|
|
|
4
6
|
import { pure } from '../effects/module.f.mjs'
|
|
5
7
|
import { defaultNodeProgramOptions, emptyState, virtual } from '../effects/node/virtual/module.f.mjs'
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Monoids: the `Monoid<T>` algebraic structure (identity plus associative
|
|
3
3
|
* binary operation), `repeat`, which applies the operation `n` times using
|
|
4
4
|
* exponentiation by squaring, and `fold`, which applies it across every element
|
|
5
|
-
* of a list.
|
|
5
|
+
* of a list as a balanced binary tree.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*
|
|
9
|
-
* @import { Fold } from '../../types/function/operator/types.ts'
|
|
10
|
-
* @import { List } from '../../types/list/types.ts'
|
|
11
|
-
* @import { Monoid } from './types.ts'
|
|
9
|
+
* @import { Fold, Reduce } from '../../types/function/operator/types.ts'
|
|
10
|
+
* @import { Accumulator, List } from '../../types/list/types.ts'
|
|
11
|
+
* @import { Absorbing, Monoid } from './types.ts'
|
|
12
12
|
*/
|
|
13
13
|
import type { Fold } from '../../types/function/operator/types.ts';
|
|
14
14
|
import type { List } from '../../types/list/types.ts';
|
|
15
|
-
import type { Monoid } from './types.ts';
|
|
15
|
+
import type { Absorbing, Monoid } from './types.ts';
|
|
16
16
|
/**
|
|
17
17
|
* Repeats a monoid operation `n` times on the given element `a`.
|
|
18
18
|
* This function efficiently performs the operation using exponentiation by squaring.
|
|
@@ -43,6 +43,12 @@ import type { Monoid } from './types.ts';
|
|
|
43
43
|
* ```
|
|
44
44
|
*/
|
|
45
45
|
export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<bigint, T>;
|
|
46
|
+
export type _Run<T> = {
|
|
47
|
+
readonly size: number;
|
|
48
|
+
readonly value: T;
|
|
49
|
+
readonly rest: _Stack<T>;
|
|
50
|
+
};
|
|
51
|
+
export type _Stack<T> = _Run<T> | null;
|
|
46
52
|
/**
|
|
47
53
|
* Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
|
|
48
54
|
* `identity`. An empty list folds to `identity`.
|
|
@@ -54,12 +60,26 @@ export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<big
|
|
|
54
60
|
* so the identity paired with each operation is stated once at the call site
|
|
55
61
|
* instead of hand-seeding a raw `reduce`.
|
|
56
62
|
*
|
|
57
|
-
*
|
|
58
|
-
* `
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
+
* The reduction is **balanced**, not a left fold: `[a, b, c, d]` folds to
|
|
64
|
+
* `(a op b) op (c op d)`, not `((a op b) op c) op d`. A `Monoid`'s
|
|
65
|
+
* associativity is what licenses the re-grouping — `list.reduce` takes an
|
|
66
|
+
* arbitrary operation with no such contract and therefore stays strictly
|
|
67
|
+
* left-to-right. Balancing matters for size-growing exact operations
|
|
68
|
+
* (`bigint.product`, `string`/`bit_vec` concatenation): a left fold grows the
|
|
69
|
+
* accumulator while every new operand stays small, so step *k* costs work
|
|
70
|
+
* proportional to *k* and the total is O(n²), while merging runs of comparable
|
|
71
|
+
* size costs O(n log n). It is the list-shaped sibling of {@link repeat}'s
|
|
72
|
+
* exponentiation by squaring.
|
|
73
|
+
*
|
|
74
|
+
* Only the grouping changes, never the order: each merge keeps the earlier
|
|
75
|
+
* operand on the left, so `fold` stays correct for non-commutative monoids
|
|
76
|
+
* (e.g. string concatenation as `a => b => a + b`).
|
|
77
|
+
*
|
|
78
|
+
* Re-grouping does move the rounding of an inexact operation. IEEE-754 addition
|
|
79
|
+
* is not truly associative, so `number.sum` returns a (marginally more
|
|
80
|
+
* accurate — O(log n · ε) instead of O(n · ε)) different value than a left fold
|
|
81
|
+
* for some inputs. That is a consequence of the uniform treatment, not a goal:
|
|
82
|
+
* a `Monoid` promises associativity, and every monoid folds the same way.
|
|
63
83
|
*
|
|
64
84
|
* @template T The type of the elements in the monoid.
|
|
65
85
|
* @param {Monoid<T>} monoid The monoid structure, including the identity and binary operation.
|
|
@@ -84,4 +104,42 @@ export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<big
|
|
|
84
104
|
* fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
|
|
85
105
|
* ```
|
|
86
106
|
*/
|
|
87
|
-
export declare const fold: <T>(
|
|
107
|
+
export declare const fold: <T>(monoid: Monoid<T>) => (list: List<T>) => T;
|
|
108
|
+
/**
|
|
109
|
+
* {@link fold} for a monoid with an absorbing element, stopping at the first
|
|
110
|
+
* element that reaches it.
|
|
111
|
+
*
|
|
112
|
+
* The result is the same as `fold`'s — combining `absorbing` with the rest of
|
|
113
|
+
* the list is `absorbing` again — but the rest of the list is never read. That
|
|
114
|
+
* is what makes it usable on an unbounded lazy `List`, where `fold` keeps
|
|
115
|
+
* pulling elements forever after the answer is already decided.
|
|
116
|
+
*
|
|
117
|
+
* It stops as soon as a **run** reaches `absorbing`: immediately when an element
|
|
118
|
+
* is absorbing on its own (`0` in a product), otherwise at the merge that first
|
|
119
|
+
* produces it. When only a combination is absorbing — `bit_vec`'s length cap —
|
|
120
|
+
* that merge can lag the element that actually decided the answer, because runs
|
|
121
|
+
* merge at power-of-two boundaries: at most one doubling, so under twice as many
|
|
122
|
+
* elements as a left fold's per-element check would read. Bounded either way,
|
|
123
|
+
* which is the property that matters against an unbounded list.
|
|
124
|
+
*
|
|
125
|
+
* Grouping, order, and the `log2(n)` stack bound are `fold`'s; only the walk
|
|
126
|
+
* gains an exit. `foldAbsorbing(a)(list)` and `fold(a.monoid)(list)` agree on
|
|
127
|
+
* every finite list, including one whose folded value is itself `null`.
|
|
128
|
+
*
|
|
129
|
+
* @template T The type of the elements in the monoid.
|
|
130
|
+
* @param {Absorbing<T>} absorbing The monoid together with its absorbing element.
|
|
131
|
+
* @returns {(list: List<T>) => T} A function that reduces a `List<T>` to a single `T`.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
*
|
|
135
|
+
* ```ts
|
|
136
|
+
* const multiply: Absorbing<number> = {
|
|
137
|
+
* monoid: { identity: 1, operation: a => b => a * b },
|
|
138
|
+
* absorbing: 0,
|
|
139
|
+
* }
|
|
140
|
+
*
|
|
141
|
+
* foldAbsorbing(multiply)([2, 3, 4]) // 24
|
|
142
|
+
* foldAbsorbing(multiply)([2, 0, 4]) // 0 — `4` is never read
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export declare const foldAbsorbing: <T>({ monoid, absorbing }: Absorbing<T>) => (list: List<T>) => T;
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
* Monoids: the `Monoid<T>` algebraic structure (identity plus associative
|
|
3
3
|
* binary operation), `repeat`, which applies the operation `n` times using
|
|
4
4
|
* exponentiation by squaring, and `fold`, which applies it across every element
|
|
5
|
-
* of a list.
|
|
5
|
+
* of a list as a balanced binary tree.
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*
|
|
9
|
-
* @import { Fold } from '../../types/function/operator/types.ts'
|
|
10
|
-
* @import { List } from '../../types/list/types.ts'
|
|
11
|
-
* @import { Monoid } from './types.ts'
|
|
9
|
+
* @import { Fold, Reduce } from '../../types/function/operator/types.ts'
|
|
10
|
+
* @import { Accumulator, List } from '../../types/list/types.ts'
|
|
11
|
+
* @import { Absorbing, Monoid } from './types.ts'
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { fold as listFold, tryFold } from '../../types/list/module.f.mjs'
|
|
15
|
+
import { compose } from '../../types/function/module.f.mjs'
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Repeats a monoid operation `n` times on the given element `a`.
|
|
@@ -59,6 +59,72 @@ export const repeat = ({ identity, operation }) => n => a => {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* A run of `size` already-combined elements. Runs live on a stack whose top is
|
|
64
|
+
* the most recent — and smallest — run, so `rest` holds everything to the left
|
|
65
|
+
* of `value`.
|
|
66
|
+
*
|
|
67
|
+
* @template T
|
|
68
|
+
* @typedef {{
|
|
69
|
+
* readonly size: number
|
|
70
|
+
* readonly value: T
|
|
71
|
+
* readonly rest: _Stack<T>
|
|
72
|
+
* }} _Run
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A stack of runs, `null` when empty.
|
|
77
|
+
*
|
|
78
|
+
* @template T
|
|
79
|
+
* @typedef {_Run<T> | null} _Stack
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Pushes a run of `size` combined elements onto the stack, merging while the
|
|
84
|
+
* top run has the same size — exactly the carry of incrementing a binary
|
|
85
|
+
* counter, so every merge joins two runs of equal size and the stack never
|
|
86
|
+
* holds more than `log2(n)` runs.
|
|
87
|
+
*
|
|
88
|
+
* The merge keeps the earlier run on the left (`operation(stack.value)(value)`),
|
|
89
|
+
* so re-associating never re-orders.
|
|
90
|
+
*
|
|
91
|
+
* The result is always a run, never the empty stack — which is what lets
|
|
92
|
+
* {@link absorbingAccumulator} read `null` as a stop signal rather than a state.
|
|
93
|
+
*
|
|
94
|
+
* @type {<T>(operation: Reduce<T>) => (size: number) => (value: T) => (stack: _Stack<T>) => _Run<T>}
|
|
95
|
+
*/
|
|
96
|
+
const push = operation => size => value => stack =>
|
|
97
|
+
stack === null || stack.size !== size
|
|
98
|
+
? { size, value, rest: stack }
|
|
99
|
+
: push(operation)(size * 2)(operation(stack.value)(value))(stack.rest)
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* `push` seeded for a single element — the step both {@link fold} and
|
|
103
|
+
* {@link absorbingAccumulator} walk a list with.
|
|
104
|
+
*
|
|
105
|
+
* @type {<T>(operation: Reduce<T>) => (value: T) => (stack: _Stack<T>) => _Run<T>}
|
|
106
|
+
*/
|
|
107
|
+
const step = operation => push(operation)(1)
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* {@link step} seen as the {@link Fold} `list.fold` takes: the same function,
|
|
111
|
+
* with its result widened from a run to the stack `list.fold` threads.
|
|
112
|
+
*
|
|
113
|
+
* @type {<T>(operation: Reduce<T>) => Fold<T, _Stack<T>>}
|
|
114
|
+
*/
|
|
115
|
+
const foldStep = step
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Combines the stack's runs into one value, earliest (bottom, largest) first,
|
|
119
|
+
* seeded at `identity`.
|
|
120
|
+
*
|
|
121
|
+
* @type {<T>(monoid: Monoid<T>) => (stack: _Stack<T>) => T}
|
|
122
|
+
*/
|
|
123
|
+
const combine = monoid => stack =>
|
|
124
|
+
stack === null
|
|
125
|
+
? monoid.identity
|
|
126
|
+
: monoid.operation(combine(monoid)(stack.rest))(stack.value)
|
|
127
|
+
|
|
62
128
|
/**
|
|
63
129
|
* Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
|
|
64
130
|
* `identity`. An empty list folds to `identity`.
|
|
@@ -70,12 +136,26 @@ export const repeat = ({ identity, operation }) => n => a => {
|
|
|
70
136
|
* so the identity paired with each operation is stated once at the call site
|
|
71
137
|
* instead of hand-seeding a raw `reduce`.
|
|
72
138
|
*
|
|
73
|
-
*
|
|
74
|
-
* `
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
139
|
+
* The reduction is **balanced**, not a left fold: `[a, b, c, d]` folds to
|
|
140
|
+
* `(a op b) op (c op d)`, not `((a op b) op c) op d`. A `Monoid`'s
|
|
141
|
+
* associativity is what licenses the re-grouping — `list.reduce` takes an
|
|
142
|
+
* arbitrary operation with no such contract and therefore stays strictly
|
|
143
|
+
* left-to-right. Balancing matters for size-growing exact operations
|
|
144
|
+
* (`bigint.product`, `string`/`bit_vec` concatenation): a left fold grows the
|
|
145
|
+
* accumulator while every new operand stays small, so step *k* costs work
|
|
146
|
+
* proportional to *k* and the total is O(n²), while merging runs of comparable
|
|
147
|
+
* size costs O(n log n). It is the list-shaped sibling of {@link repeat}'s
|
|
148
|
+
* exponentiation by squaring.
|
|
149
|
+
*
|
|
150
|
+
* Only the grouping changes, never the order: each merge keeps the earlier
|
|
151
|
+
* operand on the left, so `fold` stays correct for non-commutative monoids
|
|
152
|
+
* (e.g. string concatenation as `a => b => a + b`).
|
|
153
|
+
*
|
|
154
|
+
* Re-grouping does move the rounding of an inexact operation. IEEE-754 addition
|
|
155
|
+
* is not truly associative, so `number.sum` returns a (marginally more
|
|
156
|
+
* accurate — O(log n · ε) instead of O(n · ε)) different value than a left fold
|
|
157
|
+
* for some inputs. That is a consequence of the uniform treatment, not a goal:
|
|
158
|
+
* a `Monoid` promises associativity, and every monoid folds the same way.
|
|
79
159
|
*
|
|
80
160
|
* @template T The type of the elements in the monoid.
|
|
81
161
|
* @param {Monoid<T>} monoid The monoid structure, including the identity and binary operation.
|
|
@@ -100,5 +180,88 @@ export const repeat = ({ identity, operation }) => n => a => {
|
|
|
100
180
|
* fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
|
|
101
181
|
* ```
|
|
102
182
|
*/
|
|
103
|
-
export const fold =
|
|
104
|
-
|
|
183
|
+
export const fold = monoid =>
|
|
184
|
+
compose(listFold(foldStep(monoid.operation))(null))(combine(monoid))
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* The run stack as a short-circuiting {@link Accumulator}: `update` returns
|
|
188
|
+
* `null` — `tryFold`'s stop signal — as soon as a merge produces the absorbing
|
|
189
|
+
* element.
|
|
190
|
+
*
|
|
191
|
+
* Only the newest run can be `absorbing`: an earlier one would have stopped the
|
|
192
|
+
* walk already.
|
|
193
|
+
*
|
|
194
|
+
* `end` wraps the folded value in a one-element tuple because `tryFold` reports
|
|
195
|
+
* both "stopped" and "finished with this result" through the same
|
|
196
|
+
* `Nullable<R>`: a monoid whose `T` includes `null` would otherwise be unable to
|
|
197
|
+
* tell a completed fold that produced `null` from an abandoned walk. The tuple
|
|
198
|
+
* costs one allocation per fold, not per element.
|
|
199
|
+
*/
|
|
200
|
+
const absorbingAccumulator =
|
|
201
|
+
/**
|
|
202
|
+
* @template T
|
|
203
|
+
* @param {Monoid<T>} monoid
|
|
204
|
+
*/
|
|
205
|
+
monoid => {
|
|
206
|
+
const p = step(monoid.operation)
|
|
207
|
+
const c = combine(monoid)
|
|
208
|
+
/**
|
|
209
|
+
* @param {T} absorbing
|
|
210
|
+
* @returns {Accumulator<T, _Stack<T>, readonly[T]>}
|
|
211
|
+
*/
|
|
212
|
+
return absorbing => ({
|
|
213
|
+
init: null,
|
|
214
|
+
update: (value, stack) => {
|
|
215
|
+
const next = p(value)(stack)
|
|
216
|
+
return next.value === absorbing ? null : next
|
|
217
|
+
},
|
|
218
|
+
end: stack => [c(stack)],
|
|
219
|
+
})
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* {@link fold} for a monoid with an absorbing element, stopping at the first
|
|
224
|
+
* element that reaches it.
|
|
225
|
+
*
|
|
226
|
+
* The result is the same as `fold`'s — combining `absorbing` with the rest of
|
|
227
|
+
* the list is `absorbing` again — but the rest of the list is never read. That
|
|
228
|
+
* is what makes it usable on an unbounded lazy `List`, where `fold` keeps
|
|
229
|
+
* pulling elements forever after the answer is already decided.
|
|
230
|
+
*
|
|
231
|
+
* It stops as soon as a **run** reaches `absorbing`: immediately when an element
|
|
232
|
+
* is absorbing on its own (`0` in a product), otherwise at the merge that first
|
|
233
|
+
* produces it. When only a combination is absorbing — `bit_vec`'s length cap —
|
|
234
|
+
* that merge can lag the element that actually decided the answer, because runs
|
|
235
|
+
* merge at power-of-two boundaries: at most one doubling, so under twice as many
|
|
236
|
+
* elements as a left fold's per-element check would read. Bounded either way,
|
|
237
|
+
* which is the property that matters against an unbounded list.
|
|
238
|
+
*
|
|
239
|
+
* Grouping, order, and the `log2(n)` stack bound are `fold`'s; only the walk
|
|
240
|
+
* gains an exit. `foldAbsorbing(a)(list)` and `fold(a.monoid)(list)` agree on
|
|
241
|
+
* every finite list, including one whose folded value is itself `null`.
|
|
242
|
+
*
|
|
243
|
+
* @template T The type of the elements in the monoid.
|
|
244
|
+
* @param {Absorbing<T>} absorbing The monoid together with its absorbing element.
|
|
245
|
+
* @returns {(list: List<T>) => T} A function that reduces a `List<T>` to a single `T`.
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
*
|
|
249
|
+
* ```ts
|
|
250
|
+
* const multiply: Absorbing<number> = {
|
|
251
|
+
* monoid: { identity: 1, operation: a => b => a * b },
|
|
252
|
+
* absorbing: 0,
|
|
253
|
+
* }
|
|
254
|
+
*
|
|
255
|
+
* foldAbsorbing(multiply)([2, 3, 4]) // 24
|
|
256
|
+
* foldAbsorbing(multiply)([2, 0, 4]) // 0 — `4` is never read
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
export const foldAbsorbing = ({ monoid, absorbing }) => {
|
|
260
|
+
const f = tryFold(absorbingAccumulator(monoid)(absorbing))
|
|
261
|
+
return list => {
|
|
262
|
+
const result = f(list)
|
|
263
|
+
if (result === null) { return absorbing }
|
|
264
|
+
const [value] = result
|
|
265
|
+
return value
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { List } from '../../types/list/types.ts'
|
|
3
|
+
* @import { Nullable } from '../../types/nullable/types.ts'
|
|
4
|
+
* @import { Absorbing, Monoid } from './types.ts'
|
|
5
|
+
*/
|
|
2
6
|
export declare const proof: {
|
|
3
7
|
numberAdd: () => void;
|
|
4
8
|
stringConcat: () => void;
|
|
@@ -6,5 +10,12 @@ export declare const proof: {
|
|
|
6
10
|
nonEmpty: () => void;
|
|
7
11
|
order: () => void;
|
|
8
12
|
empty: () => void;
|
|
13
|
+
balanced: () => void;
|
|
14
|
+
};
|
|
15
|
+
foldAbsorbing: {
|
|
16
|
+
plain: () => void;
|
|
17
|
+
absorbed: () => void;
|
|
18
|
+
nullValued: () => void;
|
|
19
|
+
stopsEarly: () => void;
|
|
9
20
|
};
|
|
10
21
|
};
|
|
@@ -1,7 +1,20 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { List } from '../../types/list/types.ts'
|
|
3
|
+
* @import { Nullable } from '../../types/nullable/types.ts'
|
|
4
|
+
* @import { Absorbing, Monoid } from './types.ts'
|
|
5
|
+
*/
|
|
2
6
|
|
|
3
|
-
import { repeat, fold } from './module.f.mjs'
|
|
4
|
-
import { assertEq } from '../../asserts/module.f.mjs'
|
|
7
|
+
import { repeat, fold, foldAbsorbing } from './module.f.mjs'
|
|
8
|
+
import { assert, assertEq } from '../../asserts/module.f.mjs'
|
|
9
|
+
|
|
10
|
+
/** @type {Absorbing<number>} */
|
|
11
|
+
const multiply = {
|
|
12
|
+
monoid: {
|
|
13
|
+
identity: 1,
|
|
14
|
+
operation: a => b => a * b,
|
|
15
|
+
},
|
|
16
|
+
absorbing: 0,
|
|
17
|
+
}
|
|
5
18
|
|
|
6
19
|
export const proof = {
|
|
7
20
|
numberAdd: () => {
|
|
@@ -54,5 +67,76 @@ export const proof = {
|
|
|
54
67
|
// an empty list folds to the identity
|
|
55
68
|
assertEq(fold(concat)([]), '')
|
|
56
69
|
},
|
|
57
|
-
|
|
70
|
+
balanced: () => {
|
|
71
|
+
// `operation` brackets each combination so the *grouping* `fold`
|
|
72
|
+
// chose is visible in the result. It is deliberately **not**
|
|
73
|
+
// associative — a lawful monoid could not observe the grouping at
|
|
74
|
+
// all, which is exactly why re-associating is allowed. The identity
|
|
75
|
+
// still behaves as one (both branches return the other operand
|
|
76
|
+
// unchanged), so `fold`'s contract is respected.
|
|
77
|
+
/** @type {Monoid<string>} */
|
|
78
|
+
const bracket = {
|
|
79
|
+
identity: '',
|
|
80
|
+
operation: a => b => a === '' ? b : b === '' ? a : `(${a}${b})`,
|
|
81
|
+
}
|
|
82
|
+
const f = fold(bracket)
|
|
83
|
+
assertEq(f(['a']), 'a')
|
|
84
|
+
assertEq(f(['a', 'b']), '(ab)')
|
|
85
|
+
// three elements keep the trailing run separate: `c` merges with
|
|
86
|
+
// nothing, so it combines against `(ab)` only at the end.
|
|
87
|
+
assertEq(f(['a', 'b', 'c']), '((ab)c)')
|
|
88
|
+
// four is where balancing separates from a left fold, which would
|
|
89
|
+
// give `(((ab)c)d)`.
|
|
90
|
+
assertEq(f(['a', 'b', 'c', 'd']), '((ab)(cd))')
|
|
91
|
+
assertEq(f(['a', 'b', 'c', 'd', 'e']), '(((ab)(cd))e)')
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
foldAbsorbing: {
|
|
95
|
+
plain: () => {
|
|
96
|
+
// with no absorbing element in the list, it is `fold`
|
|
97
|
+
assertEq(foldAbsorbing(multiply)([2, 3, 4]), 24)
|
|
98
|
+
assertEq(foldAbsorbing(multiply)([]), 1)
|
|
99
|
+
assertEq(foldAbsorbing(multiply)([2, 3, 4]), fold(multiply.monoid)([2, 3, 4]))
|
|
100
|
+
},
|
|
101
|
+
absorbed: () => {
|
|
102
|
+
assertEq(foldAbsorbing(multiply)([2, 0, 4]), 0)
|
|
103
|
+
},
|
|
104
|
+
nullValued: () => {
|
|
105
|
+
// `min` over non-negative numbers, where `null` is the identity
|
|
106
|
+
// (+infinity) and `0` is the absorbing element. `T` therefore
|
|
107
|
+
// includes `null` without `null` being the stop condition — and
|
|
108
|
+
// `tryFold` signals "stopped" and "finished" through one
|
|
109
|
+
// `Nullable`, so a completed fold whose value is `null` must not be
|
|
110
|
+
// read as an abandoned walk.
|
|
111
|
+
/** @type {Absorbing<Nullable<number>>} */
|
|
112
|
+
const min = {
|
|
113
|
+
monoid: {
|
|
114
|
+
identity: null,
|
|
115
|
+
operation: a => b =>
|
|
116
|
+
a === null ? b : b === null ? a : a <= b ? a : b,
|
|
117
|
+
},
|
|
118
|
+
absorbing: 0,
|
|
119
|
+
}
|
|
120
|
+
assertEq(foldAbsorbing(min)([]), null)
|
|
121
|
+
assertEq(foldAbsorbing(min)([3, null, 5]), 3)
|
|
122
|
+
assertEq(foldAbsorbing(min)([3, 0, 5]), 0)
|
|
123
|
+
},
|
|
124
|
+
stopsEarly: () => {
|
|
125
|
+
// `List` includes `Thunk`, so this list is unbounded: `fold` would
|
|
126
|
+
// pull from it forever. The elements past the absorbing one assert
|
|
127
|
+
// that they are never read.
|
|
128
|
+
/** @type {(n: number) => List<number>} */
|
|
129
|
+
const rest = n => () => {
|
|
130
|
+
assert(false)
|
|
131
|
+
return { first: n, tail: rest(n + 1) }
|
|
132
|
+
}
|
|
133
|
+
// `0` is absorbing on its own, so the walk stops at the element
|
|
134
|
+
// itself...
|
|
135
|
+
assertEq(foldAbsorbing(multiply)({ first: 0, tail: rest(1) }), 0)
|
|
136
|
+
// ...and here only the merge of `2` and `0` reaches it.
|
|
137
|
+
assertEq(
|
|
138
|
+
foldAbsorbing(multiply)({ first: 2, tail: { first: 0, tail: rest(1) } }),
|
|
139
|
+
0)
|
|
140
|
+
},
|
|
141
|
+
},
|
|
58
142
|
}
|
|
@@ -48,3 +48,26 @@ export type Monoid<T> = {
|
|
|
48
48
|
readonly identity: T;
|
|
49
49
|
readonly operation: Reduce<T>;
|
|
50
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* A monoid that additionally has an
|
|
53
|
+
* {@link https://en.wikipedia.org/wiki/Absorbing_element absorbing element}
|
|
54
|
+
* (also called a zero or annihilator): a value that swallows the operation
|
|
55
|
+
* from either side.
|
|
56
|
+
*
|
|
57
|
+
* For all `a`: `operation(absorbing)(a) = operation(a)(absorbing) = absorbing`.
|
|
58
|
+
*
|
|
59
|
+
* Once a fold reaches `absorbing`, the result is decided — every remaining
|
|
60
|
+
* element combines to `absorbing` again — so `foldAbsorbing` may stop reading
|
|
61
|
+
* the list there instead of walking to its end. That is the difference between
|
|
62
|
+
* answering and not returning at all when the list is an unbounded `Thunk`.
|
|
63
|
+
*
|
|
64
|
+
* Multiplication over numbers has `0`; `bit_vec`'s length-capped concatenation
|
|
65
|
+
* has `null`, meaning "longer than `maxLength`".
|
|
66
|
+
*
|
|
67
|
+
* The monoid is carried as a field rather than intersected in, so it stays
|
|
68
|
+
* independently constructed and consumed (`AGENTS.md` §6.2).
|
|
69
|
+
*/
|
|
70
|
+
export type Absorbing<T> = {
|
|
71
|
+
readonly monoid: Monoid<T>;
|
|
72
|
+
readonly absorbing: T;
|
|
73
|
+
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* @import { Point, Curve, Init } from './types.ts'
|
|
3
|
+
*/
|
|
2
4
|
|
|
3
5
|
import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs'
|
|
4
6
|
import { prime_field } from '../../types/prime_field/module.f.mjs'
|