type-plus 6.8.1 → 7.0.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 (531) hide show
  1. package/README.md +1054 -355
  2. package/cjs/array/{array.d.ts → array.at.d.ts} +4 -14
  3. package/cjs/array/array.at.d.ts.map +1 -0
  4. package/cjs/array/{pad_left.js → array.at.js} +1 -1
  5. package/cjs/array/array.at.js.map +1 -0
  6. package/cjs/array/array.concat.d.ts +13 -0
  7. package/cjs/array/array.concat.d.ts.map +1 -0
  8. package/cjs/array/array.concat.js +3 -0
  9. package/cjs/array/array.concat.js.map +1 -0
  10. package/cjs/array/array.entries.d.ts +17 -0
  11. package/cjs/array/array.entries.d.ts.map +1 -0
  12. package/cjs/array/array.entries.js +3 -0
  13. package/cjs/array/array.entries.js.map +1 -0
  14. package/cjs/array/array.find.d.ts +21 -0
  15. package/cjs/array/array.find.d.ts.map +1 -0
  16. package/cjs/array/{find_first.js → array.find.js} +1 -1
  17. package/cjs/array/array.find.js.map +1 -0
  18. package/cjs/array/array.find_last.d.ts +17 -0
  19. package/cjs/array/array.find_last.d.ts.map +1 -0
  20. package/cjs/array/array.find_last.js +3 -0
  21. package/cjs/array/array.find_last.js.map +1 -0
  22. package/cjs/array/array.reverse.d.ts +2 -0
  23. package/cjs/array/array.reverse.d.ts.map +1 -0
  24. package/cjs/array/array.reverse.js +3 -0
  25. package/cjs/array/array.reverse.js.map +1 -0
  26. package/cjs/array/array.some.d.ts +29 -0
  27. package/cjs/array/array.some.d.ts.map +1 -0
  28. package/cjs/array/array.some.js +3 -0
  29. package/cjs/array/array.some.js.map +1 -0
  30. package/cjs/array/array_index.d.ts +8 -8
  31. package/cjs/array/array_index.d.ts.map +1 -1
  32. package/cjs/array/array_plus.d.ts +9 -1
  33. package/cjs/array/array_plus.d.ts.map +1 -1
  34. package/cjs/array/array_plus.split_at.d.ts +30 -0
  35. package/cjs/array/array_plus.split_at.d.ts.map +1 -0
  36. package/cjs/array/array_plus.split_at.js +3 -0
  37. package/cjs/array/array_plus.split_at.js.map +1 -0
  38. package/cjs/array/drop.d.ts +2 -2
  39. package/cjs/array/drop.d.ts.map +1 -1
  40. package/cjs/array/index.d.ts +4 -5
  41. package/cjs/array/index.d.ts.map +1 -1
  42. package/cjs/array/index.js +4 -5
  43. package/cjs/array/index.js.map +1 -1
  44. package/cjs/array/pad_start.d.ts +32 -0
  45. package/cjs/array/pad_start.d.ts.map +1 -0
  46. package/cjs/array/{find_last.js → pad_start.js} +1 -1
  47. package/cjs/array/pad_start.js.map +1 -0
  48. package/cjs/assertion/assert_type.d.ts +3 -0
  49. package/cjs/assertion/assert_type.d.ts.map +1 -1
  50. package/cjs/assertion/assert_type.js +3 -0
  51. package/cjs/assertion/assert_type.js.map +1 -1
  52. package/cjs/bigint/cast.d.ts +10 -0
  53. package/cjs/bigint/cast.d.ts.map +1 -0
  54. package/cjs/{array/some.js → bigint/cast.js} +1 -1
  55. package/cjs/bigint/cast.js.map +1 -0
  56. package/cjs/equal/equal.d.ts +51 -3
  57. package/cjs/equal/equal.d.ts.map +1 -1
  58. package/cjs/functional/Maybe.d.ts +2 -2
  59. package/cjs/functional/Maybe.d.ts.map +1 -1
  60. package/cjs/index.d.ts +16 -7
  61. package/cjs/index.d.ts.map +1 -1
  62. package/cjs/index.js +6 -1
  63. package/cjs/index.js.map +1 -1
  64. package/cjs/math/abs.d.ts +6 -0
  65. package/cjs/math/abs.d.ts.map +1 -0
  66. package/cjs/math/{Add.js → abs.js} +1 -1
  67. package/cjs/math/abs.js.map +1 -0
  68. package/cjs/math/add.d.ts +7 -0
  69. package/cjs/math/add.d.ts.map +1 -0
  70. package/cjs/math/{Max.js → add.js} +1 -1
  71. package/cjs/math/add.js.map +1 -0
  72. package/cjs/math/greater_than.d.ts +4 -0
  73. package/cjs/math/greater_than.d.ts.map +1 -0
  74. package/cjs/math/greater_than.js +3 -0
  75. package/cjs/math/greater_than.js.map +1 -0
  76. package/cjs/math/index.d.ts +6 -6
  77. package/cjs/math/index.d.ts.map +1 -1
  78. package/cjs/math/math_plus.d.ts +5 -0
  79. package/cjs/math/math_plus.d.ts.map +1 -0
  80. package/cjs/math/math_plus.js +3 -0
  81. package/cjs/math/math_plus.js.map +1 -0
  82. package/cjs/math/math_plus.to_negative.d.ts +13 -0
  83. package/cjs/math/math_plus.to_negative.d.ts.map +1 -0
  84. package/cjs/math/math_plus.to_negative.js +3 -0
  85. package/cjs/math/math_plus.to_negative.js.map +1 -0
  86. package/cjs/math/max.d.ts +4 -0
  87. package/cjs/math/max.d.ts.map +1 -0
  88. package/cjs/math/{Abs.js → max.js} +1 -1
  89. package/cjs/math/max.js.map +1 -0
  90. package/cjs/math/multiply.d.ts +6 -0
  91. package/cjs/math/multiply.d.ts.map +1 -0
  92. package/cjs/{array/array.js → math/multiply.js} +1 -1
  93. package/cjs/math/multiply.js.map +1 -0
  94. package/cjs/math/numeric_struct.d.ts +1469 -0
  95. package/cjs/math/numeric_struct.d.ts.map +1 -0
  96. package/cjs/math/numeric_struct.js +3 -0
  97. package/cjs/math/numeric_struct.js.map +1 -0
  98. package/cjs/math/subtract.d.ts +7 -0
  99. package/cjs/math/subtract.d.ts.map +1 -0
  100. package/cjs/math/subtract.js +3 -0
  101. package/cjs/math/subtract.js.map +1 -0
  102. package/cjs/nominal/brand.js +2 -2
  103. package/cjs/nominal/brand.js.map +1 -1
  104. package/cjs/nominal/flavor.js +2 -2
  105. package/cjs/nominal/flavor.js.map +1 -1
  106. package/cjs/number/cast.d.ts +10 -0
  107. package/cjs/number/cast.d.ts.map +1 -0
  108. package/cjs/number/cast.js +3 -0
  109. package/cjs/number/cast.js.map +1 -0
  110. package/cjs/number/number_array.d.ts +0 -2
  111. package/cjs/number/number_array.d.ts.map +1 -1
  112. package/cjs/number/number_array.js +14 -1
  113. package/cjs/number/number_array.js.map +1 -1
  114. package/cjs/number/number_plus.d.ts +4 -5
  115. package/cjs/number/number_plus.d.ts.map +1 -1
  116. package/cjs/number/strict_number_type.d.ts +12 -0
  117. package/cjs/number/strict_number_type.d.ts.map +1 -1
  118. package/cjs/numeric/cast.d.ts +27 -0
  119. package/cjs/numeric/cast.d.ts.map +1 -0
  120. package/cjs/numeric/cast.js +3 -0
  121. package/cjs/numeric/cast.js.map +1 -0
  122. package/{esm/number → cjs/numeric}/integer.d.ts +2 -0
  123. package/cjs/numeric/integer.d.ts.map +1 -0
  124. package/cjs/{number → numeric}/integer.js.map +1 -1
  125. package/cjs/numeric/negative.d.ts.map +1 -0
  126. package/cjs/{number → numeric}/negative.js.map +1 -1
  127. package/cjs/numeric/numeric_plus.d.ts +5 -0
  128. package/cjs/numeric/numeric_plus.d.ts.map +1 -0
  129. package/cjs/numeric/numeric_plus.js +3 -0
  130. package/cjs/numeric/numeric_plus.js.map +1 -0
  131. package/cjs/numeric/numeric_type.d.ts.map +1 -0
  132. package/cjs/{number → numeric}/numeric_type.js.map +1 -1
  133. package/cjs/{number → numeric}/positive.d.ts +2 -2
  134. package/cjs/numeric/positive.d.ts.map +1 -0
  135. package/cjs/{number → numeric}/positive.js.map +1 -1
  136. package/cjs/object/ANotB.d.ts +3 -3
  137. package/cjs/object/ANotB.d.ts.map +1 -1
  138. package/cjs/object/Partial.d.ts +6 -0
  139. package/cjs/object/Partial.d.ts.map +1 -1
  140. package/cjs/object/Required.d.ts +4 -0
  141. package/cjs/object/Required.d.ts.map +1 -1
  142. package/cjs/object/index.d.ts +1 -1
  143. package/cjs/object/index.d.ts.map +1 -1
  144. package/cjs/object/object_type.d.ts +1 -1
  145. package/cjs/object/split.d.ts +3 -1
  146. package/cjs/object/split.d.ts.map +1 -1
  147. package/cjs/object/split.js.map +1 -1
  148. package/cjs/predicates/CanAssign.d.ts +35 -0
  149. package/cjs/predicates/CanAssign.d.ts.map +1 -1
  150. package/cjs/predicates/CanAssign.js.map +1 -1
  151. package/cjs/predicates/Extends.d.ts +2 -2
  152. package/cjs/predicates/Extends.d.ts.map +1 -1
  153. package/cjs/predicates/index.d.ts +0 -1
  154. package/cjs/predicates/index.d.ts.map +1 -1
  155. package/cjs/predicates/index.js +0 -1
  156. package/cjs/predicates/index.js.map +1 -1
  157. package/cjs/testing/test_type.d.ts +125 -50
  158. package/cjs/testing/test_type.d.ts.map +1 -1
  159. package/cjs/testing/test_type.js +4 -141
  160. package/cjs/testing/test_type.js.map +1 -1
  161. package/cjs/tuple/create_tuple.d.ts +28 -0
  162. package/cjs/tuple/create_tuple.d.ts.map +1 -0
  163. package/cjs/{array → tuple}/create_tuple.js.map +1 -1
  164. package/cjs/tuple/tuple_plus.d.ts +2 -0
  165. package/cjs/tuple/tuple_plus.d.ts.map +1 -0
  166. package/cjs/tuple/tuple_plus.js +18 -0
  167. package/cjs/tuple/tuple_plus.js.map +1 -0
  168. package/cjs/tuple/tuple_plus.pad_start.d.ts +22 -0
  169. package/cjs/tuple/tuple_plus.pad_start.d.ts.map +1 -0
  170. package/cjs/tuple/tuple_plus.pad_start.js +3 -0
  171. package/cjs/tuple/tuple_plus.pad_start.js.map +1 -0
  172. package/cjs/{predicates/isType.d.ts → type-guard/is_type.d.ts} +5 -3
  173. package/cjs/type-guard/is_type.d.ts.map +1 -0
  174. package/cjs/{predicates/isType.js → type-guard/is_type.js} +8 -2
  175. package/cjs/type-guard/is_type.js.map +1 -0
  176. package/esm/array/{array.d.ts → array.at.d.ts} +4 -14
  177. package/esm/array/array.at.d.ts.map +1 -0
  178. package/esm/array/array.at.js +2 -0
  179. package/esm/array/array.at.js.map +1 -0
  180. package/esm/array/array.concat.d.ts +13 -0
  181. package/esm/array/array.concat.d.ts.map +1 -0
  182. package/esm/array/array.concat.js +2 -0
  183. package/esm/array/array.concat.js.map +1 -0
  184. package/esm/array/array.entries.d.ts +17 -0
  185. package/esm/array/array.entries.d.ts.map +1 -0
  186. package/esm/array/array.entries.js +2 -0
  187. package/esm/array/array.entries.js.map +1 -0
  188. package/esm/array/array.find.d.ts +21 -0
  189. package/esm/array/array.find.d.ts.map +1 -0
  190. package/esm/array/array.find.js +2 -0
  191. package/esm/array/array.find.js.map +1 -0
  192. package/esm/array/array.find_last.d.ts +17 -0
  193. package/esm/array/array.find_last.d.ts.map +1 -0
  194. package/esm/array/array.find_last.js +2 -0
  195. package/esm/array/array.find_last.js.map +1 -0
  196. package/esm/array/array.reverse.d.ts +2 -0
  197. package/esm/array/array.reverse.d.ts.map +1 -0
  198. package/esm/array/array.reverse.js +2 -0
  199. package/esm/array/array.reverse.js.map +1 -0
  200. package/esm/array/array.some.d.ts +29 -0
  201. package/esm/array/array.some.d.ts.map +1 -0
  202. package/esm/array/array.some.js +2 -0
  203. package/esm/array/array.some.js.map +1 -0
  204. package/esm/array/array_index.d.ts +8 -8
  205. package/esm/array/array_index.d.ts.map +1 -1
  206. package/esm/array/array_plus.d.ts +9 -1
  207. package/esm/array/array_plus.d.ts.map +1 -1
  208. package/esm/array/array_plus.split_at.d.ts +30 -0
  209. package/esm/array/array_plus.split_at.d.ts.map +1 -0
  210. package/esm/array/array_plus.split_at.js +2 -0
  211. package/esm/array/array_plus.split_at.js.map +1 -0
  212. package/esm/array/drop.d.ts +2 -2
  213. package/esm/array/drop.d.ts.map +1 -1
  214. package/esm/array/index.d.ts +4 -5
  215. package/esm/array/index.d.ts.map +1 -1
  216. package/esm/array/index.js +4 -5
  217. package/esm/array/index.js.map +1 -1
  218. package/esm/array/pad_start.d.ts +32 -0
  219. package/esm/array/pad_start.d.ts.map +1 -0
  220. package/esm/array/pad_start.js +2 -0
  221. package/esm/array/pad_start.js.map +1 -0
  222. package/esm/assertion/assert_type.d.ts +3 -0
  223. package/esm/assertion/assert_type.d.ts.map +1 -1
  224. package/esm/assertion/assert_type.js +3 -0
  225. package/esm/assertion/assert_type.js.map +1 -1
  226. package/esm/bigint/cast.d.ts +10 -0
  227. package/esm/bigint/cast.d.ts.map +1 -0
  228. package/esm/bigint/cast.js +2 -0
  229. package/esm/bigint/cast.js.map +1 -0
  230. package/esm/equal/equal.d.ts +51 -3
  231. package/esm/equal/equal.d.ts.map +1 -1
  232. package/esm/functional/Maybe.d.ts +2 -2
  233. package/esm/functional/Maybe.d.ts.map +1 -1
  234. package/esm/index.d.ts +16 -7
  235. package/esm/index.d.ts.map +1 -1
  236. package/esm/index.js +5 -0
  237. package/esm/index.js.map +1 -1
  238. package/esm/math/abs.d.ts +6 -0
  239. package/esm/math/abs.d.ts.map +1 -0
  240. package/esm/math/abs.js +2 -0
  241. package/esm/math/abs.js.map +1 -0
  242. package/esm/math/add.d.ts +7 -0
  243. package/esm/math/add.d.ts.map +1 -0
  244. package/esm/math/add.js +2 -0
  245. package/esm/math/add.js.map +1 -0
  246. package/esm/math/greater_than.d.ts +4 -0
  247. package/esm/math/greater_than.d.ts.map +1 -0
  248. package/esm/math/greater_than.js +2 -0
  249. package/esm/math/greater_than.js.map +1 -0
  250. package/esm/math/index.d.ts +6 -6
  251. package/esm/math/index.d.ts.map +1 -1
  252. package/esm/math/math_plus.d.ts +5 -0
  253. package/esm/math/math_plus.d.ts.map +1 -0
  254. package/esm/math/math_plus.js +2 -0
  255. package/esm/math/math_plus.js.map +1 -0
  256. package/esm/math/math_plus.to_negative.d.ts +13 -0
  257. package/esm/math/math_plus.to_negative.d.ts.map +1 -0
  258. package/esm/math/math_plus.to_negative.js +2 -0
  259. package/esm/math/math_plus.to_negative.js.map +1 -0
  260. package/esm/math/max.d.ts +4 -0
  261. package/esm/math/max.d.ts.map +1 -0
  262. package/esm/math/max.js +2 -0
  263. package/esm/math/max.js.map +1 -0
  264. package/esm/math/multiply.d.ts +6 -0
  265. package/esm/math/multiply.d.ts.map +1 -0
  266. package/esm/math/multiply.js +2 -0
  267. package/esm/math/multiply.js.map +1 -0
  268. package/esm/math/numeric_struct.d.ts +1469 -0
  269. package/esm/math/numeric_struct.d.ts.map +1 -0
  270. package/esm/math/numeric_struct.js +2 -0
  271. package/esm/math/numeric_struct.js.map +1 -0
  272. package/esm/math/subtract.d.ts +7 -0
  273. package/esm/math/subtract.d.ts.map +1 -0
  274. package/esm/math/subtract.js +2 -0
  275. package/esm/math/subtract.js.map +1 -0
  276. package/esm/nominal/brand.js +1 -1
  277. package/esm/nominal/brand.js.map +1 -1
  278. package/esm/nominal/flavor.js +1 -1
  279. package/esm/nominal/flavor.js.map +1 -1
  280. package/esm/number/cast.d.ts +10 -0
  281. package/esm/number/cast.d.ts.map +1 -0
  282. package/esm/number/cast.js +2 -0
  283. package/esm/number/cast.js.map +1 -0
  284. package/esm/number/number_array.d.ts +1 -2
  285. package/esm/number/number_array.d.ts.map +1 -1
  286. package/esm/number/number_array.js +14 -0
  287. package/esm/number/number_array.js.map +1 -1
  288. package/esm/number/number_plus.d.ts +4 -5
  289. package/esm/number/number_plus.d.ts.map +1 -1
  290. package/esm/number/strict_number_type.d.ts +12 -0
  291. package/esm/number/strict_number_type.d.ts.map +1 -1
  292. package/esm/numeric/cast.d.ts +27 -0
  293. package/esm/numeric/cast.d.ts.map +1 -0
  294. package/esm/numeric/cast.js +2 -0
  295. package/esm/numeric/cast.js.map +1 -0
  296. package/{cjs/number → esm/numeric}/integer.d.ts +2 -0
  297. package/esm/numeric/integer.d.ts.map +1 -0
  298. package/esm/{number → numeric}/integer.js.map +1 -1
  299. package/esm/numeric/negative.d.ts.map +1 -0
  300. package/esm/{number → numeric}/negative.js.map +1 -1
  301. package/esm/numeric/numeric_plus.d.ts +5 -0
  302. package/esm/numeric/numeric_plus.d.ts.map +1 -0
  303. package/esm/numeric/numeric_plus.js +2 -0
  304. package/esm/numeric/numeric_plus.js.map +1 -0
  305. package/esm/numeric/numeric_type.d.ts.map +1 -0
  306. package/esm/{number → numeric}/numeric_type.js.map +1 -1
  307. package/esm/{number → numeric}/positive.d.ts +2 -2
  308. package/esm/numeric/positive.d.ts.map +1 -0
  309. package/esm/{number → numeric}/positive.js.map +1 -1
  310. package/esm/object/ANotB.d.ts +3 -3
  311. package/esm/object/ANotB.d.ts.map +1 -1
  312. package/esm/object/Partial.d.ts +6 -0
  313. package/esm/object/Partial.d.ts.map +1 -1
  314. package/esm/object/Required.d.ts +4 -0
  315. package/esm/object/Required.d.ts.map +1 -1
  316. package/esm/object/index.d.ts +1 -1
  317. package/esm/object/index.d.ts.map +1 -1
  318. package/esm/object/object_type.d.ts +1 -1
  319. package/esm/object/split.d.ts +3 -1
  320. package/esm/object/split.d.ts.map +1 -1
  321. package/esm/object/split.js.map +1 -1
  322. package/esm/predicates/CanAssign.d.ts +35 -0
  323. package/esm/predicates/CanAssign.d.ts.map +1 -1
  324. package/esm/predicates/CanAssign.js.map +1 -1
  325. package/esm/predicates/Extends.d.ts +2 -2
  326. package/esm/predicates/Extends.d.ts.map +1 -1
  327. package/esm/predicates/index.d.ts +0 -1
  328. package/esm/predicates/index.d.ts.map +1 -1
  329. package/esm/predicates/index.js +0 -1
  330. package/esm/predicates/index.js.map +1 -1
  331. package/esm/testing/test_type.d.ts +125 -50
  332. package/esm/testing/test_type.d.ts.map +1 -1
  333. package/esm/testing/test_type.js +4 -141
  334. package/esm/testing/test_type.js.map +1 -1
  335. package/esm/tuple/create_tuple.d.ts +28 -0
  336. package/esm/tuple/create_tuple.d.ts.map +1 -0
  337. package/esm/{array → tuple}/create_tuple.js.map +1 -1
  338. package/esm/tuple/tuple_plus.d.ts +2 -0
  339. package/esm/tuple/tuple_plus.d.ts.map +1 -0
  340. package/esm/tuple/tuple_plus.js +2 -0
  341. package/esm/tuple/tuple_plus.js.map +1 -0
  342. package/esm/tuple/tuple_plus.pad_start.d.ts +22 -0
  343. package/esm/tuple/tuple_plus.pad_start.d.ts.map +1 -0
  344. package/esm/tuple/tuple_plus.pad_start.js +2 -0
  345. package/esm/tuple/tuple_plus.pad_start.js.map +1 -0
  346. package/esm/{predicates/isType.d.ts → type-guard/is_type.d.ts} +5 -3
  347. package/esm/type-guard/is_type.d.ts.map +1 -0
  348. package/esm/{predicates/isType.js → type-guard/is_type.js} +8 -2
  349. package/esm/type-guard/is_type.js.map +1 -0
  350. package/package.json +1 -1
  351. package/ts/array/{array.ts → array.at.ts} +10 -15
  352. package/ts/array/array.concat.ts +12 -0
  353. package/ts/array/array.entries.ts +24 -0
  354. package/ts/array/array.find.ts +32 -0
  355. package/ts/array/array.find_last.ts +27 -0
  356. package/ts/array/array.reverse.ts +16 -0
  357. package/ts/array/array.some.ts +53 -0
  358. package/ts/array/array_index.ts +16 -10
  359. package/ts/array/array_plus.split_at.ts +47 -0
  360. package/ts/array/array_plus.ts +9 -1
  361. package/ts/array/drop.ts +2 -2
  362. package/ts/array/index.ts +4 -5
  363. package/ts/array/pad_start.ts +43 -0
  364. package/ts/array/readme.md +184 -4
  365. package/ts/assertion/assert_type.ts +6 -0
  366. package/ts/assertion/readme.md +132 -1
  367. package/ts/bigint/cast.ts +13 -0
  368. package/ts/bigint/readme.md +17 -17
  369. package/ts/equal/equal.ts +53 -3
  370. package/ts/equal/readme.md +30 -16
  371. package/ts/functional/Maybe.ts +2 -2
  372. package/ts/index.ts +22 -24
  373. package/ts/math/README.md +97 -7
  374. package/ts/math/abs.ts +18 -0
  375. package/ts/math/add.ts +14 -0
  376. package/ts/math/greater_than.ts +12 -0
  377. package/ts/math/index.ts +7 -6
  378. package/ts/math/math_plus.to_negative.ts +22 -0
  379. package/ts/math/math_plus.ts +4 -0
  380. package/ts/math/max.ts +13 -0
  381. package/ts/math/multiply.ts +12 -0
  382. package/ts/math/numeric_struct.ts +658 -0
  383. package/ts/math/subtract.ts +14 -0
  384. package/ts/nominal/brand.ts +1 -1
  385. package/ts/nominal/flavor.ts +1 -1
  386. package/ts/number/cast.ts +17 -0
  387. package/ts/number/number_array.ts +14 -14
  388. package/ts/number/number_plus.ts +6 -6
  389. package/ts/number/readme.md +0 -108
  390. package/ts/number/strict_number_type.ts +12 -0
  391. package/ts/numeric/cast.ts +28 -0
  392. package/ts/{number → numeric}/integer.ts +2 -0
  393. package/ts/numeric/numeric_plus.ts +12 -0
  394. package/ts/{number → numeric}/positive.ts +2 -2
  395. package/ts/numeric/readme.md +115 -0
  396. package/ts/object/ANotB.ts +3 -3
  397. package/ts/object/Partial.ts +5 -0
  398. package/ts/object/Required.ts +4 -0
  399. package/ts/object/index.ts +1 -1
  400. package/ts/object/object_type.ts +1 -1
  401. package/ts/object/split.ts +3 -1
  402. package/ts/predicates/CanAssign.ts +46 -0
  403. package/ts/predicates/Extends.ts +2 -2
  404. package/ts/predicates/index.ts +0 -1
  405. package/ts/testing/test_type.ts +131 -88
  406. package/ts/tuple/create_tuple.ts +42 -0
  407. package/ts/tuple/tuple_plus.pad_start.ts +42 -0
  408. package/ts/tuple/tuple_plus.ts +1 -0
  409. package/ts/{predicates/isType.ts → type-guard/is_type.ts} +11 -3
  410. package/ts/type-guard/readme.md +37 -0
  411. package/cjs/array/array.d.ts.map +0 -1
  412. package/cjs/array/array.js.map +0 -1
  413. package/cjs/array/create_tuple.d.ts +0 -11
  414. package/cjs/array/create_tuple.d.ts.map +0 -1
  415. package/cjs/array/find_first.d.ts +0 -6
  416. package/cjs/array/find_first.d.ts.map +0 -1
  417. package/cjs/array/find_first.js.map +0 -1
  418. package/cjs/array/find_last.d.ts +0 -2
  419. package/cjs/array/find_last.d.ts.map +0 -1
  420. package/cjs/array/find_last.js.map +0 -1
  421. package/cjs/array/pad_left.d.ts +0 -6
  422. package/cjs/array/pad_left.d.ts.map +0 -1
  423. package/cjs/array/pad_left.js.map +0 -1
  424. package/cjs/array/some.d.ts +0 -8
  425. package/cjs/array/some.d.ts.map +0 -1
  426. package/cjs/array/some.js.map +0 -1
  427. package/cjs/math/Abs.d.ts +0 -3
  428. package/cjs/math/Abs.d.ts.map +0 -1
  429. package/cjs/math/Abs.js.map +0 -1
  430. package/cjs/math/Add.d.ts +0 -19
  431. package/cjs/math/Add.d.ts.map +0 -1
  432. package/cjs/math/Add.js.map +0 -1
  433. package/cjs/math/Digit.d.ts +0 -100
  434. package/cjs/math/Digit.d.ts.map +0 -1
  435. package/cjs/math/Digit.js +0 -3
  436. package/cjs/math/Digit.js.map +0 -1
  437. package/cjs/math/GreaterThan.d.ts +0 -13
  438. package/cjs/math/GreaterThan.d.ts.map +0 -1
  439. package/cjs/math/GreaterThan.js +0 -3
  440. package/cjs/math/GreaterThan.js.map +0 -1
  441. package/cjs/math/Max.d.ts +0 -4
  442. package/cjs/math/Max.d.ts.map +0 -1
  443. package/cjs/math/Max.js.map +0 -1
  444. package/cjs/math/Subtract.d.ts +0 -19
  445. package/cjs/math/Subtract.d.ts.map +0 -1
  446. package/cjs/math/Subtract.js +0 -3
  447. package/cjs/math/Subtract.js.map +0 -1
  448. package/cjs/number/integer.d.ts.map +0 -1
  449. package/cjs/number/negative.d.ts.map +0 -1
  450. package/cjs/number/numeric_type.d.ts.map +0 -1
  451. package/cjs/number/positive.d.ts.map +0 -1
  452. package/cjs/predicates/isType.d.ts.map +0 -1
  453. package/cjs/predicates/isType.js.map +0 -1
  454. package/esm/array/array.d.ts.map +0 -1
  455. package/esm/array/array.js +0 -2
  456. package/esm/array/array.js.map +0 -1
  457. package/esm/array/create_tuple.d.ts +0 -11
  458. package/esm/array/create_tuple.d.ts.map +0 -1
  459. package/esm/array/find_first.d.ts +0 -6
  460. package/esm/array/find_first.d.ts.map +0 -1
  461. package/esm/array/find_first.js +0 -2
  462. package/esm/array/find_first.js.map +0 -1
  463. package/esm/array/find_last.d.ts +0 -2
  464. package/esm/array/find_last.d.ts.map +0 -1
  465. package/esm/array/find_last.js +0 -2
  466. package/esm/array/find_last.js.map +0 -1
  467. package/esm/array/pad_left.d.ts +0 -6
  468. package/esm/array/pad_left.d.ts.map +0 -1
  469. package/esm/array/pad_left.js +0 -2
  470. package/esm/array/pad_left.js.map +0 -1
  471. package/esm/array/some.d.ts +0 -8
  472. package/esm/array/some.d.ts.map +0 -1
  473. package/esm/array/some.js +0 -2
  474. package/esm/array/some.js.map +0 -1
  475. package/esm/math/Abs.d.ts +0 -3
  476. package/esm/math/Abs.d.ts.map +0 -1
  477. package/esm/math/Abs.js +0 -2
  478. package/esm/math/Abs.js.map +0 -1
  479. package/esm/math/Add.d.ts +0 -19
  480. package/esm/math/Add.d.ts.map +0 -1
  481. package/esm/math/Add.js +0 -2
  482. package/esm/math/Add.js.map +0 -1
  483. package/esm/math/Digit.d.ts +0 -100
  484. package/esm/math/Digit.d.ts.map +0 -1
  485. package/esm/math/Digit.js +0 -2
  486. package/esm/math/Digit.js.map +0 -1
  487. package/esm/math/GreaterThan.d.ts +0 -13
  488. package/esm/math/GreaterThan.d.ts.map +0 -1
  489. package/esm/math/GreaterThan.js +0 -2
  490. package/esm/math/GreaterThan.js.map +0 -1
  491. package/esm/math/Max.d.ts +0 -4
  492. package/esm/math/Max.d.ts.map +0 -1
  493. package/esm/math/Max.js +0 -2
  494. package/esm/math/Max.js.map +0 -1
  495. package/esm/math/Subtract.d.ts +0 -19
  496. package/esm/math/Subtract.d.ts.map +0 -1
  497. package/esm/math/Subtract.js +0 -2
  498. package/esm/math/Subtract.js.map +0 -1
  499. package/esm/number/integer.d.ts.map +0 -1
  500. package/esm/number/negative.d.ts.map +0 -1
  501. package/esm/number/numeric_type.d.ts.map +0 -1
  502. package/esm/number/positive.d.ts.map +0 -1
  503. package/esm/predicates/isType.d.ts.map +0 -1
  504. package/esm/predicates/isType.js.map +0 -1
  505. package/ts/array/create_tuple.ts +0 -17
  506. package/ts/array/find_first.ts +0 -16
  507. package/ts/array/find_last.ts +0 -11
  508. package/ts/array/pad_left.ts +0 -16
  509. package/ts/array/some.ts +0 -33
  510. package/ts/math/Abs.ts +0 -7
  511. package/ts/math/Add.ts +0 -58
  512. package/ts/math/Digit.ts +0 -152
  513. package/ts/math/GreaterThan.ts +0 -55
  514. package/ts/math/Max.ts +0 -10
  515. package/ts/math/Subtract.ts +0 -57
  516. /package/cjs/{number → numeric}/integer.js +0 -0
  517. /package/cjs/{number → numeric}/negative.d.ts +0 -0
  518. /package/cjs/{number → numeric}/negative.js +0 -0
  519. /package/cjs/{number → numeric}/numeric_type.d.ts +0 -0
  520. /package/cjs/{number → numeric}/numeric_type.js +0 -0
  521. /package/cjs/{number → numeric}/positive.js +0 -0
  522. /package/cjs/{array → tuple}/create_tuple.js +0 -0
  523. /package/esm/{number → numeric}/integer.js +0 -0
  524. /package/esm/{number → numeric}/negative.d.ts +0 -0
  525. /package/esm/{number → numeric}/negative.js +0 -0
  526. /package/esm/{number → numeric}/numeric_type.d.ts +0 -0
  527. /package/esm/{number → numeric}/numeric_type.js +0 -0
  528. /package/esm/{number → numeric}/positive.js +0 -0
  529. /package/esm/{array → tuple}/create_tuple.js +0 -0
  530. /package/ts/{number → numeric}/negative.ts +0 -0
  531. /package/ts/{number → numeric}/numeric_type.ts +0 -0
package/ts/math/max.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { IsNever } from '../never/never_type.js'
2
+ import type { GreaterThan } from './greater_than.js'
3
+
4
+ export type Max<A extends number | bigint, B extends number | bigint, Fail = never> = GreaterThan<
5
+ A,
6
+ B
7
+ > extends infer Result
8
+ ? IsNever<Result> extends true
9
+ ? Fail
10
+ : Result extends true
11
+ ? A
12
+ : B
13
+ : never
@@ -0,0 +1,12 @@
1
+ import type { NumericStruct } from './numeric_struct.js'
2
+
3
+ export type Multiply<A extends number | bigint, B extends number | bigint, Fail = never> = [
4
+ NumericStruct.FromNumeric<A, Fail>,
5
+ NumericStruct.FromNumeric<B, Fail>
6
+ ] extends [infer MA, infer MB]
7
+ ? MA extends NumericStruct
8
+ ? MB extends NumericStruct
9
+ ? NumericStruct.ToNumeric<NumericStruct.Multiply<MA, MB>>
10
+ : Fail
11
+ : Fail
12
+ : never
@@ -0,0 +1,658 @@
1
+ import type { Tail } from '../array/tail.js'
2
+ import type { PadStart } from '../tuple/tuple_plus.pad_start.js'
3
+ import type { Add as NumericAdd } from './add.js'
4
+ import type { ToNegative } from './math_plus.to_negative.js'
5
+
6
+ /**
7
+ * Internal numeric representation to perform math operations.
8
+ *
9
+ * NumericStruct: `[Type, DigitsStruct]`
10
+ * DigitsStruct: `[Sign, Digits, Exponent]`
11
+ *
12
+ * It is similar to the floating point representation with some minor differences.
13
+ *
14
+ * @template Type Type of the value, either `number` or `bigint`.
15
+ * It captures the original type of the value,
16
+ * so that at the end of the operation,
17
+ * the value can be adjusted accordingly.
18
+ *
19
+ * @template Sign Sign of the value, either `+` or `-`.
20
+ *
21
+ * @template Digits Digits of the value.
22
+ * It is a tuple of digits,
23
+ * where each digits can range from 0 to 9 during input,
24
+ * and range from -10 to 89 during operation.
25
+ * The max 89 comes from multiplication:
26
+ *
27
+ * ```
28
+ * 99 * 9
29
+ * => [[ 9, 9], 0]
30
+ * * [ [9], 0]
31
+ * => [[ 81, 81], 0]
32
+ * => [[ 89, 1], 0]
33
+ * => [[ 8, 9, 1], 0]
34
+ * ```
35
+ *
36
+ * While -10 comes from subtraction:
37
+ *
38
+ * ```
39
+ * 100 - 99 = 1
40
+ * => [[ 1, 0, 0], 0]
41
+ * - [[ 9, 9], 0]
42
+ * => [[ 1, -9, -9], 0]
43
+ * => [[ 1,-10, 1], 0] // here, as in intermediate step
44
+ * => [[ 0, 0, 1], 0]
45
+ * => [[1], 0]
46
+ * => 1
47
+ * ```
48
+ *
49
+ *
50
+ * Unlike floating point numbers, the digits length is not limited.
51
+ *
52
+ * @template Exponent Exponent is the negative exponent of the number.
53
+ *
54
+ * ```
55
+ * 1.23 = 123e^-2 = [[1, 2, 3], 2]
56
+ * 0.0123 = 123e^-4 = [[1, 2, 3], 4]
57
+ * ```
58
+ *
59
+ * There are 2 kinds of `NumericStruct`:
60
+ * - Normalized: The `NumericStruct` is clean and can be converted to/from `number` or `bigint`
61
+ * - Not normalized: The `DigitsStruct` within the `NumericStruct` is normalized,
62
+ * but may need to convert between `number` and `bigint`.\
63
+ * e.g. bigint + float => float (if possible), number + number => bigint (too big)
64
+ *
65
+ * During operations, the `DigitsStruct` can be not normalized,
66
+ * but each operation should always normalize the `DigitsStruct` before returning.
67
+ * Each operations assume the input `DigitsStruct` is normalized.
68
+ *
69
+ * All operations are performed in similar way:
70
+ *
71
+ * value -> NormalizedNumericStruct -> operation(NormalizedDigitsStruct) -> NormalizedNumericStruct -> Value
72
+ *
73
+ * This allows the operations to be composable.
74
+ * */
75
+ export type NumericStruct = ['bigint' | 'number', DigitsStruct]
76
+ // These are used to reference the NumericStruct values
77
+ export type TYPE = 0
78
+ export type DIGITS_STRUCT = 1
79
+
80
+ export namespace NumericStruct {
81
+ /**
82
+ * Creates a `NumericStruct` from number or bigint `N`.
83
+ */
84
+ export type FromNumeric<N extends number | bigint, Fail = never> = N extends number
85
+ ? number extends N
86
+ ? Fail
87
+ : ['number', DigitsStruct.FromNumber<N>]
88
+ : N extends bigint
89
+ ? bigint extends N
90
+ ? Fail
91
+ : ['bigint', DigitsStruct.FromBigint<N>]
92
+ : never
93
+
94
+ /**
95
+ * Converts a `NumericStruct` to a number or bigint.
96
+ *
97
+ * It includes the normalization of the `NumericStruct`.
98
+ */
99
+ export type ToNumeric<M extends NumericStruct> = DigitsStruct.ToString<
100
+ M[DIGITS_STRUCT]
101
+ > extends infer S extends string
102
+ ? M[TYPE] extends 'bigint'
103
+ ? StringToBigint<S, StringToNumber<S, `The value '${S}' cannot be represented as bigint or number`>>
104
+ : StringToNumber<S, StringToBigint<S, `The value '${S}' cannot be represented as bigint or number`>>
105
+ : never
106
+
107
+ export type Add<A extends NumericStruct, B extends NumericStruct> = [
108
+ A[TYPE],
109
+ DigitsStruct.Add<A[DIGITS_STRUCT], B[DIGITS_STRUCT]>
110
+ ]
111
+
112
+ export type Subtract<A extends NumericStruct, B extends NumericStruct> = [
113
+ A[TYPE],
114
+ DigitsStruct.Subtract<A[DIGITS_STRUCT], B[DIGITS_STRUCT]>
115
+ ]
116
+
117
+ export type Multiply<A extends NumericStruct, B extends NumericStruct> = [
118
+ A[TYPE],
119
+ DigitsStruct.Multiply<A[DIGITS_STRUCT], B[DIGITS_STRUCT]>
120
+ ]
121
+ }
122
+
123
+ // TODO: move into `NumericHelpers`
124
+ type StringToBigint<S extends string, Fail> = S extends `${infer N extends bigint}` ? N : Fail
125
+
126
+ // TODO: move into `NumericHelpers`
127
+ export type StringToNumber<S extends string, Fail> = S extends `${infer N extends number}`
128
+ ? number extends N
129
+ ? Fail
130
+ : N
131
+ : Fail
132
+
133
+ export type DigitsStruct = [Sign: '+' | '-', Digits: number[], Exponent: number]
134
+ // These are used to reference the DigitsStruct values
135
+ export type SIGN = 0
136
+ export type DIGITS = 1
137
+ export type EXPONENT = 2
138
+
139
+ export namespace DigitsStruct {
140
+ /**
141
+ * Creates a `DigitsStruct` from number `N`.
142
+ *
143
+ * @template N Number to create `DigitsStruct` from.
144
+ */
145
+ export type FromNumber<N extends number> = `${N}` extends `-${infer R}`
146
+ ? R extends `${infer W}.${infer F}`
147
+ ? [DigitArray.FromString<W>, DigitArray.FromString<F>] extends [
148
+ infer WA extends number[],
149
+ infer FA extends number[]
150
+ ]
151
+ ? ['-', DigitArray.TrimLeadingZeros<[...WA, ...FA]>, FA['length']]
152
+ : never
153
+ : ['-', DigitArray.FromString<R>, 0]
154
+ : `${N}` extends `${infer W}.${infer F}`
155
+ ? [DigitArray.FromString<W>, DigitArray.FromString<F>] extends [
156
+ infer WA extends number[],
157
+ infer FA extends number[]
158
+ ]
159
+ ? ['+', DigitArray.TrimLeadingZeros<[...WA, ...FA]>, FA['length']]
160
+ : never
161
+ : ['+', DigitArray.FromString<`${N}`>, 0]
162
+
163
+ /**
164
+ * Creates a `DigitsStruct` from bigint `N`.
165
+ *
166
+ * @template N Number to create `DigitsStruct` from.
167
+ */
168
+ export type FromBigint<N extends bigint> = `${N}` extends `-${infer R}`
169
+ ? ['-', DigitArray.FromString<R>, 0]
170
+ : ['+', DigitArray.FromString<`${N}`>, 0]
171
+
172
+ /**
173
+ * Converts a `DigitsStruct` to string.
174
+ *
175
+ * @template D A normalized `DigitsStruct`.
176
+ */
177
+ export type ToString<D extends DigitsStruct> = (
178
+ PadStart<D[DIGITS], D[EXPONENT], 0> extends infer Padded extends number[]
179
+ ? Padded['length'] extends D[EXPONENT]
180
+ ? DigitArray.ToString<[0, '.', ...DigitArray.TrimTrailingZeros<Padded>]>
181
+ : SplitFloat<Padded, D[EXPONENT]> extends [infer W extends number[], infer F extends number[]]
182
+ ? F extends []
183
+ ? DigitArray.ToString<W>
184
+ : DigitArray.ToString<[...W, '.', ...DigitArray.TrimTrailingZeros<F>]>
185
+ : never
186
+ : never
187
+ ) extends infer R
188
+ ? R extends '0'
189
+ ? R
190
+ : R extends string
191
+ ? D[SIGN] extends '-'
192
+ ? `-${R}`
193
+ : R
194
+ : never
195
+ : never
196
+
197
+ /**
198
+ * Splits DigitArray into the whole number and the fractional part.
199
+ *
200
+ * @note cannot use `ArrayPlus.SplitAt` as it causes infinite loop.
201
+ */
202
+ type SplitFloat<A extends number[], I extends number, F extends number[] = []> = I extends 0
203
+ ? [A, []]
204
+ : F['length'] extends I
205
+ ? [A, F]
206
+ : A extends [...infer H extends number[], infer T extends number]
207
+ ? SplitFloat<H, I, [T, ...F]>
208
+ : never
209
+
210
+ /**
211
+ * Normalizes a `DigitsStruct`.
212
+ *
213
+ * The normalization two two things:
214
+ *
215
+ * - if the first digit is negative, it will flip the sign.
216
+ * - carry digits if the digit is negative or greater than 9.
217
+ */
218
+ export type Normalize<
219
+ N extends DigitsStruct,
220
+ R extends DigitsStruct = ['+', [], 0]
221
+ > = `${N[DIGITS][0]}` extends `-${number}`
222
+ ? Normalize<FlipSign<N>, R>
223
+ : [N[SIGN], DigitArray.CarryDigits<N[DIGITS]>, N[EXPONENT]]
224
+
225
+ type FlipSign<
226
+ D extends DigitsStruct,
227
+ I extends number[] = D[DIGITS],
228
+ R extends number[] = []
229
+ > = I extends []
230
+ ? D[SIGN] extends '-'
231
+ ? ['+', R, D[EXPONENT]]
232
+ : ['-', R, D[EXPONENT]]
233
+ : I extends [infer H extends number, ...infer T extends number[]]
234
+ ? FlipSign<D, T, [...R, Digit.FlipSign<H>]>
235
+ : never
236
+
237
+ /**
238
+ * Add `A` and `B`.
239
+ *
240
+ * @template A A normalized `DigitsStruct`.
241
+ * @template B B normalized `DigitsStruct`.
242
+ */
243
+ export type Add<A extends DigitsStruct, B extends DigitsStruct> = Balance<A, B> extends [
244
+ infer BA extends DigitsStruct,
245
+ infer BB extends DigitsStruct
246
+ ]
247
+ ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
248
+ ? Normalize<['+', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
249
+ : [BA[SIGN], BB[SIGN]] extends ['+', '-']
250
+ ? Normalize<['+', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
251
+ : [BA[SIGN], BB[SIGN]] extends ['-', '+']
252
+ ? Normalize<['+', DigitArray.Subtract<BB[DIGITS], BA[DIGITS]>, BB[EXPONENT]]>
253
+ : [BA[SIGN], BB[SIGN]] extends ['-', '-']
254
+ ? Normalize<['-', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
255
+ : never
256
+ : never
257
+
258
+ export type Subtract<A extends DigitsStruct, B extends DigitsStruct> = Balance<A, B> extends [
259
+ infer BA extends DigitsStruct,
260
+ infer BB extends DigitsStruct
261
+ ]
262
+ ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
263
+ ? Normalize<['+', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
264
+ : [BA[SIGN], BB[SIGN]] extends ['+', '-']
265
+ ? Normalize<['+', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
266
+ : [BA[SIGN], BB[SIGN]] extends ['-', '+']
267
+ ? Normalize<['-', DigitArray.Add<BB[DIGITS], BA[DIGITS]>, BA[EXPONENT]]>
268
+ : [BA[SIGN], BB[SIGN]] extends ['-', '-']
269
+ ? Normalize<['-', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
270
+ : never
271
+ : never
272
+
273
+ export type Multiply<A extends DigitsStruct, B extends DigitsStruct> = NumericAdd<
274
+ A[EXPONENT],
275
+ B[EXPONENT]
276
+ > extends infer Exp extends number
277
+ ? [A[SIGN], B[SIGN]] extends ['+', '+']
278
+ ? Normalize<['+', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
279
+ : [A[SIGN], B[SIGN]] extends ['+', '-']
280
+ ? Normalize<['-', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
281
+ : [A[SIGN], B[SIGN]] extends ['-', '+']
282
+ ? Normalize<['-', DigitArray.Multiply<B[DIGITS], A[DIGITS]>, Exp]>
283
+ : [A[SIGN], B[SIGN]] extends ['-', '-']
284
+ ? Normalize<['+', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
285
+ : never
286
+ : never
287
+
288
+ /**
289
+ * Balance the two structs for add/subtract.
290
+ */
291
+ export type Balance<A extends DigitsStruct, B extends DigitsStruct> = GetBalancePadding<
292
+ A[EXPONENT],
293
+ B[EXPONENT]
294
+ > extends [infer Pads extends number[], infer Longer]
295
+ ? Longer extends 'A'
296
+ ? [A, [B[SIGN], DigitArray.TrimLeadingZeros<[...B[DIGITS], ...Pads]>, A[EXPONENT]]]
297
+ : [[A[SIGN], DigitArray.TrimLeadingZeros<[...A[DIGITS], ...Pads]>, B[EXPONENT]], B]
298
+ : never
299
+
300
+ type GetBalancePadding<
301
+ A extends number,
302
+ B extends number,
303
+ C extends number[] = [],
304
+ R extends number[] = []
305
+ > = A extends B
306
+ ? [[], 'A']
307
+ : R extends []
308
+ ? // have not reach min yet
309
+ C['length'] extends A
310
+ ? GetBalancePadding<A, B, [0, ...C], [0]>
311
+ : C['length'] extends B
312
+ ? GetBalancePadding<A, B, [0, ...C], [0, ...R]>
313
+ : GetBalancePadding<A, B, [0, ...C], []>
314
+ : C['length'] extends A
315
+ ? [R, 'A']
316
+ : C['length'] extends B
317
+ ? [R, 'B']
318
+ : GetBalancePadding<A, B, [0, ...C], [0, ...R]>
319
+
320
+ /**
321
+ * This is used to align the `NumberStruct` during `Add/Subtract`.
322
+ * @internal
323
+ */
324
+ export type GetMinPadEnd<
325
+ A extends number,
326
+ B extends number,
327
+ R extends number[] = []
328
+ > = R['length'] extends A ? [R, 'B'] : R['length'] extends B ? [R, 'A'] : GetMinPadEnd<A, B, [0, ...R]>
329
+ }
330
+
331
+ export namespace DigitArray {
332
+ export type FromString<S extends string> = S extends `1${infer L}`
333
+ ? [1, ...FromString<L>]
334
+ : S extends `2${infer L}`
335
+ ? [2, ...FromString<L>]
336
+ : S extends `3${infer L}`
337
+ ? [3, ...FromString<L>]
338
+ : S extends `4${infer L}`
339
+ ? [4, ...FromString<L>]
340
+ : S extends `5${infer L}`
341
+ ? [5, ...FromString<L>]
342
+ : S extends `6${infer L}`
343
+ ? [6, ...FromString<L>]
344
+ : S extends `7${infer L}`
345
+ ? [7, ...FromString<L>]
346
+ : S extends `8${infer L}`
347
+ ? [8, ...FromString<L>]
348
+ : S extends `9${infer L}`
349
+ ? [9, ...FromString<L>]
350
+ : S extends `0${infer L}`
351
+ ? [0, ...FromString<L>]
352
+ : S extends `-1${infer L}`
353
+ ? [-1, ...FromString<L>]
354
+ : S extends `-2${infer L}`
355
+ ? [-2, ...FromString<L>]
356
+ : S extends `-3${infer L}`
357
+ ? [-3, ...FromString<L>]
358
+ : S extends `-4${infer L}`
359
+ ? [-4, ...FromString<L>]
360
+ : S extends `-5${infer L}`
361
+ ? [-5, ...FromString<L>]
362
+ : S extends `-6${infer L}`
363
+ ? [-6, ...FromString<L>]
364
+ : S extends `-7${infer L}`
365
+ ? [-7, ...FromString<L>]
366
+ : S extends `-8${infer L}`
367
+ ? [-8, ...FromString<L>]
368
+ : S extends `-9${infer L}`
369
+ ? [-9, ...FromString<L>]
370
+ : S extends `-0${infer L}`
371
+ ? [-0, ...FromString<L>]
372
+ : []
373
+
374
+ export type ToString<A extends Array<number | string>> = number extends A['length']
375
+ ? ''
376
+ : A['length'] extends 0
377
+ ? ''
378
+ : `${A[0]}${ToString<Tail<A>>}`
379
+
380
+ /**
381
+ * [0, 0, -1] => [-1]
382
+ *
383
+ * This is used in various places so that there will be less computation,
384
+ * and the sign bit can be handled properly.
385
+ * @internal
386
+ */
387
+ export type TrimLeadingZeros<T extends number[]> = T extends [0]
388
+ ? T
389
+ : T extends [0, ...infer Tail extends number[]]
390
+ ? TrimLeadingZeros<Tail>
391
+ : T
392
+ export type TrimTrailingZeros<T extends number[]> = T extends [0]
393
+ ? T
394
+ : T extends [...infer Tail extends number[], 0]
395
+ ? TrimTrailingZeros<Tail>
396
+ : T
397
+
398
+ export type Add<A extends number[], B extends number[], R extends number[] = []> = A extends []
399
+ ? B extends []
400
+ ? R
401
+ : B extends [...infer BH extends number[], infer BL extends number]
402
+ ? Add<[], BH, [BL, ...R]>
403
+ : never
404
+ : B extends []
405
+ ? A extends [...infer AH extends number[], infer AL extends number]
406
+ ? Add<AH, [], [AL, ...R]>
407
+ : never
408
+ : [A, B] extends [
409
+ [...infer AH extends number[], infer AL extends number],
410
+ [...infer BH extends number[], infer BL extends number]
411
+ ]
412
+ ? Add<AH, BH, [Digit.Add<AL, BL>, ...R]>
413
+ : never
414
+
415
+ export type Subtract<A extends number[], B extends number[], R extends number[] = []> = A extends []
416
+ ? B extends []
417
+ ? TrimLeadingZeros<R>
418
+ : B extends [...infer BH extends number[], infer BL extends number]
419
+ ? Subtract<[], BH, [ToNegative<BL>, ...R]>
420
+ : never
421
+ : B extends []
422
+ ? A extends [...infer AH extends number[], infer AL extends number]
423
+ ? Subtract<AH, [], [AL, ...R]>
424
+ : never
425
+ : [A, B] extends [
426
+ [...infer AH extends number[], infer AL extends number],
427
+ [...infer BH extends number[], infer BL extends number]
428
+ ]
429
+ ? Subtract<AH, BH, [Digit.Subtract<AL, BL>, ...R]>
430
+ : never
431
+
432
+ export type Multiply<A extends number[], B extends number[], R extends number[][] = []> = B extends []
433
+ ? RecursiveAdd<R>
434
+ : B extends [infer Head extends number, ...infer Tail extends number[]]
435
+ ? Multiply<A, Tail, [...R, CarryDigits<MultiplyArray<A, Head, Zeros<Tail['length']>>>]>
436
+ : never
437
+
438
+ type Zeros<N extends number, R extends number[] = []> = R['length'] extends N ? R : Zeros<N, [0, ...R]>
439
+
440
+ type MultiplyArray<
441
+ A extends number[],
442
+ B extends number,
443
+ Pad extends number[],
444
+ R extends number[] = []
445
+ > = B extends 0
446
+ ? [0]
447
+ : B extends 1
448
+ ? [...A, ...Pad]
449
+ : A extends []
450
+ ? [...R, ...Pad]
451
+ : A extends [infer H extends number, ...infer T extends number[]]
452
+ ? MultiplyArray<T, B, Pad, [...R, Digit.Multiply<H, B>]>
453
+ : never
454
+
455
+ /**
456
+ * Recursively add digit arrays.
457
+ *
458
+ * This is used in multiplication.
459
+ */
460
+ type RecursiveAdd<E extends number[][], R extends number[] = []> = E extends []
461
+ ? R
462
+ : E extends [infer H extends number[], ...infer T extends number[][]]
463
+ ? RecursiveAdd<T, CarryDigits<Add<R, H>>>
464
+ : never
465
+
466
+ export type CarryDigits<N extends number[], R extends number[] = []> = N extends []
467
+ ? TrimLeadingZeros<R>
468
+ : N extends [infer Tail extends number]
469
+ ? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
470
+ ? CarryDigits<[], [T1, T2, ...R]>
471
+ : `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
472
+ ? `-${T1}` extends `${infer NT extends number}`
473
+ ? CarryDigits<[], [NT, T2, ...R]>
474
+ : never
475
+ : CarryDigits<[], [Tail, ...R]>
476
+ : N extends [infer Head extends number, infer Tail extends number]
477
+ ? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
478
+ ? CarryDigits<[Digit.Add<Head, T1>], [T2, ...R]>
479
+ : `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
480
+ ? `-${T1}` extends `${infer NT extends number}`
481
+ ? CarryDigits<[Digit.Add<Head, NT>], [T2, ...R]>
482
+ : never
483
+ : `${Tail}` extends `-${number}`
484
+ ? CarryDigits<[Digit.Add<Head, -1>], [Digit.Plus10[Tail], ...R]>
485
+ : CarryDigits<[Head], [Tail, ...R]>
486
+ : N extends [...infer Heads extends number[], infer Head extends number, infer Tail extends number]
487
+ ? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
488
+ ? CarryDigits<[...Heads, Digit.Add<Head, T1>], [T2, ...R]>
489
+ : `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
490
+ ? `-${T1}` extends `${infer NT extends number}`
491
+ ? CarryDigits<[...Heads, Digit.Add<Head, NT>], [T2, ...R]>
492
+ : never
493
+ : `${Tail}` extends `-${number}`
494
+ ? CarryDigits<[...Heads, Digit.Add<Head, -1>], [Digit.Plus10[Tail], ...R]>
495
+ : CarryDigits<[...Heads, Head], [Tail, ...R]>
496
+ : never
497
+ }
498
+
499
+ export namespace Digit {
500
+ /**
501
+ * Adds two `Digit`.
502
+ *
503
+ * add: A: 0 - 9, B: 0 - 9
504
+ * normalize: [81, 81] -> [81 + 8, 1]
505
+ */
506
+ export type Add<A extends number, B extends number> = `${A}` extends `-${infer AD extends number}`
507
+ ? `${B}` extends `-${infer BD extends number}`
508
+ ? ToNegative<PositiveEntryAdd<AD, BD>>
509
+ : Subtract<B, AD>
510
+ : `${B}` extends `-${infer BD extends number}`
511
+ ? Subtract<A, BD>
512
+ : PositiveEntryAdd<A, B>
513
+
514
+ export type FlipSign<T extends number> = T extends 0
515
+ ? 0
516
+ : `${T}` extends `-${infer R extends number}`
517
+ ? R
518
+ : `-${T}` extends `${infer R extends number}`
519
+ ? R
520
+ : never
521
+
522
+ type PositiveEntryAdd<A extends number, B extends number> = [
523
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
524
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
525
+ [2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
526
+ [3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
527
+ [4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
528
+ [5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
529
+ [6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
530
+ [7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
531
+ [8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
532
+ [9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
533
+ [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
534
+ [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
535
+ [12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
536
+ [13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
537
+ [14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
538
+ [15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
539
+ [16, 17, 18, 19, 20, 21, 22, 23, 24, 25],
540
+ [17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
541
+ [18, 19, 20, 21, 22, 23, 24, 25, 26, 27],
542
+ [19, 20, 21, 22, 23, 24, 25, 26, 27, 28],
543
+ [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
544
+ [21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
545
+ [22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
546
+ [23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
547
+ [24, 25, 26, 27, 28, 29, 30, 31, 32, 33],
548
+ [25, 26, 27, 28, 29, 30, 31, 32, 33, 34],
549
+ [26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
550
+ [27, 28, 29, 30, 31, 32, 33, 34, 35, 36],
551
+ [28, 29, 30, 31, 32, 33, 34, 35, 36, 37],
552
+ [29, 30, 31, 32, 33, 34, 35, 36, 37, 38],
553
+ [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
554
+ [31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
555
+ [32, 33, 34, 35, 36, 37, 38, 39, 40, 41],
556
+ [33, 34, 35, 36, 37, 38, 39, 40, 41, 42],
557
+ [34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
558
+ [35, 36, 37, 38, 39, 40, 41, 42, 43, 44],
559
+ [36, 37, 38, 39, 40, 41, 42, 43, 44, 45],
560
+ [37, 38, 39, 40, 41, 42, 43, 44, 45, 46],
561
+ [38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
562
+ [39, 40, 41, 42, 43, 44, 45, 46, 47, 48],
563
+ [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
564
+ [41, 42, 43, 44, 45, 46, 47, 48, 49, 50],
565
+ [42, 43, 44, 45, 46, 47, 48, 49, 50, 51],
566
+ [43, 44, 45, 46, 47, 48, 49, 50, 51, 52],
567
+ [44, 45, 46, 47, 48, 49, 50, 51, 52, 53],
568
+ [45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
569
+ [46, 47, 48, 49, 50, 51, 52, 53, 54, 55],
570
+ [47, 48, 49, 50, 51, 52, 53, 54, 55, 56],
571
+ [48, 49, 50, 51, 52, 53, 54, 55, 56, 57],
572
+ [49, 50, 51, 52, 53, 54, 55, 56, 57, 58],
573
+ [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
574
+ [51, 52, 53, 54, 55, 56, 57, 58, 59, 60],
575
+ [52, 53, 54, 55, 56, 57, 58, 59, 60, 61],
576
+ [53, 54, 55, 56, 57, 58, 59, 60, 61, 62],
577
+ [54, 55, 56, 57, 58, 59, 60, 61, 62, 63],
578
+ [55, 56, 57, 58, 59, 60, 61, 62, 63, 64],
579
+ [56, 57, 58, 59, 60, 61, 62, 63, 64, 65],
580
+ [57, 58, 59, 60, 61, 62, 63, 64, 65, 66],
581
+ [58, 59, 60, 61, 62, 63, 64, 65, 66, 67],
582
+ [59, 60, 61, 62, 63, 64, 65, 66, 67, 68],
583
+ [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
584
+ [61, 62, 63, 64, 65, 66, 67, 68, 69, 70],
585
+ [62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
586
+ [63, 64, 65, 66, 67, 68, 69, 70, 71, 72],
587
+ [64, 65, 66, 67, 68, 69, 70, 71, 72, 73],
588
+ [65, 66, 67, 68, 69, 70, 71, 72, 73, 74],
589
+ [66, 67, 68, 69, 70, 71, 72, 73, 74, 75],
590
+ [67, 68, 69, 70, 71, 72, 73, 74, 75, 76],
591
+ [68, 69, 70, 71, 72, 73, 74, 75, 76, 77],
592
+ [69, 70, 71, 72, 73, 74, 75, 76, 77, 78],
593
+ [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
594
+ [71, 72, 73, 74, 75, 76, 77, 78, 79, 80],
595
+ [72, 73, 74, 75, 76, 77, 78, 79, 80, 81],
596
+ [73, 74, 75, 76, 77, 78, 79, 80, 81, 82],
597
+ [74, 75, 76, 77, 78, 79, 80, 81, 82, 83],
598
+ [75, 76, 77, 78, 79, 80, 81, 82, 83, 84],
599
+ [76, 77, 78, 79, 80, 81, 82, 83, 84, 85],
600
+ [77, 78, 79, 80, 81, 82, 83, 84, 85, 86],
601
+ [78, 79, 80, 81, 82, 83, 84, 85, 86, 87],
602
+ [79, 80, 81, 82, 83, 84, 85, 86, 87, 88],
603
+ [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
604
+ [81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
605
+ ][A][B]
606
+
607
+ /**
608
+ * Subtract two positive numbers.
609
+ * The number range from 0 to 81.
610
+ */
611
+ export type Subtract<A extends number, B extends number> = [`${A}`, `${B}`] extends [
612
+ `${number}${infer A2 extends number}`,
613
+ `${number}${infer B2 extends number}`
614
+ ]
615
+ ? Subtract<A2, B2>
616
+ : `${A}` extends `${number}${infer A2 extends number}`
617
+ ? Subtract<A2, B>
618
+ : `${B}` extends `${number}${infer B2 extends number}`
619
+ ? Subtract<A, B2>
620
+ : SingleDigitSubtract<A, B>
621
+
622
+ export type SingleDigitSubtract<A extends number, B extends number> = [
623
+ [0, -1, -2, -3, -4, -5, -6, -7, -8, -9],
624
+ [1, 0, -1, -2, -3, -4, -5, -6, -7, -8],
625
+ [2, 1, 0, -1, -2, -3, -4, -5, -6, -7],
626
+ [3, 2, 1, 0, -1, -2, -3, -4, -5, -6],
627
+ [4, 3, 2, 1, 0, -1, -2, -3, -4, -5],
628
+ [5, 4, 3, 2, 1, 0, -1, -2, -3, -4],
629
+ [6, 5, 4, 3, 2, 1, 0, -1, -2, -3],
630
+ [7, 6, 5, 4, 3, 2, 1, 0, -1, -2],
631
+ [8, 7, 6, 5, 4, 3, 2, 1, 0, -1],
632
+ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
633
+ ][A][B]
634
+
635
+ export type Plus10 = { [k in number]: number } & {
636
+ '-1': 9
637
+ '-2': 8
638
+ '-3': 7
639
+ '-4': 6
640
+ '-5': 5
641
+ '-6': 4
642
+ '-7': 3
643
+ '-8': 2
644
+ '-9': 1
645
+ }
646
+ export type Multiply<A extends number, B extends number> = [
647
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
648
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
649
+ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18],
650
+ [0, 3, 6, 9, 12, 15, 18, 21, 24, 27],
651
+ [0, 4, 8, 12, 16, 20, 24, 28, 32, 36],
652
+ [0, 5, 10, 15, 20, 25, 30, 35, 40, 45],
653
+ [0, 6, 12, 18, 24, 30, 36, 42, 48, 54],
654
+ [0, 7, 14, 21, 28, 35, 42, 49, 56, 63],
655
+ [0, 8, 16, 24, 32, 40, 48, 56, 64, 72],
656
+ [0, 9, 18, 27, 36, 45, 54, 63, 72, 81]
657
+ ][A][B]
658
+ }
@@ -0,0 +1,14 @@
1
+ import type { NumericStruct } from './numeric_struct.js'
2
+
3
+ export type Subtract<A extends number | bigint, B extends number | bigint, Fail = never> = [
4
+ NumericStruct.FromNumeric<A, Fail>,
5
+ NumericStruct.FromNumeric<B, Fail>
6
+ ] extends [infer MA, infer MB]
7
+ ? MA extends NumericStruct
8
+ ? MB extends NumericStruct
9
+ ? NumericStruct.ToNumeric<NumericStruct.Subtract<MA, MB>>
10
+ : Fail
11
+ : Fail
12
+ : never
13
+
14
+ export type Decrement<N extends number | bigint> = Subtract<N, 1>