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.
Files changed (433) hide show
  1. package/.github/workflows/ci.yml +19 -4
  2. package/CHANGELOG.md +9 -0
  3. package/com/cpp/{module.f.mjs → module.f.ts} +65 -44
  4. package/com/cpp/{test.f.mjs → test.f.ts} +1 -1
  5. package/com/cpp/testlib.f.ts +8 -0
  6. package/com/cs/{module.f.mjs → module.f.ts} +47 -38
  7. package/com/cs/{test.f.mjs → test.f.ts} +2 -2
  8. package/com/cs/testlib.f.ts +8 -0
  9. package/com/rust/module.f.ts +287 -0
  10. package/com/rust/{test.f.mjs → test.f.ts} +1 -1
  11. package/com/rust/testlib.f.ts +8 -0
  12. package/com/test/{build.f.mjs → build.f.ts} +47 -45
  13. package/com/test/{build.mjs → build.ts} +7 -6
  14. package/com/types/module.f.ts +62 -0
  15. package/com/types/{testlib.f.mjs → testlib.f.ts} +2 -3
  16. package/commonjs/build/module.f.ts +100 -0
  17. package/commonjs/build/{test.f.mjs → test.f.ts} +21 -17
  18. package/commonjs/module/function/module.f.ts +13 -0
  19. package/commonjs/module/module.f.ts +41 -0
  20. package/commonjs/module.f.ts +7 -0
  21. package/commonjs/{module.mjs → module.ts} +12 -9
  22. package/commonjs/package/dependencies/module.f.ts +22 -0
  23. package/commonjs/package/dependencies/{test.f.mjs → test.f.ts} +1 -1
  24. package/commonjs/package/module.f.ts +31 -0
  25. package/commonjs/package/{test.f.mjs → test.f.ts} +1 -1
  26. package/commonjs/path/{module.f.mjs → module.f.ts} +72 -67
  27. package/commonjs/path/{test.f.mjs → test.f.ts} +25 -19
  28. package/commonjs/{test.mjs → test.ts} +5 -4
  29. package/crypto/prime_field/{module.f.mjs → module.f.ts} +40 -37
  30. package/crypto/prime_field/{test.f.mjs → test.f.ts} +7 -5
  31. package/crypto/secp/{module.f.mjs → module.f.ts} +44 -44
  32. package/crypto/secp/{test.f.mjs → test.f.ts} +16 -11
  33. package/crypto/sha2/{module.f.mjs → module.f.ts} +61 -46
  34. package/crypto/sha2/{test.f.mjs → test.f.ts} +12 -9
  35. package/deno.json +71 -0
  36. package/dev/README.md +8 -0
  37. package/dev/index.ts +3 -0
  38. package/dev/{module.f.mjs → module.f.ts} +0 -2
  39. package/dev/{module.mjs → module.ts} +65 -60
  40. package/dev/test/{module.f.mjs → module.f.ts} +57 -70
  41. package/dev/{test.f.mjs → test.f.ts} +7 -5
  42. package/dev/test.ts +53 -0
  43. package/djs/{module.f.mjs → module.f.ts} +31 -31
  44. package/djs/parser/{module.f.mjs → module.f.ts} +190 -182
  45. package/djs/parser/{test.f.mjs → test.f.ts} +173 -150
  46. package/djs/serializer/module.f.ts +90 -0
  47. package/djs/{test.f.mjs → test.f.ts} +4 -4
  48. package/djs/tokenizer/{module.f.mjs → module.f.ts} +35 -42
  49. package/djs/tokenizer/{test.f.mjs → test.f.ts} +9 -8
  50. package/fsc/{module.f.mjs → module.f.ts} +41 -44
  51. package/fsc/{test.f.mjs → test.f.ts} +8 -6
  52. package/fsm/module.f.ts +107 -0
  53. package/fsm/{test.f.mjs → test.f.ts} +10 -9
  54. package/html/README.md +10 -9
  55. package/html/module.f.ts +108 -0
  56. package/html/{test.f.mjs → test.f.ts} +10 -7
  57. package/issues/README.md +3 -0
  58. package/issues/lang/3110-function.md +25 -1
  59. package/issues/{test.f.mjs → test.f.ts} +3 -2
  60. package/js/tokenizer/module.f.ts +882 -0
  61. package/js/tokenizer/{test.f.mjs → test.f.ts} +11 -10
  62. package/json/module.f.ts +94 -0
  63. package/json/parser/{module.f.mjs → module.f.ts} +113 -109
  64. package/json/parser/{test.f.mjs → test.f.ts} +10 -9
  65. package/json/serializer/module.f.ts +70 -0
  66. package/json/serializer/{test.f.mjs → test.f.ts} +3 -3
  67. package/json/{test.f.mjs → test.f.ts} +3 -3
  68. package/json/tokenizer/{module.f.mjs → module.f.ts} +29 -36
  69. package/json/tokenizer/{test.f.mjs → test.f.ts} +9 -8
  70. package/nanvm-lib/src/extension.rs +15 -4
  71. package/nanvm-lib/src/interface.rs +7 -10
  72. package/nanvm-lib/src/lib.rs +3 -3
  73. package/nanvm-lib/src/naive.rs +10 -3
  74. package/nanvm-lib/src/nanenum.rs +5 -1
  75. package/nanvm-lib/tests/{test.f.mjs → test.f.ts} +7 -6
  76. package/nodejs/version/{main.mjs → main.ts} +1 -1
  77. package/nodejs/version/module.f.ts +42 -0
  78. package/nodejs/version/{test.f.mjs → test.f.ts} +11 -12
  79. package/package.json +9 -9
  80. package/text/ascii/{module.f.mjs → module.f.ts} +10 -8
  81. package/text/ascii/{test.f.mjs → test.f.ts} +4 -4
  82. package/text/module.f.ts +30 -0
  83. package/text/sgr/{module.f.mjs → module.f.ts} +3 -5
  84. package/text/{test.f.mjs → test.f.ts} +5 -4
  85. package/text/utf16/module.f.ts +108 -0
  86. package/text/utf16/{test.f.mjs → test.f.ts} +7 -6
  87. package/text/utf8/{module.f.mjs → module.f.ts} +29 -23
  88. package/text/utf8/{test.f.mjs → test.f.ts} +4 -4
  89. package/tsconfig.json +4 -1
  90. package/types/array/module.f.ts +89 -0
  91. package/types/array/{test.f.mjs → test.f.ts} +3 -3
  92. package/types/bigfloat/{module.f.mjs → module.f.ts} +25 -20
  93. package/types/bigfloat/{test.f.mjs → test.f.ts} +1 -1
  94. package/types/bigint/{module.f.mjs → module.f.ts} +29 -28
  95. package/types/bigint/{test.f.mjs → test.f.ts} +2 -2
  96. package/types/bit_vec/README.md +18 -0
  97. package/types/bit_vec/module.f.ts +185 -0
  98. package/types/bit_vec/test.f.ts +129 -0
  99. package/types/btree/find/module.f.ts +92 -0
  100. package/types/btree/find/{test.f.mjs → test.f.ts} +20 -16
  101. package/types/btree/{module.f.mjs → module.f.ts} +9 -9
  102. package/types/btree/remove/{module.f.mjs → module.f.ts} +43 -53
  103. package/types/btree/remove/{test.f.mjs → test.f.ts} +19 -15
  104. package/types/btree/set/{module.f.mjs → module.f.ts} +17 -20
  105. package/types/btree/set/{test.f.mjs → test.f.ts} +96 -66
  106. package/types/btree/{test.f.mjs → test.f.ts} +34 -26
  107. package/types/btree/types/module.f.ts +27 -0
  108. package/types/byte_set/module.f.ts +70 -0
  109. package/types/byte_set/{test.f.mjs → test.f.ts} +8 -7
  110. package/types/function/compare/module.f.ts +26 -0
  111. package/types/function/compare/{test.f.mjs → test.f.ts} +1 -1
  112. package/types/function/module.f.ts +43 -0
  113. package/types/function/operator/module.f.ts +63 -0
  114. package/types/function/test.f.ts +20 -0
  115. package/types/list/module.f.ts +345 -0
  116. package/types/list/{test.f.mjs → test.f.ts} +30 -24
  117. package/types/map/module.f.ts +65 -0
  118. package/types/map/{test.f.mjs → test.f.ts} +6 -5
  119. package/types/nibble_set/module.f.ts +34 -0
  120. package/types/nibble_set/{test.f.mjs → test.f.ts} +3 -3
  121. package/types/nullable/module.f.ts +9 -0
  122. package/types/nullable/{test.f.mjs → test.f.ts} +2 -2
  123. package/types/number/module.f.ts +16 -0
  124. package/types/number/{test.f.mjs → test.f.ts} +7 -5
  125. package/types/object/module.f.ts +30 -0
  126. package/types/object/{test.f.mjs → test.f.ts} +2 -2
  127. package/types/range/module.f.ts +10 -0
  128. package/types/range/{test.f.mjs → test.f.ts} +1 -1
  129. package/types/range_map/module.f.ts +70 -0
  130. package/types/range_map/{test.f.mjs → test.f.ts} +82 -57
  131. package/types/result/module.f.ts +20 -0
  132. package/types/result/{module.mjs → module.ts} +4 -3
  133. package/types/sorted_list/module.f.ts +83 -0
  134. package/types/sorted_list/{test.f.mjs → test.f.ts} +14 -12
  135. package/types/sorted_set/module.f.ts +36 -0
  136. package/types/sorted_set/{test.f.mjs → test.f.ts} +14 -12
  137. package/types/string/module.f.ts +24 -0
  138. package/types/string/{test.f.mjs → test.f.ts} +2 -2
  139. package/types/string_set/module.f.ts +37 -0
  140. package/types/string_set/{test.f.mjs → test.f.ts} +2 -2
  141. package/com/cpp/testlib.f.mjs +0 -8
  142. package/com/cs/testlib.f.mjs +0 -8
  143. package/com/rust/module.f.mjs +0 -272
  144. package/com/rust/testlib.f.mjs +0 -8
  145. package/com/types/module.f.mjs +0 -67
  146. package/commonjs/build/module.f.mjs +0 -100
  147. package/commonjs/module/function/module.f.mjs +0 -21
  148. package/commonjs/module/module.f.mjs +0 -53
  149. package/commonjs/module.f.mjs +0 -11
  150. package/commonjs/package/dependencies/module.f.mjs +0 -22
  151. package/commonjs/package/module.f.mjs +0 -36
  152. package/dev/index.mjs +0 -3
  153. package/dev/test.mjs +0 -60
  154. package/fsm/module.f.mjs +0 -99
  155. package/html/module.f.mjs +0 -102
  156. package/js/tokenizer/module.f.mjs +0 -872
  157. package/json/module.f.mjs +0 -89
  158. package/json/serializer/module.f.mjs +0 -87
  159. package/jsr.json +0 -66
  160. package/nodejs/version/module.f.mjs +0 -47
  161. package/out/com/cpp/module.f.d.mts +0 -7
  162. package/out/com/cpp/module.f.mjs +0 -130
  163. package/out/com/cpp/test.f.d.mts +0 -2
  164. package/out/com/cpp/test.f.mjs +0 -40
  165. package/out/com/cpp/testlib.f.d.mts +0 -2
  166. package/out/com/cpp/testlib.f.mjs +0 -7
  167. package/out/com/cs/module.f.d.mts +0 -7
  168. package/out/com/cs/module.f.mjs +0 -104
  169. package/out/com/cs/test.f.d.mts +0 -2
  170. package/out/com/cs/test.f.mjs +0 -43
  171. package/out/com/cs/testlib.f.d.mts +0 -2
  172. package/out/com/cs/testlib.f.mjs +0 -7
  173. package/out/com/rust/module.f.d.mts +0 -23
  174. package/out/com/rust/module.f.mjs +0 -224
  175. package/out/com/rust/test.f.d.mts +0 -2
  176. package/out/com/rust/test.f.mjs +0 -123
  177. package/out/com/rust/testlib.f.d.mts +0 -2
  178. package/out/com/rust/testlib.f.mjs +0 -7
  179. package/out/com/test/build.d.mts +0 -1
  180. package/out/com/test/build.f.d.mts +0 -26
  181. package/out/com/test/build.f.mjs +0 -98
  182. package/out/com/test/build.mjs +0 -40
  183. package/out/com/types/module.f.d.mts +0 -23
  184. package/out/com/types/module.f.mjs +0 -51
  185. package/out/com/types/testlib.f.d.mts +0 -44
  186. package/out/com/types/testlib.f.mjs +0 -30
  187. package/out/commonjs/build/module.f.d.mts +0 -20
  188. package/out/commonjs/build/module.f.mjs +0 -107
  189. package/out/commonjs/build/test.f.d.mts +0 -3
  190. package/out/commonjs/build/test.f.mjs +0 -102
  191. package/out/commonjs/module/function/module.f.d.mts +0 -5
  192. package/out/commonjs/module/function/module.f.mjs +0 -15
  193. package/out/commonjs/module/module.f.d.mts +0 -52
  194. package/out/commonjs/module/module.f.mjs +0 -48
  195. package/out/commonjs/module.d.mts +0 -3
  196. package/out/commonjs/module.f.d.mts +0 -2
  197. package/out/commonjs/module.f.mjs +0 -10
  198. package/out/commonjs/module.mjs +0 -26
  199. package/out/commonjs/package/dependencies/module.f.d.mts +0 -6
  200. package/out/commonjs/package/dependencies/module.f.mjs +0 -21
  201. package/out/commonjs/package/dependencies/test.f.d.mts +0 -2
  202. package/out/commonjs/package/dependencies/test.f.mjs +0 -15
  203. package/out/commonjs/package/module.f.d.mts +0 -21
  204. package/out/commonjs/package/module.f.mjs +0 -40
  205. package/out/commonjs/package/test.f.d.mts +0 -2
  206. package/out/commonjs/package/test.f.mjs +0 -27
  207. package/out/commonjs/path/module.f.d.mts +0 -60
  208. package/out/commonjs/path/module.f.mjs +0 -171
  209. package/out/commonjs/path/test.f.d.mts +0 -25
  210. package/out/commonjs/path/test.f.mjs +0 -231
  211. package/out/commonjs/test.d.mts +0 -8
  212. package/out/commonjs/test.mjs +0 -87
  213. package/out/crypto/prime_field/module.f.d.mts +0 -67
  214. package/out/crypto/prime_field/module.f.mjs +0 -110
  215. package/out/crypto/prime_field/test.f.d.mts +0 -13
  216. package/out/crypto/prime_field/test.f.mjs +0 -152
  217. package/out/crypto/secp/module.f.d.mts +0 -110
  218. package/out/crypto/secp/module.f.mjs +0 -173
  219. package/out/crypto/secp/test.f.d.mts +0 -5
  220. package/out/crypto/secp/test.f.mjs +0 -78
  221. package/out/crypto/sha2/module.f.d.mts +0 -15
  222. package/out/crypto/sha2/module.f.mjs +0 -172
  223. package/out/crypto/sha2/test.f.d.mts +0 -10
  224. package/out/crypto/sha2/test.f.mjs +0 -86
  225. package/out/dev/index.d.mts +0 -1
  226. package/out/dev/index.mjs +0 -2
  227. package/out/dev/module.d.mts +0 -26
  228. package/out/dev/module.f.d.mts +0 -1
  229. package/out/dev/module.f.mjs +0 -2
  230. package/out/dev/module.mjs +0 -167
  231. package/out/dev/test/module.f.d.mts +0 -25
  232. package/out/dev/test/module.f.mjs +0 -134
  233. package/out/dev/test.d.mts +0 -3
  234. package/out/dev/test.f.d.mts +0 -9
  235. package/out/dev/test.f.mjs +0 -58
  236. package/out/dev/test.mjs +0 -52
  237. package/out/djs/module.f.d.mts +0 -20
  238. package/out/djs/module.f.mjs +0 -79
  239. package/out/djs/parser/module.f.d.mts +0 -56
  240. package/out/djs/parser/module.f.mjs +0 -448
  241. package/out/djs/parser/test.f.d.mts +0 -13
  242. package/out/djs/parser/test.f.mjs +0 -569
  243. package/out/djs/test.f.d.mts +0 -12
  244. package/out/djs/test.f.mjs +0 -84
  245. package/out/djs/tokenizer/module.f.d.mts +0 -13
  246. package/out/djs/tokenizer/module.f.mjs +0 -91
  247. package/out/djs/tokenizer/test.f.d.mts +0 -7
  248. package/out/djs/tokenizer/test.f.mjs +0 -530
  249. package/out/fsc/module.f.d.mts +0 -7
  250. package/out/fsc/module.f.mjs +0 -105
  251. package/out/fsc/test.f.d.mts +0 -4
  252. package/out/fsc/test.f.mjs +0 -19
  253. package/out/fsm/module.f.d.mts +0 -14
  254. package/out/fsm/module.f.mjs +0 -80
  255. package/out/fsm/test.f.d.mts +0 -5
  256. package/out/fsm/test.f.mjs +0 -138
  257. package/out/html/module.f.d.mts +0 -17
  258. package/out/html/module.f.mjs +0 -80
  259. package/out/html/test.f.d.mts +0 -10
  260. package/out/html/test.f.mjs +0 -45
  261. package/out/issues/test.f.d.mts +0 -16
  262. package/out/issues/test.f.mjs +0 -66
  263. package/out/js/tokenizer/module.f.d.mts +0 -163
  264. package/out/js/tokenizer/module.f.mjs +0 -729
  265. package/out/js/tokenizer/test.f.d.mts +0 -9
  266. package/out/js/tokenizer/test.f.mjs +0 -906
  267. package/out/json/module.f.d.mts +0 -33
  268. package/out/json/module.f.mjs +0 -89
  269. package/out/json/parser/module.f.d.mts +0 -32
  270. package/out/json/parser/module.f.mjs +0 -224
  271. package/out/json/parser/test.f.d.mts +0 -5
  272. package/out/json/parser/test.f.mjs +0 -329
  273. package/out/json/serializer/module.f.d.mts +0 -36
  274. package/out/json/serializer/module.f.mjs +0 -67
  275. package/out/json/serializer/test.f.d.mts +0 -8
  276. package/out/json/serializer/test.f.mjs +0 -87
  277. package/out/json/test.f.d.mts +0 -8
  278. package/out/json/test.f.mjs +0 -61
  279. package/out/json/tokenizer/module.f.d.mts +0 -13
  280. package/out/json/tokenizer/module.f.mjs +0 -78
  281. package/out/json/tokenizer/test.f.d.mts +0 -6
  282. package/out/json/tokenizer/test.f.mjs +0 -420
  283. package/out/nanvm-lib/tests/test.f.d.mts +0 -36
  284. package/out/nanvm-lib/tests/test.f.mjs +0 -87
  285. package/out/nodejs/version/main.d.mts +0 -1
  286. package/out/nodejs/version/main.mjs +0 -3
  287. package/out/nodejs/version/module.f.d.mts +0 -12
  288. package/out/nodejs/version/module.f.mjs +0 -34
  289. package/out/nodejs/version/test.f.d.mts +0 -2
  290. package/out/nodejs/version/test.f.mjs +0 -97
  291. package/out/text/ascii/module.f.d.mts +0 -70
  292. package/out/text/ascii/module.f.mjs +0 -154
  293. package/out/text/ascii/test.f.d.mts +0 -4
  294. package/out/text/ascii/test.f.mjs +0 -14
  295. package/out/text/module.f.d.mts +0 -13
  296. package/out/text/module.f.mjs +0 -19
  297. package/out/text/sgr/module.f.d.mts +0 -12
  298. package/out/text/sgr/module.f.mjs +0 -17
  299. package/out/text/test.f.d.mts +0 -2
  300. package/out/text/test.f.mjs +0 -19
  301. package/out/text/utf16/module.f.d.mts +0 -12
  302. package/out/text/utf16/module.f.mjs +0 -86
  303. package/out/text/utf16/test.f.d.mts +0 -6
  304. package/out/text/utf16/test.f.mjs +0 -145
  305. package/out/text/utf8/module.f.d.mts +0 -10
  306. package/out/text/utf8/module.f.mjs +0 -126
  307. package/out/text/utf8/test.f.d.mts +0 -6
  308. package/out/text/utf8/test.f.mjs +0 -175
  309. package/out/types/array/module.f.d.mts +0 -31
  310. package/out/types/array/module.f.mjs +0 -95
  311. package/out/types/array/test.f.d.mts +0 -10
  312. package/out/types/array/test.f.mjs +0 -116
  313. package/out/types/bigfloat/module.f.d.mts +0 -6
  314. package/out/types/bigfloat/module.f.mjs +0 -77
  315. package/out/types/bigfloat/test.f.d.mts +0 -6
  316. package/out/types/bigfloat/test.f.mjs +0 -349
  317. package/out/types/bigint/module.f.d.mts +0 -29
  318. package/out/types/bigint/module.f.mjs +0 -114
  319. package/out/types/bigint/test.f.d.mts +0 -16
  320. package/out/types/bigint/test.f.mjs +0 -199
  321. package/out/types/bit_vec/module.f.d.mts +0 -72
  322. package/out/types/bit_vec/module.f.mjs +0 -83
  323. package/out/types/bit_vec/test.f.d.mts +0 -9
  324. package/out/types/bit_vec/test.f.mjs +0 -60
  325. package/out/types/btree/find/module.f.d.mts +0 -36
  326. package/out/types/btree/find/module.f.mjs +0 -137
  327. package/out/types/btree/find/test.f.d.mts +0 -2
  328. package/out/types/btree/find/test.f.mjs +0 -156
  329. package/out/types/btree/module.f.d.mts +0 -5
  330. package/out/types/btree/module.f.mjs +0 -34
  331. package/out/types/btree/remove/module.f.d.mts +0 -14
  332. package/out/types/btree/remove/module.f.mjs +0 -209
  333. package/out/types/btree/remove/test.f.d.mts +0 -7
  334. package/out/types/btree/remove/test.f.mjs +0 -638
  335. package/out/types/btree/set/module.f.d.mts +0 -5
  336. package/out/types/btree/set/module.f.mjs +0 -114
  337. package/out/types/btree/set/test.f.d.mts +0 -2
  338. package/out/types/btree/set/test.f.mjs +0 -390
  339. package/out/types/btree/test.f.d.mts +0 -13
  340. package/out/types/btree/test.f.mjs +0 -83
  341. package/out/types/btree/types/module.f.d.mts +0 -14
  342. package/out/types/btree/types/module.f.mjs +0 -50
  343. package/out/types/byte_set/module.f.d.mts +0 -25
  344. package/out/types/byte_set/module.f.mjs +0 -42
  345. package/out/types/byte_set/test.f.d.mts +0 -13
  346. package/out/types/byte_set/test.f.mjs +0 -123
  347. package/out/types/function/compare/module.f.d.mts +0 -23
  348. package/out/types/function/compare/module.f.mjs +0 -22
  349. package/out/types/function/compare/test.f.d.mts +0 -2
  350. package/out/types/function/compare/test.f.mjs +0 -8
  351. package/out/types/function/module.f.d.mts +0 -51
  352. package/out/types/function/module.f.mjs +0 -44
  353. package/out/types/function/operator/module.f.d.mts +0 -60
  354. package/out/types/function/operator/module.f.mjs +0 -60
  355. package/out/types/function/test.f.d.mts +0 -2
  356. package/out/types/function/test.f.mjs +0 -15
  357. package/out/types/list/module.f.d.mts +0 -82
  358. package/out/types/list/module.f.mjs +0 -269
  359. package/out/types/list/test.f.d.mts +0 -38
  360. package/out/types/list/test.f.mjs +0 -401
  361. package/out/types/map/module.f.d.mts +0 -21
  362. package/out/types/map/module.f.mjs +0 -54
  363. package/out/types/map/test.f.d.mts +0 -5
  364. package/out/types/map/test.f.mjs +0 -115
  365. package/out/types/nibble_set/module.f.d.mts +0 -16
  366. package/out/types/nibble_set/module.f.mjs +0 -19
  367. package/out/types/nibble_set/test.f.d.mts +0 -13
  368. package/out/types/nibble_set/test.f.mjs +0 -90
  369. package/out/types/nullable/module.f.d.mts +0 -9
  370. package/out/types/nullable/module.f.mjs +0 -9
  371. package/out/types/nullable/test.f.d.mts +0 -2
  372. package/out/types/nullable/test.f.mjs +0 -12
  373. package/out/types/number/module.f.d.mts +0 -7
  374. package/out/types/number/module.f.mjs +0 -12
  375. package/out/types/number/test.f.d.mts +0 -11
  376. package/out/types/number/test.f.mjs +0 -126
  377. package/out/types/object/module.f.d.mts +0 -22
  378. package/out/types/object/module.f.mjs +0 -27
  379. package/out/types/object/test.f.d.mts +0 -5
  380. package/out/types/object/test.f.mjs +0 -17
  381. package/out/types/range/module.f.d.mts +0 -6
  382. package/out/types/range/module.f.mjs +0 -6
  383. package/out/types/range/test.f.d.mts +0 -2
  384. package/out/types/range/test.f.mjs +0 -18
  385. package/out/types/range_map/module.f.d.mts +0 -19
  386. package/out/types/range_map/module.f.mjs +0 -84
  387. package/out/types/range_map/test.f.d.mts +0 -6
  388. package/out/types/range_map/test.f.mjs +0 -201
  389. package/out/types/result/module.d.mts +0 -7
  390. package/out/types/result/module.f.d.mts +0 -22
  391. package/out/types/result/module.f.mjs +0 -25
  392. package/out/types/result/module.mjs +0 -16
  393. package/out/types/sorted_list/module.f.d.mts +0 -53
  394. package/out/types/sorted_list/module.f.mjs +0 -102
  395. package/out/types/sorted_list/test.f.d.mts +0 -5
  396. package/out/types/sorted_list/test.f.mjs +0 -66
  397. package/out/types/sorted_set/module.f.d.mts +0 -19
  398. package/out/types/sorted_set/module.f.mjs +0 -29
  399. package/out/types/sorted_set/test.f.d.mts +0 -6
  400. package/out/types/sorted_set/test.f.mjs +0 -80
  401. package/out/types/string/module.f.d.mts +0 -9
  402. package/out/types/string/module.f.mjs +0 -17
  403. package/out/types/string/test.f.d.mts +0 -15
  404. package/out/types/string/test.f.mjs +0 -58
  405. package/out/types/string_set/module.f.d.mts +0 -13
  406. package/out/types/string_set/module.f.mjs +0 -29
  407. package/out/types/string_set/test.f.d.mts +0 -5
  408. package/out/types/string_set/test.f.mjs +0 -65
  409. package/text/module.f.mjs +0 -27
  410. package/text/utf16/module.f.mjs +0 -96
  411. package/types/array/module.f.mjs +0 -119
  412. package/types/bit_vec/module.f.mjs +0 -90
  413. package/types/bit_vec/test.f.mjs +0 -41
  414. package/types/btree/find/module.f.mjs +0 -125
  415. package/types/btree/types/module.f.mjs +0 -64
  416. package/types/byte_set/module.f.mjs +0 -61
  417. package/types/function/compare/module.f.mjs +0 -29
  418. package/types/function/module.f.mjs +0 -50
  419. package/types/function/operator/module.f.mjs +0 -78
  420. package/types/function/test.f.mjs +0 -17
  421. package/types/list/module.f.mjs +0 -320
  422. package/types/map/module.f.mjs +0 -67
  423. package/types/nibble_set/module.f.mjs +0 -28
  424. package/types/nullable/module.f.mjs +0 -11
  425. package/types/number/module.f.mjs +0 -16
  426. package/types/object/module.f.mjs +0 -33
  427. package/types/range/module.f.mjs +0 -8
  428. package/types/range_map/module.f.mjs +0 -84
  429. package/types/result/module.f.mjs +0 -28
  430. package/types/sorted_list/module.f.mjs +0 -107
  431. package/types/sorted_set/module.f.mjs +0 -38
  432. package/types/string/module.f.mjs +0 -22
  433. package/types/string_set/module.f.mjs +0 -36
@@ -1,11 +1,12 @@
1
- import * as encoding from './module.f.mjs'
2
- import * as json from '../../json/module.f.mjs'
3
- import * as o from '../../types/object/module.f.mjs'
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.mjs'
5
+ import * as list from '../../types/list/module.f.ts'
6
6
 
7
- /** @type {(a: readonly json.Unknown[]) => string} */
8
- const stringify = a => json.stringify(sort)(a)
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
- // @ts-self-types="./module.f.d.mts"
2
- import * as list from '../../types/list/module.f.mjs'
3
- import * as operator from '../../types/function/operator/module.f.mjs'
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
- /** @typedef {u8|null} ByteOrEof */
6
+ type ByteOrEof = u8|null
8
7
 
9
- /** @typedef {Array.Array1<number>|Array.Array2<number>|Array.Array3<number>} Utf8NonEmptyState */
8
+ type Utf8NonEmptyState = Array.Array1<number>|Array.Array2<number>|Array.Array3<number>
10
9
 
11
- /** @typedef {null|Utf8NonEmptyState} Utf8State */
10
+ type Utf8State = null|Utf8NonEmptyState
12
11
 
13
- /** @typedef {number} u8 */
12
+ type u8 = number
14
13
 
15
- /** @typedef {number} i32 */
14
+ type i32 = number
16
15
 
17
16
  const errorMask = 0b1000_0000_0000_0000_0000_0000_0000_0000
18
17
 
19
- /** @type {(input:number) => list.List<u8>} */
20
- const codePointToUtf8 = input => {
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
- /** @type {(state: Utf8NonEmptyState) => i32}*/
37
- const utf8StateToError = state => {
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
- /** @type {operator.StateScan<number, Utf8State, list.List<i32>>} */
63
- const utf8ByteToCodePointOp = state => byte => {
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
- /** @type {(state: Utf8State) => readonly[list.List<i32>, Utf8State]} */
99
- const utf8EofToCodePointOp = state =>
100
+ const utf8EofToCodePointOp
101
+ : (state: Utf8State) => readonly[list.List<i32>, Utf8State]
102
+ = state =>
100
103
  [state === null ? null : [utf8StateToError(state)], null]
101
104
 
102
- /** @type {operator.StateScan<ByteOrEof, Utf8State, list.List<i32>>} */
103
- const utf8ByteOrEofToCodePointOp = state => input => input === null ? utf8EofToCodePointOp(state) : utf8ByteToCodePointOp(state)(input)
105
+ const utf8ByteOrEofToCodePointOp
106
+ : operator.StateScan<ByteOrEof, Utf8State, list.List<i32>>
107
+ = state => input => input === null ? utf8EofToCodePointOp(state) : utf8ByteToCodePointOp(state)(input)
104
108
 
105
- /** @type {list.List<ByteOrEof>} */
106
- const eofList = [null]
109
+ const eofList
110
+ : list.List<ByteOrEof>
111
+ = [null]
107
112
 
108
- /** @type {(input: list.List<u8>) => list.List<i32>} */
109
- export const toCodePointList = input => flat(stateScan(utf8ByteOrEofToCodePointOp)(null)(flat([input, eofList])))
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.mjs'
2
- import * as json from '../../json/module.f.mjs'
3
- import * as o from '../../types/object/module.f.mjs'
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.mjs'
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.mjs'
2
- import * as json from '../../json/module.f.mjs'
3
- import * as o from '../object/module.f.mjs'
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
- // @ts-self-types="./module.f.d.mts"
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
- /** @typedef {readonly[bigint,number]} BigFloat */
4
+ export type BigFloat = readonly[bigint,number]
6
5
 
7
- /** @typedef {readonly[BigFloat,bigint]} BigFloatWithRemainder */
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
- /** @type {(value: BigFloat) => (min: bigint) => BigFloat} */
13
- const increaseMantissa = ([m, e]) => min => {
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
- /** @type {(value: BigFloat) => (max: bigint) => BigFloat} */
29
- const decreaseMantissa = ([m, e]) => max => {
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
- /** @type {(base: bigint) => (exp: number) => bigint} */
45
- const pow = base => exp => base ** BigInt(exp)
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
- /** @type {(b: BigFloat) => (mul: bigint) => BigFloat} */
50
- export const multiply = ([m, e]) => mul => [m * mul, e]
51
+ export const multiply
52
+ : (b: BigFloat) => (mul: bigint) => BigFloat
53
+ = ([m, e]) => mul => [m * mul, e]
51
54
 
52
- /** @type {(b: BigFloat) => (div: bigint) => BigFloatWithRemainder} */
53
- const divide = ([m, e]) => div => [[m / div, e], m % div]
55
+ const divide
56
+ : (b: BigFloat) => (div: bigint) => BigFloatWithRemainder
57
+ = ([m, e]) => div => [[m / div, e], m % div]
54
58
 
55
- /** @type {(b: BigFloatWithRemainder) => BigFloat} */
56
- const round53 = ([[m, e], r]) => {
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
- /** @type {(dec: BigFloat) => BigFloat} */
71
- export const decToBin = dec => {
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
- /** @type {BigFloat} */
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,4 +1,4 @@
1
- import * as _ from './module.f.mjs'
1
+ import * as _ from './module.f.ts'
2
2
  const { decToBin } = _
3
3
 
4
4
  export default {
@@ -1,36 +1,37 @@
1
- // @ts-self-types="./module.f.d.mts"
2
- import * as compare from '../function/compare/module.f.mjs'
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.mjs'
4
+ import * as list from '../list/module.f.ts'
6
5
  const { reduce } = list
7
6
 
8
- /** @typedef {Operator.Unary<bigint, bigint>} Unary*/
7
+ type Unary = Operator.Unary<bigint, bigint>
9
8
 
10
- /** @type {(a: bigint) => (b: bigint) => bigint} */
11
- export const addition = a => b => a + b
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
- /** @type {(a: bigint) => bigint} */
16
- export const abs = a => a >= 0 ? a : -a
15
+ export const abs
16
+ : (a: bigint) => bigint
17
+ = a => a >= 0 ? a : -a
17
18
 
18
- /** @type {(a: bigint) => compare.Sign} */
19
- export const sign = a => unsafeCmp(a)(0n)
19
+ export const sign
20
+ : (a: bigint) => compare.Sign
21
+ = a => unsafeCmp(a)(0n)
20
22
 
21
- /** @type {(a: bigint) => string} */
22
- export const serialize = a => `${a}n`
23
+ export const serialize
24
+ : (a: bigint) => string
25
+ = a => `${a}n`
23
26
 
24
- /**
25
- * @template T
26
- * @typedef {{
27
- * readonly 0: T
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
- /** @type {<T>(a: Additive<T>) => (a: T) => (n: bigint) => T} */
33
- export const scalar_mul = ({ 0: _0, add }) => a => n => {
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 {bigint} v - The input BigInt.
58
- * @returns {bigint} The base-2 logarithm (floor) of the input BigInt, or `-1n` if the input is less than or equal to 0.
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 {bigint} v - The input BigInt.
108
- * @returns {bigint} The bit length of the input BigInt.
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
@@ -1,4 +1,4 @@
1
- import * as _ from './module.f.mjs'
1
+ import * as _ from './module.f.ts'
2
2
  const { sum, abs, serialize, log2, bitLength } = _
3
3
 
4
4
  export default {
@@ -141,4 +141,4 @@ export default {
141
141
  },
142
142
  ]
143
143
  }
144
- }
144
+ }
@@ -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)