functionalscript 0.2.5 → 0.3.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/.github/workflows/ci.yml +19 -4
- package/CHANGELOG.md +9 -0
- package/com/cpp/{module.f.mjs → module.f.ts} +65 -44
- package/com/cpp/{test.f.mjs → test.f.ts} +1 -1
- package/com/cpp/testlib.f.ts +8 -0
- package/com/cs/{module.f.mjs → module.f.ts} +47 -38
- package/com/cs/{test.f.mjs → test.f.ts} +2 -2
- package/com/cs/testlib.f.ts +8 -0
- package/com/rust/module.f.ts +287 -0
- package/com/rust/{test.f.mjs → test.f.ts} +1 -1
- package/com/rust/testlib.f.ts +8 -0
- package/com/test/{build.f.mjs → build.f.ts} +47 -45
- package/com/test/{build.mjs → build.ts} +7 -6
- package/com/types/module.f.ts +62 -0
- package/com/types/{testlib.f.mjs → testlib.f.ts} +2 -3
- package/commonjs/build/module.f.ts +100 -0
- package/commonjs/build/{test.f.mjs → test.f.ts} +21 -17
- package/commonjs/module/function/module.f.ts +13 -0
- package/commonjs/module/module.f.ts +41 -0
- package/commonjs/module.f.ts +7 -0
- package/commonjs/{module.mjs → module.ts} +12 -9
- package/commonjs/package/dependencies/module.f.ts +22 -0
- package/commonjs/package/dependencies/{test.f.mjs → test.f.ts} +1 -1
- package/commonjs/package/module.f.ts +31 -0
- package/commonjs/package/{test.f.mjs → test.f.ts} +1 -1
- package/commonjs/path/{module.f.mjs → module.f.ts} +72 -67
- package/commonjs/path/{test.f.mjs → test.f.ts} +25 -19
- package/commonjs/{test.mjs → test.ts} +5 -4
- package/crypto/prime_field/{module.f.mjs → module.f.ts} +40 -37
- package/crypto/prime_field/{test.f.mjs → test.f.ts} +7 -5
- package/crypto/secp/{module.f.mjs → module.f.ts} +44 -44
- package/crypto/secp/{test.f.mjs → test.f.ts} +16 -11
- package/crypto/sha2/{module.f.mjs → module.f.ts} +61 -46
- package/crypto/sha2/{test.f.mjs → test.f.ts} +12 -9
- package/deno.json +71 -0
- package/dev/README.md +8 -0
- package/dev/index.ts +3 -0
- package/dev/{module.f.mjs → module.f.ts} +0 -2
- package/dev/{module.mjs → module.ts} +65 -60
- package/dev/test/{module.f.mjs → module.f.ts} +57 -70
- package/dev/{test.f.mjs → test.f.ts} +7 -5
- package/dev/test.ts +53 -0
- package/djs/{module.f.mjs → module.f.ts} +31 -31
- package/djs/parser/{module.f.mjs → module.f.ts} +190 -182
- package/djs/parser/{test.f.mjs → test.f.ts} +173 -150
- package/djs/serializer/module.f.ts +90 -0
- package/djs/{test.f.mjs → test.f.ts} +4 -4
- package/djs/tokenizer/{module.f.mjs → module.f.ts} +35 -42
- package/djs/tokenizer/{test.f.mjs → test.f.ts} +9 -8
- package/fsc/{module.f.mjs → module.f.ts} +41 -44
- package/fsc/{test.f.mjs → test.f.ts} +8 -6
- package/fsm/module.f.ts +107 -0
- package/fsm/{test.f.mjs → test.f.ts} +10 -9
- package/html/README.md +10 -9
- package/html/module.f.ts +108 -0
- package/html/{test.f.mjs → test.f.ts} +10 -7
- package/issues/README.md +3 -0
- package/issues/lang/3110-function.md +25 -1
- package/issues/{test.f.mjs → test.f.ts} +3 -2
- package/js/tokenizer/module.f.ts +882 -0
- package/js/tokenizer/{test.f.mjs → test.f.ts} +11 -10
- package/json/module.f.ts +94 -0
- package/json/parser/{module.f.mjs → module.f.ts} +113 -109
- package/json/parser/{test.f.mjs → test.f.ts} +10 -9
- package/json/serializer/module.f.ts +70 -0
- package/json/serializer/{test.f.mjs → test.f.ts} +3 -3
- package/json/{test.f.mjs → test.f.ts} +3 -3
- package/json/tokenizer/{module.f.mjs → module.f.ts} +29 -36
- package/json/tokenizer/{test.f.mjs → test.f.ts} +9 -8
- package/nanvm-lib/src/extension.rs +15 -4
- package/nanvm-lib/src/interface.rs +7 -10
- package/nanvm-lib/src/lib.rs +3 -3
- package/nanvm-lib/src/naive.rs +10 -3
- package/nanvm-lib/src/nanenum.rs +5 -1
- package/nanvm-lib/tests/{test.f.mjs → test.f.ts} +7 -6
- package/nodejs/version/{main.mjs → main.ts} +1 -1
- package/nodejs/version/module.f.ts +42 -0
- package/nodejs/version/{test.f.mjs → test.f.ts} +11 -12
- package/package.json +9 -9
- package/text/ascii/{module.f.mjs → module.f.ts} +10 -8
- package/text/ascii/{test.f.mjs → test.f.ts} +4 -4
- package/text/module.f.ts +30 -0
- package/text/sgr/{module.f.mjs → module.f.ts} +3 -5
- package/text/{test.f.mjs → test.f.ts} +5 -4
- package/text/utf16/module.f.ts +108 -0
- package/text/utf16/{test.f.mjs → test.f.ts} +7 -6
- package/text/utf8/{module.f.mjs → module.f.ts} +29 -23
- package/text/utf8/{test.f.mjs → test.f.ts} +4 -4
- package/tsconfig.json +4 -1
- package/types/array/module.f.ts +89 -0
- package/types/array/{test.f.mjs → test.f.ts} +3 -3
- package/types/bigfloat/{module.f.mjs → module.f.ts} +25 -20
- package/types/bigfloat/{test.f.mjs → test.f.ts} +1 -1
- package/types/bigint/{module.f.mjs → module.f.ts} +29 -28
- package/types/bigint/{test.f.mjs → test.f.ts} +2 -2
- package/types/bit_vec/README.md +18 -0
- package/types/bit_vec/module.f.ts +185 -0
- package/types/bit_vec/test.f.ts +129 -0
- package/types/btree/find/module.f.ts +92 -0
- package/types/btree/find/{test.f.mjs → test.f.ts} +20 -16
- package/types/btree/{module.f.mjs → module.f.ts} +9 -9
- package/types/btree/remove/{module.f.mjs → module.f.ts} +43 -53
- package/types/btree/remove/{test.f.mjs → test.f.ts} +19 -15
- package/types/btree/set/{module.f.mjs → module.f.ts} +17 -20
- package/types/btree/set/{test.f.mjs → test.f.ts} +96 -66
- package/types/btree/{test.f.mjs → test.f.ts} +34 -26
- package/types/btree/types/module.f.ts +27 -0
- package/types/byte_set/module.f.ts +70 -0
- package/types/byte_set/{test.f.mjs → test.f.ts} +8 -7
- package/types/function/compare/module.f.ts +26 -0
- package/types/function/compare/{test.f.mjs → test.f.ts} +1 -1
- package/types/function/module.f.ts +43 -0
- package/types/function/operator/module.f.ts +63 -0
- package/types/function/test.f.ts +20 -0
- package/types/list/module.f.ts +345 -0
- package/types/list/{test.f.mjs → test.f.ts} +30 -24
- package/types/map/module.f.ts +65 -0
- package/types/map/{test.f.mjs → test.f.ts} +6 -5
- package/types/nibble_set/module.f.ts +34 -0
- package/types/nibble_set/{test.f.mjs → test.f.ts} +3 -3
- package/types/nullable/module.f.ts +9 -0
- package/types/nullable/{test.f.mjs → test.f.ts} +2 -2
- package/types/number/module.f.ts +16 -0
- package/types/number/{test.f.mjs → test.f.ts} +7 -5
- package/types/object/module.f.ts +30 -0
- package/types/object/{test.f.mjs → test.f.ts} +2 -2
- package/types/range/module.f.ts +10 -0
- package/types/range/{test.f.mjs → test.f.ts} +1 -1
- package/types/range_map/module.f.ts +70 -0
- package/types/range_map/{test.f.mjs → test.f.ts} +82 -57
- package/types/result/module.f.ts +20 -0
- package/types/result/{module.mjs → module.ts} +4 -3
- package/types/sorted_list/module.f.ts +83 -0
- package/types/sorted_list/{test.f.mjs → test.f.ts} +14 -12
- package/types/sorted_set/module.f.ts +36 -0
- package/types/sorted_set/{test.f.mjs → test.f.ts} +14 -12
- package/types/string/module.f.ts +24 -0
- package/types/string/{test.f.mjs → test.f.ts} +2 -2
- package/types/string_set/module.f.ts +37 -0
- package/types/string_set/{test.f.mjs → test.f.ts} +2 -2
- package/com/cpp/testlib.f.mjs +0 -8
- package/com/cs/testlib.f.mjs +0 -8
- package/com/rust/module.f.mjs +0 -272
- package/com/rust/testlib.f.mjs +0 -8
- package/com/types/module.f.mjs +0 -67
- package/commonjs/build/module.f.mjs +0 -100
- package/commonjs/module/function/module.f.mjs +0 -21
- package/commonjs/module/module.f.mjs +0 -53
- package/commonjs/module.f.mjs +0 -11
- package/commonjs/package/dependencies/module.f.mjs +0 -22
- package/commonjs/package/module.f.mjs +0 -36
- package/dev/index.mjs +0 -3
- package/dev/test.mjs +0 -60
- package/fsm/module.f.mjs +0 -99
- package/html/module.f.mjs +0 -102
- package/js/tokenizer/module.f.mjs +0 -872
- package/json/module.f.mjs +0 -89
- package/json/serializer/module.f.mjs +0 -87
- package/jsr.json +0 -66
- package/nodejs/version/module.f.mjs +0 -47
- package/out/com/cpp/module.f.d.mts +0 -7
- package/out/com/cpp/module.f.mjs +0 -130
- package/out/com/cpp/test.f.d.mts +0 -2
- package/out/com/cpp/test.f.mjs +0 -40
- package/out/com/cpp/testlib.f.d.mts +0 -2
- package/out/com/cpp/testlib.f.mjs +0 -7
- package/out/com/cs/module.f.d.mts +0 -7
- package/out/com/cs/module.f.mjs +0 -104
- package/out/com/cs/test.f.d.mts +0 -2
- package/out/com/cs/test.f.mjs +0 -43
- package/out/com/cs/testlib.f.d.mts +0 -2
- package/out/com/cs/testlib.f.mjs +0 -7
- package/out/com/rust/module.f.d.mts +0 -23
- package/out/com/rust/module.f.mjs +0 -224
- package/out/com/rust/test.f.d.mts +0 -2
- package/out/com/rust/test.f.mjs +0 -123
- package/out/com/rust/testlib.f.d.mts +0 -2
- package/out/com/rust/testlib.f.mjs +0 -7
- package/out/com/test/build.d.mts +0 -1
- package/out/com/test/build.f.d.mts +0 -26
- package/out/com/test/build.f.mjs +0 -98
- package/out/com/test/build.mjs +0 -40
- package/out/com/types/module.f.d.mts +0 -23
- package/out/com/types/module.f.mjs +0 -51
- package/out/com/types/testlib.f.d.mts +0 -44
- package/out/com/types/testlib.f.mjs +0 -30
- package/out/commonjs/build/module.f.d.mts +0 -20
- package/out/commonjs/build/module.f.mjs +0 -107
- package/out/commonjs/build/test.f.d.mts +0 -3
- package/out/commonjs/build/test.f.mjs +0 -102
- package/out/commonjs/module/function/module.f.d.mts +0 -5
- package/out/commonjs/module/function/module.f.mjs +0 -15
- package/out/commonjs/module/module.f.d.mts +0 -52
- package/out/commonjs/module/module.f.mjs +0 -48
- package/out/commonjs/module.d.mts +0 -3
- package/out/commonjs/module.f.d.mts +0 -2
- package/out/commonjs/module.f.mjs +0 -10
- package/out/commonjs/module.mjs +0 -26
- package/out/commonjs/package/dependencies/module.f.d.mts +0 -6
- package/out/commonjs/package/dependencies/module.f.mjs +0 -21
- package/out/commonjs/package/dependencies/test.f.d.mts +0 -2
- package/out/commonjs/package/dependencies/test.f.mjs +0 -15
- package/out/commonjs/package/module.f.d.mts +0 -21
- package/out/commonjs/package/module.f.mjs +0 -40
- package/out/commonjs/package/test.f.d.mts +0 -2
- package/out/commonjs/package/test.f.mjs +0 -27
- package/out/commonjs/path/module.f.d.mts +0 -60
- package/out/commonjs/path/module.f.mjs +0 -171
- package/out/commonjs/path/test.f.d.mts +0 -25
- package/out/commonjs/path/test.f.mjs +0 -231
- package/out/commonjs/test.d.mts +0 -8
- package/out/commonjs/test.mjs +0 -87
- package/out/crypto/prime_field/module.f.d.mts +0 -67
- package/out/crypto/prime_field/module.f.mjs +0 -110
- package/out/crypto/prime_field/test.f.d.mts +0 -13
- package/out/crypto/prime_field/test.f.mjs +0 -152
- package/out/crypto/secp/module.f.d.mts +0 -110
- package/out/crypto/secp/module.f.mjs +0 -173
- package/out/crypto/secp/test.f.d.mts +0 -5
- package/out/crypto/secp/test.f.mjs +0 -78
- package/out/crypto/sha2/module.f.d.mts +0 -15
- package/out/crypto/sha2/module.f.mjs +0 -172
- package/out/crypto/sha2/test.f.d.mts +0 -10
- package/out/crypto/sha2/test.f.mjs +0 -86
- package/out/dev/index.d.mts +0 -1
- package/out/dev/index.mjs +0 -2
- package/out/dev/module.d.mts +0 -26
- package/out/dev/module.f.d.mts +0 -1
- package/out/dev/module.f.mjs +0 -2
- package/out/dev/module.mjs +0 -167
- package/out/dev/test/module.f.d.mts +0 -25
- package/out/dev/test/module.f.mjs +0 -134
- package/out/dev/test.d.mts +0 -3
- package/out/dev/test.f.d.mts +0 -9
- package/out/dev/test.f.mjs +0 -58
- package/out/dev/test.mjs +0 -52
- package/out/djs/module.f.d.mts +0 -20
- package/out/djs/module.f.mjs +0 -79
- package/out/djs/parser/module.f.d.mts +0 -56
- package/out/djs/parser/module.f.mjs +0 -448
- package/out/djs/parser/test.f.d.mts +0 -13
- package/out/djs/parser/test.f.mjs +0 -569
- package/out/djs/test.f.d.mts +0 -12
- package/out/djs/test.f.mjs +0 -84
- package/out/djs/tokenizer/module.f.d.mts +0 -13
- package/out/djs/tokenizer/module.f.mjs +0 -91
- package/out/djs/tokenizer/test.f.d.mts +0 -7
- package/out/djs/tokenizer/test.f.mjs +0 -530
- package/out/fsc/module.f.d.mts +0 -7
- package/out/fsc/module.f.mjs +0 -105
- package/out/fsc/test.f.d.mts +0 -4
- package/out/fsc/test.f.mjs +0 -19
- package/out/fsm/module.f.d.mts +0 -14
- package/out/fsm/module.f.mjs +0 -80
- package/out/fsm/test.f.d.mts +0 -5
- package/out/fsm/test.f.mjs +0 -138
- package/out/html/module.f.d.mts +0 -17
- package/out/html/module.f.mjs +0 -80
- package/out/html/test.f.d.mts +0 -10
- package/out/html/test.f.mjs +0 -45
- package/out/issues/test.f.d.mts +0 -16
- package/out/issues/test.f.mjs +0 -66
- package/out/js/tokenizer/module.f.d.mts +0 -163
- package/out/js/tokenizer/module.f.mjs +0 -729
- package/out/js/tokenizer/test.f.d.mts +0 -9
- package/out/js/tokenizer/test.f.mjs +0 -906
- package/out/json/module.f.d.mts +0 -33
- package/out/json/module.f.mjs +0 -89
- package/out/json/parser/module.f.d.mts +0 -32
- package/out/json/parser/module.f.mjs +0 -224
- package/out/json/parser/test.f.d.mts +0 -5
- package/out/json/parser/test.f.mjs +0 -329
- package/out/json/serializer/module.f.d.mts +0 -36
- package/out/json/serializer/module.f.mjs +0 -67
- package/out/json/serializer/test.f.d.mts +0 -8
- package/out/json/serializer/test.f.mjs +0 -87
- package/out/json/test.f.d.mts +0 -8
- package/out/json/test.f.mjs +0 -61
- package/out/json/tokenizer/module.f.d.mts +0 -13
- package/out/json/tokenizer/module.f.mjs +0 -78
- package/out/json/tokenizer/test.f.d.mts +0 -6
- package/out/json/tokenizer/test.f.mjs +0 -420
- package/out/nanvm-lib/tests/test.f.d.mts +0 -36
- package/out/nanvm-lib/tests/test.f.mjs +0 -87
- package/out/nodejs/version/main.d.mts +0 -1
- package/out/nodejs/version/main.mjs +0 -3
- package/out/nodejs/version/module.f.d.mts +0 -12
- package/out/nodejs/version/module.f.mjs +0 -34
- package/out/nodejs/version/test.f.d.mts +0 -2
- package/out/nodejs/version/test.f.mjs +0 -97
- package/out/text/ascii/module.f.d.mts +0 -70
- package/out/text/ascii/module.f.mjs +0 -154
- package/out/text/ascii/test.f.d.mts +0 -4
- package/out/text/ascii/test.f.mjs +0 -14
- package/out/text/module.f.d.mts +0 -13
- package/out/text/module.f.mjs +0 -19
- package/out/text/sgr/module.f.d.mts +0 -12
- package/out/text/sgr/module.f.mjs +0 -17
- package/out/text/test.f.d.mts +0 -2
- package/out/text/test.f.mjs +0 -19
- package/out/text/utf16/module.f.d.mts +0 -12
- package/out/text/utf16/module.f.mjs +0 -86
- package/out/text/utf16/test.f.d.mts +0 -6
- package/out/text/utf16/test.f.mjs +0 -145
- package/out/text/utf8/module.f.d.mts +0 -10
- package/out/text/utf8/module.f.mjs +0 -126
- package/out/text/utf8/test.f.d.mts +0 -6
- package/out/text/utf8/test.f.mjs +0 -175
- package/out/types/array/module.f.d.mts +0 -31
- package/out/types/array/module.f.mjs +0 -95
- package/out/types/array/test.f.d.mts +0 -10
- package/out/types/array/test.f.mjs +0 -116
- package/out/types/bigfloat/module.f.d.mts +0 -6
- package/out/types/bigfloat/module.f.mjs +0 -77
- package/out/types/bigfloat/test.f.d.mts +0 -6
- package/out/types/bigfloat/test.f.mjs +0 -349
- package/out/types/bigint/module.f.d.mts +0 -29
- package/out/types/bigint/module.f.mjs +0 -114
- package/out/types/bigint/test.f.d.mts +0 -16
- package/out/types/bigint/test.f.mjs +0 -199
- package/out/types/bit_vec/module.f.d.mts +0 -72
- package/out/types/bit_vec/module.f.mjs +0 -83
- package/out/types/bit_vec/test.f.d.mts +0 -9
- package/out/types/bit_vec/test.f.mjs +0 -60
- package/out/types/btree/find/module.f.d.mts +0 -36
- package/out/types/btree/find/module.f.mjs +0 -137
- package/out/types/btree/find/test.f.d.mts +0 -2
- package/out/types/btree/find/test.f.mjs +0 -156
- package/out/types/btree/module.f.d.mts +0 -5
- package/out/types/btree/module.f.mjs +0 -34
- package/out/types/btree/remove/module.f.d.mts +0 -14
- package/out/types/btree/remove/module.f.mjs +0 -209
- package/out/types/btree/remove/test.f.d.mts +0 -7
- package/out/types/btree/remove/test.f.mjs +0 -638
- package/out/types/btree/set/module.f.d.mts +0 -5
- package/out/types/btree/set/module.f.mjs +0 -114
- package/out/types/btree/set/test.f.d.mts +0 -2
- package/out/types/btree/set/test.f.mjs +0 -390
- package/out/types/btree/test.f.d.mts +0 -13
- package/out/types/btree/test.f.mjs +0 -83
- package/out/types/btree/types/module.f.d.mts +0 -14
- package/out/types/btree/types/module.f.mjs +0 -50
- package/out/types/byte_set/module.f.d.mts +0 -25
- package/out/types/byte_set/module.f.mjs +0 -42
- package/out/types/byte_set/test.f.d.mts +0 -13
- package/out/types/byte_set/test.f.mjs +0 -123
- package/out/types/function/compare/module.f.d.mts +0 -23
- package/out/types/function/compare/module.f.mjs +0 -22
- package/out/types/function/compare/test.f.d.mts +0 -2
- package/out/types/function/compare/test.f.mjs +0 -8
- package/out/types/function/module.f.d.mts +0 -51
- package/out/types/function/module.f.mjs +0 -44
- package/out/types/function/operator/module.f.d.mts +0 -60
- package/out/types/function/operator/module.f.mjs +0 -60
- package/out/types/function/test.f.d.mts +0 -2
- package/out/types/function/test.f.mjs +0 -15
- package/out/types/list/module.f.d.mts +0 -82
- package/out/types/list/module.f.mjs +0 -269
- package/out/types/list/test.f.d.mts +0 -38
- package/out/types/list/test.f.mjs +0 -401
- package/out/types/map/module.f.d.mts +0 -21
- package/out/types/map/module.f.mjs +0 -54
- package/out/types/map/test.f.d.mts +0 -5
- package/out/types/map/test.f.mjs +0 -115
- package/out/types/nibble_set/module.f.d.mts +0 -16
- package/out/types/nibble_set/module.f.mjs +0 -19
- package/out/types/nibble_set/test.f.d.mts +0 -13
- package/out/types/nibble_set/test.f.mjs +0 -90
- package/out/types/nullable/module.f.d.mts +0 -9
- package/out/types/nullable/module.f.mjs +0 -9
- package/out/types/nullable/test.f.d.mts +0 -2
- package/out/types/nullable/test.f.mjs +0 -12
- package/out/types/number/module.f.d.mts +0 -7
- package/out/types/number/module.f.mjs +0 -12
- package/out/types/number/test.f.d.mts +0 -11
- package/out/types/number/test.f.mjs +0 -126
- package/out/types/object/module.f.d.mts +0 -22
- package/out/types/object/module.f.mjs +0 -27
- package/out/types/object/test.f.d.mts +0 -5
- package/out/types/object/test.f.mjs +0 -17
- package/out/types/range/module.f.d.mts +0 -6
- package/out/types/range/module.f.mjs +0 -6
- package/out/types/range/test.f.d.mts +0 -2
- package/out/types/range/test.f.mjs +0 -18
- package/out/types/range_map/module.f.d.mts +0 -19
- package/out/types/range_map/module.f.mjs +0 -84
- package/out/types/range_map/test.f.d.mts +0 -6
- package/out/types/range_map/test.f.mjs +0 -201
- package/out/types/result/module.d.mts +0 -7
- package/out/types/result/module.f.d.mts +0 -22
- package/out/types/result/module.f.mjs +0 -25
- package/out/types/result/module.mjs +0 -16
- package/out/types/sorted_list/module.f.d.mts +0 -53
- package/out/types/sorted_list/module.f.mjs +0 -102
- package/out/types/sorted_list/test.f.d.mts +0 -5
- package/out/types/sorted_list/test.f.mjs +0 -66
- package/out/types/sorted_set/module.f.d.mts +0 -19
- package/out/types/sorted_set/module.f.mjs +0 -29
- package/out/types/sorted_set/test.f.d.mts +0 -6
- package/out/types/sorted_set/test.f.mjs +0 -80
- package/out/types/string/module.f.d.mts +0 -9
- package/out/types/string/module.f.mjs +0 -17
- package/out/types/string/test.f.d.mts +0 -15
- package/out/types/string/test.f.mjs +0 -58
- package/out/types/string_set/module.f.d.mts +0 -13
- package/out/types/string_set/module.f.mjs +0 -29
- package/out/types/string_set/test.f.d.mts +0 -5
- package/out/types/string_set/test.f.mjs +0 -65
- package/text/module.f.mjs +0 -27
- package/text/utf16/module.f.mjs +0 -96
- package/types/array/module.f.mjs +0 -119
- package/types/bit_vec/module.f.mjs +0 -90
- package/types/bit_vec/test.f.mjs +0 -41
- package/types/btree/find/module.f.mjs +0 -125
- package/types/btree/types/module.f.mjs +0 -64
- package/types/byte_set/module.f.mjs +0 -61
- package/types/function/compare/module.f.mjs +0 -29
- package/types/function/module.f.mjs +0 -50
- package/types/function/operator/module.f.mjs +0 -78
- package/types/function/test.f.mjs +0 -17
- package/types/list/module.f.mjs +0 -320
- package/types/map/module.f.mjs +0 -67
- package/types/nibble_set/module.f.mjs +0 -28
- package/types/nullable/module.f.mjs +0 -11
- package/types/number/module.f.mjs +0 -16
- package/types/object/module.f.mjs +0 -33
- package/types/range/module.f.mjs +0 -8
- package/types/range_map/module.f.mjs +0 -84
- package/types/result/module.f.mjs +0 -28
- package/types/sorted_list/module.f.mjs +0 -107
- package/types/sorted_set/module.f.mjs +0 -38
- package/types/string/module.f.mjs +0 -22
- package/types/string_set/module.f.mjs +0 -36
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import * as encoding from './module.f.
|
|
2
|
-
import * as json from '../../json/module.f.
|
|
3
|
-
import * as o from '../../types/object/module.f.
|
|
1
|
+
import * as encoding from './module.f.ts'
|
|
2
|
+
import * as json from '../../json/module.f.ts'
|
|
3
|
+
import * as o from '../../types/object/module.f.ts'
|
|
4
4
|
const { sort } = o
|
|
5
|
-
import * as list from '../../types/list/module.f.
|
|
5
|
+
import * as list from '../../types/list/module.f.ts'
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const stringify
|
|
8
|
+
: (a: readonly json.Unknown[]) => string
|
|
9
|
+
= a => json.stringify(sort)(a)
|
|
9
10
|
|
|
10
11
|
export default {
|
|
11
12
|
toCodePointList: [
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
import * as
|
|
3
|
-
import * as
|
|
4
|
-
import * as Array from '../../types/array/module.f.mjs'
|
|
1
|
+
import * as list from '../../types/list/module.f.ts'
|
|
2
|
+
import * as operator from '../../types/function/operator/module.f.ts'
|
|
3
|
+
import * as Array from '../../types/array/module.f.ts'
|
|
5
4
|
const { flatMap, flat, stateScan } = list
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
type ByteOrEof = u8|null
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
type Utf8NonEmptyState = Array.Array1<number>|Array.Array2<number>|Array.Array3<number>
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
type Utf8State = null|Utf8NonEmptyState
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
type u8 = number
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
type i32 = number
|
|
16
15
|
|
|
17
16
|
const errorMask = 0b1000_0000_0000_0000_0000_0000_0000_0000
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const codePointToUtf8
|
|
19
|
+
: (input:number) => list.List<u8>
|
|
20
|
+
= input => {
|
|
21
21
|
if (input >= 0x0000 && input <= 0x007f) { return [input & 0b01111_1111] }
|
|
22
22
|
if (input >= 0x0080 && input <= 0x07ff) { return [input >> 6 | 0b1100_0000, input & 0b0011_1111 | 0b1000_0000] }
|
|
23
23
|
if (input >= 0x0800 && input <= 0xffff) { return [input >> 12 | 0b1110_0000, input >> 6 & 0b0011_1111 | 0b1000_0000, input & 0b0011_1111 | 0b1000_0000] }
|
|
@@ -33,8 +33,9 @@ const codePointToUtf8 = input => {
|
|
|
33
33
|
|
|
34
34
|
export const fromCodePointList = flatMap(codePointToUtf8)
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const utf8StateToError
|
|
37
|
+
: (state: Utf8NonEmptyState) => i32
|
|
38
|
+
= state => {
|
|
38
39
|
let x
|
|
39
40
|
switch (state.length) {
|
|
40
41
|
case 1: {
|
|
@@ -59,8 +60,9 @@ const utf8StateToError = state => {
|
|
|
59
60
|
return x | errorMask
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
const utf8ByteToCodePointOp
|
|
64
|
+
: operator.StateScan<number, Utf8State, list.List<i32>>
|
|
65
|
+
= state => byte => {
|
|
64
66
|
if (byte < 0x00 || byte > 0xff) {
|
|
65
67
|
return [[errorMask], state]
|
|
66
68
|
}
|
|
@@ -95,15 +97,19 @@ const utf8ByteToCodePointOp = state => byte => {
|
|
|
95
97
|
return [[error, byte | errorMask], null]
|
|
96
98
|
}
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
const utf8EofToCodePointOp
|
|
101
|
+
: (state: Utf8State) => readonly[list.List<i32>, Utf8State]
|
|
102
|
+
= state =>
|
|
100
103
|
[state === null ? null : [utf8StateToError(state)], null]
|
|
101
104
|
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
const utf8ByteOrEofToCodePointOp
|
|
106
|
+
: operator.StateScan<ByteOrEof, Utf8State, list.List<i32>>
|
|
107
|
+
= state => input => input === null ? utf8EofToCodePointOp(state) : utf8ByteToCodePointOp(state)(input)
|
|
104
108
|
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
const eofList
|
|
110
|
+
: list.List<ByteOrEof>
|
|
111
|
+
= [null]
|
|
107
112
|
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
export const toCodePointList
|
|
114
|
+
: (input: list.List<u8>) => list.List<i32>
|
|
115
|
+
= input => flat(stateScan(utf8ByteOrEofToCodePointOp)(null)(flat([input, eofList])))
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as encoding from './module.f.
|
|
2
|
-
import * as json from '../../json/module.f.
|
|
3
|
-
import * as o from '../../types/object/module.f.
|
|
1
|
+
import * as encoding from './module.f.ts'
|
|
2
|
+
import * as json from '../../json/module.f.ts'
|
|
3
|
+
import * as o from '../../types/object/module.f.ts'
|
|
4
4
|
const { sort } = o
|
|
5
|
-
import * as list from '../../types/list/module.f.
|
|
5
|
+
import * as list from '../../types/list/module.f.ts'
|
|
6
6
|
|
|
7
7
|
const stringify = json.stringify(sort)
|
|
8
8
|
|
package/tsconfig.json
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
/* Visit https://aka.ms/tsconfig.json to read more about this file */
|
|
4
|
+
"allowImportingTsExtensions": true,
|
|
5
|
+
"rewriteRelativeImportExtensions": true,
|
|
6
|
+
"verbatimModuleSyntax": true,
|
|
4
7
|
|
|
5
8
|
/* Projects */
|
|
6
9
|
// "incremental": true, /* Enable incremental compilation */
|
|
@@ -47,7 +50,7 @@
|
|
|
47
50
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
|
48
51
|
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
|
49
52
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
|
|
50
|
-
"outDir": "./out", /* Specify an output folder for all emitted files. */
|
|
53
|
+
// "outDir": "./out", /* Specify an output folder for all emitted files. */
|
|
51
54
|
// "removeComments": true, /* Disable emitting comments. */
|
|
52
55
|
"noEmit": true, /* Disable emitting files from a compilation. */
|
|
53
56
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as option from '../nullable/module.f.ts'
|
|
2
|
+
const { map } = option
|
|
3
|
+
|
|
4
|
+
export type Array1<T> = readonly[T]
|
|
5
|
+
|
|
6
|
+
type Index1 = 0
|
|
7
|
+
|
|
8
|
+
export type Array2<T> = readonly[T, T]
|
|
9
|
+
|
|
10
|
+
type Tuple2<T0, T1> = readonly[T0, T1]
|
|
11
|
+
|
|
12
|
+
type Index2 = 0|1
|
|
13
|
+
|
|
14
|
+
export type Array3<T> = readonly[T, T, T]
|
|
15
|
+
|
|
16
|
+
type Tuple3<T0, T1, T2> = readonly[T0, T1, T2]
|
|
17
|
+
|
|
18
|
+
export type Index3 = 0|1|2
|
|
19
|
+
|
|
20
|
+
export type Array4<T> = readonly[T, T, T, T]
|
|
21
|
+
|
|
22
|
+
type Index4 = 0|1|2|3
|
|
23
|
+
|
|
24
|
+
export type Array5<T> = readonly[T, T, T, T, T]
|
|
25
|
+
|
|
26
|
+
export type Array8<T> = readonly[T, T, T, T, T, T, T, T]
|
|
27
|
+
|
|
28
|
+
export type Array16<T> = readonly[T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T]
|
|
29
|
+
|
|
30
|
+
type Index16 = 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15
|
|
31
|
+
|
|
32
|
+
type Array1_5<T> = Array1<T>| Array2<T> | Array3<T> | Array4<T> | Array5<T>
|
|
33
|
+
|
|
34
|
+
export type Index5 = 0|1|2|3|4
|
|
35
|
+
|
|
36
|
+
export type KeyOf<T> = T extends Array1<infer _> ? Index1 :
|
|
37
|
+
T extends Array2<infer _> ? Index2 :
|
|
38
|
+
T extends Array3<infer _> ? Index3 :
|
|
39
|
+
T extends Array4<infer _> ? Index4 :
|
|
40
|
+
T extends Array5<infer _> ? Index5 :
|
|
41
|
+
T extends readonly (infer _)[] ? number :
|
|
42
|
+
never
|
|
43
|
+
|
|
44
|
+
const uncheckTail
|
|
45
|
+
: <T>(_: readonly T[]) => readonly T[]
|
|
46
|
+
= a => a.slice(1)
|
|
47
|
+
|
|
48
|
+
const uncheckHead
|
|
49
|
+
: <T>(_: readonly T[]) => readonly T[]
|
|
50
|
+
= a => a.slice(0, -1)
|
|
51
|
+
|
|
52
|
+
export const at
|
|
53
|
+
: (index: number) => <T>(a: readonly T[]) => T|null
|
|
54
|
+
= i => a => {
|
|
55
|
+
const r = a[i]
|
|
56
|
+
return r === void 0 ? null : r
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const first
|
|
60
|
+
: <T>(_: readonly T[]) => T|null
|
|
61
|
+
= at(0)
|
|
62
|
+
|
|
63
|
+
export const last
|
|
64
|
+
: <T>(_: readonly T[]) => T|null
|
|
65
|
+
= a => at(a.length - 1)(a)
|
|
66
|
+
|
|
67
|
+
export const tail
|
|
68
|
+
: <T>(_: readonly T[]) => readonly T[] | null
|
|
69
|
+
= a => a.length === 0 ? null : uncheckTail(a)
|
|
70
|
+
|
|
71
|
+
export const splitFirst
|
|
72
|
+
= <T>(a: readonly T[]): readonly[T, readonly T[]]|null => {
|
|
73
|
+
const split
|
|
74
|
+
: (_: T) => readonly[T, readonly T[]]
|
|
75
|
+
= first => [first, uncheckTail(a)]
|
|
76
|
+
return map(split)(first(a))
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const head
|
|
80
|
+
: <T>(_: readonly T[]) => readonly T[]|null
|
|
81
|
+
= a => a.length === 0 ? null : uncheckHead(a)
|
|
82
|
+
|
|
83
|
+
export const splitLast
|
|
84
|
+
: <T>(_: readonly T[]) => readonly[readonly T[], T]|null
|
|
85
|
+
= a => {
|
|
86
|
+
const lastA = last(a)
|
|
87
|
+
if (lastA === null) { return null }
|
|
88
|
+
return [uncheckHead(a), lastA]
|
|
89
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as _ from './module.f.
|
|
2
|
-
import * as json from '../../json/module.f.
|
|
3
|
-
import * as o from '../object/module.f.
|
|
1
|
+
import * as _ from './module.f.ts'
|
|
2
|
+
import * as json from '../../json/module.f.ts'
|
|
3
|
+
import * as o from '../object/module.f.ts'
|
|
4
4
|
const { sort } = o
|
|
5
5
|
|
|
6
6
|
const stringify = json.stringify(sort)
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
import * as bi from '../bigint/module.f.mjs'
|
|
1
|
+
import * as bi from '../bigint/module.f.ts'
|
|
3
2
|
const { abs, sign } = bi
|
|
4
3
|
|
|
5
|
-
|
|
4
|
+
export type BigFloat = readonly[bigint,number]
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
type BigFloatWithRemainder = readonly[BigFloat,bigint]
|
|
8
7
|
|
|
9
8
|
const twoPow53 = 0b0010_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n
|
|
10
9
|
const twoPow54 = 0b0100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const increaseMantissa
|
|
12
|
+
: (value: BigFloat) => (min: bigint) => BigFloat
|
|
13
|
+
= ([m, e]) => min => {
|
|
14
14
|
if (m === 0n) {
|
|
15
15
|
return [m, e]
|
|
16
16
|
}
|
|
@@ -25,8 +25,9 @@ const increaseMantissa = ([m, e]) => min => {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const decreaseMantissa
|
|
29
|
+
: (value: BigFloat) => (max: bigint) => BigFloat
|
|
30
|
+
= ([m, e]) => max => {
|
|
30
31
|
if (m === 0n) {
|
|
31
32
|
return [m, e]
|
|
32
33
|
}
|
|
@@ -41,19 +42,23 @@ const decreaseMantissa = ([m, e]) => max => {
|
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
const pow
|
|
46
|
+
: (base: bigint) => (exp: number) => bigint
|
|
47
|
+
= base => exp => base ** BigInt(exp)
|
|
46
48
|
|
|
47
49
|
const pow5 = pow(5n)
|
|
48
50
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
export const multiply
|
|
52
|
+
: (b: BigFloat) => (mul: bigint) => BigFloat
|
|
53
|
+
= ([m, e]) => mul => [m * mul, e]
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
const divide
|
|
56
|
+
: (b: BigFloat) => (div: bigint) => BigFloatWithRemainder
|
|
57
|
+
= ([m, e]) => div => [[m / div, e], m % div]
|
|
54
58
|
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
const round53
|
|
60
|
+
: (b: BigFloatWithRemainder) => BigFloat
|
|
61
|
+
= ([[m, e], r]) => {
|
|
57
62
|
const mabs = abs(m)
|
|
58
63
|
const s = BigInt(sign(m))
|
|
59
64
|
const [m54, e54] = decreaseMantissa([mabs, e])(twoPow54)
|
|
@@ -67,14 +72,14 @@ const round53 = ([[m, e], r]) => {
|
|
|
67
72
|
return multiply([m53 + o54, e53])(s)
|
|
68
73
|
}
|
|
69
74
|
|
|
70
|
-
|
|
71
|
-
|
|
75
|
+
export const decToBin
|
|
76
|
+
: (dec: BigFloat) => BigFloat
|
|
77
|
+
= dec => {
|
|
72
78
|
if (dec[0] === 0n) {
|
|
73
79
|
return [0n, 0]
|
|
74
80
|
}
|
|
75
81
|
if (dec[1] >= 0) {
|
|
76
|
-
|
|
77
|
-
const bin = [dec[0] * pow5(dec[1]), dec[1]]
|
|
82
|
+
const bin: BigFloat = [dec[0] * pow5(dec[1]), dec[1]]
|
|
78
83
|
const inc = increaseMantissa(bin)(twoPow53)
|
|
79
84
|
return round53([inc, 0n])
|
|
80
85
|
}
|
|
@@ -1,36 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
import * as
|
|
3
|
-
import * as Operator from '../function/operator/module.f.mjs'
|
|
1
|
+
import * as compare from '../function/compare/module.f.ts'
|
|
2
|
+
import * as Operator from '../function/operator/module.f.ts'
|
|
4
3
|
const { unsafeCmp } = compare
|
|
5
|
-
import * as list from '../list/module.f.
|
|
4
|
+
import * as list from '../list/module.f.ts'
|
|
6
5
|
const { reduce } = list
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
type Unary = Operator.Unary<bigint, bigint>
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
export const addition
|
|
10
|
+
: (a: bigint) => (b: bigint) => bigint
|
|
11
|
+
= a => b => a + b
|
|
12
12
|
|
|
13
13
|
export const sum = reduce(addition)(0n)
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
export const abs
|
|
16
|
+
: (a: bigint) => bigint
|
|
17
|
+
= a => a >= 0 ? a : -a
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
export const sign
|
|
20
|
+
: (a: bigint) => compare.Sign
|
|
21
|
+
= a => unsafeCmp(a)(0n)
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
export const serialize
|
|
24
|
+
: (a: bigint) => string
|
|
25
|
+
= a => `${a}n`
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
* readonly add: Operator.Reduce<T>
|
|
29
|
-
* }} Additive
|
|
30
|
-
*/
|
|
27
|
+
type Additive<T> = {
|
|
28
|
+
readonly 0: T
|
|
29
|
+
readonly add: Operator.Reduce<T>
|
|
30
|
+
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
export const scalar_mul
|
|
33
|
+
: <T>(a: Additive<T>) => (a: T) => (n: bigint) => T
|
|
34
|
+
= ({ 0: _0, add }) => a => n => {
|
|
34
35
|
let ai = a
|
|
35
36
|
let ni = n
|
|
36
37
|
let result = _0
|
|
@@ -54,8 +55,8 @@ export const scalar_mul = ({ 0: _0, add }) => a => n => {
|
|
|
54
55
|
* - `log2(2n)` returns `1n`,
|
|
55
56
|
* - `log2(15n)` returns `3n`.
|
|
56
57
|
*
|
|
57
|
-
* @param
|
|
58
|
-
* @returns
|
|
58
|
+
* @param v - The input BigInt.
|
|
59
|
+
* @returns The base-2 logarithm (floor) of the input BigInt, or `-1n` if the input is less than or equal to 0.
|
|
59
60
|
*
|
|
60
61
|
* @remarks
|
|
61
62
|
* The function operates in two phases:
|
|
@@ -64,7 +65,7 @@ export const scalar_mul = ({ 0: _0, add }) => a => n => {
|
|
|
64
65
|
* 2. **Binary Search Phase:** Refines the result by halving the step size and incrementally
|
|
65
66
|
* determining the exact value of the logarithm.
|
|
66
67
|
*/
|
|
67
|
-
export const log2 = v => {
|
|
68
|
+
export const log2 = (v: bigint): bigint => {
|
|
68
69
|
if (v <= 0n) { return -1n }
|
|
69
70
|
let result = 0n
|
|
70
71
|
let i = 1n
|
|
@@ -104,14 +105,14 @@ export const log2 = v => {
|
|
|
104
105
|
* The function handles both positive and negative numbers. For negative inputs, the bit length is calculated
|
|
105
106
|
* based on the absolute value of the number. Zero has a bit length of 0.
|
|
106
107
|
*
|
|
107
|
-
* @param
|
|
108
|
-
* @returns
|
|
108
|
+
* @param v - The input BigInt.
|
|
109
|
+
* @returns The bit length of the input BigInt.
|
|
109
110
|
*
|
|
110
111
|
* @remark
|
|
111
112
|
* The function uses the `log2` function to calculate the position of the most significant bit(MSB)
|
|
112
113
|
* and adds `1n` to account for the MSB itself.For negative numbers, the absolute value is used.
|
|
113
114
|
*/
|
|
114
|
-
export const bitLength = v => {
|
|
115
|
+
export const bitLength = (v: bigint): bigint => {
|
|
115
116
|
if (v <= 0n) {
|
|
116
117
|
if (v === 0n) { return 0n }
|
|
117
118
|
v = -v
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Vector of Bits
|
|
2
|
+
|
|
3
|
+
A **vector of bits** is represented as a `bigint`. The value is always positive, and an **empty vector** is denoted by `1n`.
|
|
4
|
+
|
|
5
|
+
## Key Characteristics
|
|
6
|
+
|
|
7
|
+
- The **most significant bit** with a value of `1` is called the **`stop bit`**.
|
|
8
|
+
- The **`stop bit`** marks the boundary of the vector.
|
|
9
|
+
- The **`length`** of a vector represents the number of meaningful bits (excluding the **`stop bit`**).
|
|
10
|
+
- An **empty vector** is represented by `1n`, with the implicit **`stop bit`** as the only bit.
|
|
11
|
+
|
|
12
|
+
## Example
|
|
13
|
+
|
|
14
|
+
| Vector | Binary Representation | `length` | Vector Items |
|
|
15
|
+
|---------------|-----------------------|----------|--------------|
|
|
16
|
+
| `0b1001n` | `0b1001n` | 3 | `001` |
|
|
17
|
+
| `0x1FF` | `0b111111111` | 8 | `11111111` |
|
|
18
|
+
| `1n` (empty) | `0b1` | 0 | (none) |
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { log2 } from '../bigint/module.f.ts'
|
|
2
|
+
import { flip } from '../function/module.f.ts'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A vector of bits represented as a `bigint`.
|
|
6
|
+
*/
|
|
7
|
+
type Vec = bigint
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* An empty vector of bits.
|
|
11
|
+
*/
|
|
12
|
+
export const empty = 1n
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Calculates the length of the given vector of bits.
|
|
16
|
+
*/
|
|
17
|
+
export const length = log2
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates a vector of bits of the given `len` and the given unsigned integer.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
*
|
|
24
|
+
* ```js
|
|
25
|
+
* const vec4 = vec(4n)
|
|
26
|
+
* const v0 = vec4(5n) // 0x15n
|
|
27
|
+
* const v1 = vec4(0x5FEn) // 0x1En
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const vec = (len: bigint): (ui: bigint) => Vec => {
|
|
31
|
+
if (len <= 0n) { return () => empty }
|
|
32
|
+
const stop = 1n << len
|
|
33
|
+
const mask = stop - 1n
|
|
34
|
+
return data => stop | (data & mask)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const mask = (len: bigint) => (1n << len) - 1n
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns the unsigned integer of the given vector by removing a stop bit.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
*
|
|
44
|
+
* ```js
|
|
45
|
+
* const vector = vec(8n)(0x5n) // 0x105n
|
|
46
|
+
* const result = uint(vector); // result is 0x5n
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export const uint = (v: Vec): bigint => v ^ (1n << length(v))
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Extract the least significant unsigned integer from the given vector.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
*
|
|
56
|
+
* ```js
|
|
57
|
+
* const vector = vec(8n)(0xF5n) // 0x1F5n
|
|
58
|
+
* const result = uintLsb(4n)(vector); // result is 5n
|
|
59
|
+
* const result2 = uintLsb(16n)(vector); // result2 is 0xF5n
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export const uintLsb = (len: bigint): (v: Vec) => bigint => {
|
|
63
|
+
const m = mask(len)
|
|
64
|
+
return v => {
|
|
65
|
+
const result = v & m
|
|
66
|
+
return result === v ? uint(v) : result
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Removes the first `len` least significant bits from the given vector.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
*
|
|
75
|
+
* ```js
|
|
76
|
+
* const v = vec(16n)(0x3456n) // 0x13456n
|
|
77
|
+
* const r = removeLsb(4n)(v) // 0x1345n
|
|
78
|
+
* const r2 = removeLsb(24n)(v) // 0x1n
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export const removeLsb = (len: bigint) => (v: Vec): Vec => {
|
|
82
|
+
const r = v >> len
|
|
83
|
+
return r === 0n ? empty : r
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Extracts the least significant unsigned integer and removes it from the vector.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
*
|
|
91
|
+
* ```js
|
|
92
|
+
* const vector = vec(8n)(0xF5n) // 0x1F5n
|
|
93
|
+
* const [result, rest] = popUintLsb(4n)(vector); // result is 5n, rest is 0x1Fn
|
|
94
|
+
* const [result2, rest2] = popUintLsb(16n)(vector); // result2 is 0xF5n, rest2 is 1n
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export const popUintLsb = (len: bigint): (v: Vec) => readonly[bigint, Vec] => {
|
|
98
|
+
const m = mask(len)
|
|
99
|
+
return v => {
|
|
100
|
+
const result = v & m
|
|
101
|
+
return result === v ? [uint(v), empty] : [result, v >> len]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extract the most significant unsigned integer of the given `len` from the given vector.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
*
|
|
110
|
+
* ```js
|
|
111
|
+
* const vector = vec(8n)(0xF5n) // 0x1F5n
|
|
112
|
+
* const result = uintMsb(4n)(vector); // result is 0xFn
|
|
113
|
+
* const result2 = uintMsb(16n)(vector); // result2 is 0xF500n
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export const uintMsb = (len: bigint): (v: Vec) => bigint => {
|
|
117
|
+
const m = mask(len)
|
|
118
|
+
return v => (v >> (length(v) - len)) & m
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Removes the first `len` most significant bits from the given vector.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
*
|
|
126
|
+
* ```js
|
|
127
|
+
* const v = vec(16n)(0x3456n) // 0x13456n
|
|
128
|
+
* const r = removeMsb(4n)(v) // 0x1456n
|
|
129
|
+
* const r2 = removeMsb(24n)(v) // 0x1n
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export const removeMsb = (len: bigint) => (v: Vec): Vec => vec(length(v) - len)(v)
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Extracts the most significant unsigned integer and removes it from the vector.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
*
|
|
139
|
+
* ```js
|
|
140
|
+
* const vector = vec(8n)(0xF5n) // 0x1F5n
|
|
141
|
+
* const [result, rest] = popUintMsb(4n)(vector); // [0xFn, 0x15n]
|
|
142
|
+
* const [result2, rest2] = popUintMsb(16n)(vector); // [0xF500n, 1n]
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export const popUintMsb = (len: bigint): (v: Vec) => readonly[bigint, Vec] => {
|
|
146
|
+
const m = mask(len)
|
|
147
|
+
return v => {
|
|
148
|
+
const d = length(v) - len
|
|
149
|
+
return [(v >> d) & m, vec(d)(v)]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Concat the given vectors of bits. The first vector is the least significant.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
*
|
|
158
|
+
* ```js
|
|
159
|
+
* const u8 = vec(8n)
|
|
160
|
+
* const a = u8(0x45n) // 0x145n
|
|
161
|
+
* const b = u8(0x89n) // 0x189n
|
|
162
|
+
* const ab = concatLsb(a)(b) // 0x18945n
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export const concatLsb = (a: Vec): (b: Vec) => Vec => {
|
|
166
|
+
const aLen = length(a)
|
|
167
|
+
const m = mask(aLen)
|
|
168
|
+
return b => (b << aLen) | (a & m)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Concat the given vectors of bits. The first vector is the most significant.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
*
|
|
176
|
+
* ```js
|
|
177
|
+
* const u8 = vec(8n)
|
|
178
|
+
* const a = u8(0x45n) // 0x145n
|
|
179
|
+
* const b = u8(0x89n) // 0x189n
|
|
180
|
+
* const ab = concatMsb(a)(b) // 0x14589n
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
export const concatMsb
|
|
184
|
+
: (b: Vec) => (a: Vec) => Vec
|
|
185
|
+
= flip(concatLsb)
|