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.
- package/README.md +1054 -355
- package/cjs/array/{array.d.ts → array.at.d.ts} +4 -14
- package/cjs/array/array.at.d.ts.map +1 -0
- package/cjs/array/{pad_left.js → array.at.js} +1 -1
- package/cjs/array/array.at.js.map +1 -0
- package/cjs/array/array.concat.d.ts +13 -0
- package/cjs/array/array.concat.d.ts.map +1 -0
- package/cjs/array/array.concat.js +3 -0
- package/cjs/array/array.concat.js.map +1 -0
- package/cjs/array/array.entries.d.ts +17 -0
- package/cjs/array/array.entries.d.ts.map +1 -0
- package/cjs/array/array.entries.js +3 -0
- package/cjs/array/array.entries.js.map +1 -0
- package/cjs/array/array.find.d.ts +21 -0
- package/cjs/array/array.find.d.ts.map +1 -0
- package/cjs/array/{find_first.js → array.find.js} +1 -1
- package/cjs/array/array.find.js.map +1 -0
- package/cjs/array/array.find_last.d.ts +17 -0
- package/cjs/array/array.find_last.d.ts.map +1 -0
- package/cjs/array/array.find_last.js +3 -0
- package/cjs/array/array.find_last.js.map +1 -0
- package/cjs/array/array.reverse.d.ts +2 -0
- package/cjs/array/array.reverse.d.ts.map +1 -0
- package/cjs/array/array.reverse.js +3 -0
- package/cjs/array/array.reverse.js.map +1 -0
- package/cjs/array/array.some.d.ts +29 -0
- package/cjs/array/array.some.d.ts.map +1 -0
- package/cjs/array/array.some.js +3 -0
- package/cjs/array/array.some.js.map +1 -0
- package/cjs/array/array_index.d.ts +8 -8
- package/cjs/array/array_index.d.ts.map +1 -1
- package/cjs/array/array_plus.d.ts +9 -1
- package/cjs/array/array_plus.d.ts.map +1 -1
- package/cjs/array/array_plus.split_at.d.ts +30 -0
- package/cjs/array/array_plus.split_at.d.ts.map +1 -0
- package/cjs/array/array_plus.split_at.js +3 -0
- package/cjs/array/array_plus.split_at.js.map +1 -0
- package/cjs/array/drop.d.ts +2 -2
- package/cjs/array/drop.d.ts.map +1 -1
- package/cjs/array/index.d.ts +4 -5
- package/cjs/array/index.d.ts.map +1 -1
- package/cjs/array/index.js +4 -5
- package/cjs/array/index.js.map +1 -1
- package/cjs/array/pad_start.d.ts +32 -0
- package/cjs/array/pad_start.d.ts.map +1 -0
- package/cjs/array/{find_last.js → pad_start.js} +1 -1
- package/cjs/array/pad_start.js.map +1 -0
- package/cjs/assertion/assert_type.d.ts +3 -0
- package/cjs/assertion/assert_type.d.ts.map +1 -1
- package/cjs/assertion/assert_type.js +3 -0
- package/cjs/assertion/assert_type.js.map +1 -1
- package/cjs/bigint/cast.d.ts +10 -0
- package/cjs/bigint/cast.d.ts.map +1 -0
- package/cjs/{array/some.js → bigint/cast.js} +1 -1
- package/cjs/bigint/cast.js.map +1 -0
- package/cjs/equal/equal.d.ts +51 -3
- package/cjs/equal/equal.d.ts.map +1 -1
- package/cjs/functional/Maybe.d.ts +2 -2
- package/cjs/functional/Maybe.d.ts.map +1 -1
- package/cjs/index.d.ts +16 -7
- package/cjs/index.d.ts.map +1 -1
- package/cjs/index.js +6 -1
- package/cjs/index.js.map +1 -1
- package/cjs/math/abs.d.ts +6 -0
- package/cjs/math/abs.d.ts.map +1 -0
- package/cjs/math/{Add.js → abs.js} +1 -1
- package/cjs/math/abs.js.map +1 -0
- package/cjs/math/add.d.ts +7 -0
- package/cjs/math/add.d.ts.map +1 -0
- package/cjs/math/{Max.js → add.js} +1 -1
- package/cjs/math/add.js.map +1 -0
- package/cjs/math/greater_than.d.ts +4 -0
- package/cjs/math/greater_than.d.ts.map +1 -0
- package/cjs/math/greater_than.js +3 -0
- package/cjs/math/greater_than.js.map +1 -0
- package/cjs/math/index.d.ts +6 -6
- package/cjs/math/index.d.ts.map +1 -1
- package/cjs/math/math_plus.d.ts +5 -0
- package/cjs/math/math_plus.d.ts.map +1 -0
- package/cjs/math/math_plus.js +3 -0
- package/cjs/math/math_plus.js.map +1 -0
- package/cjs/math/math_plus.to_negative.d.ts +13 -0
- package/cjs/math/math_plus.to_negative.d.ts.map +1 -0
- package/cjs/math/math_plus.to_negative.js +3 -0
- package/cjs/math/math_plus.to_negative.js.map +1 -0
- package/cjs/math/max.d.ts +4 -0
- package/cjs/math/max.d.ts.map +1 -0
- package/cjs/math/{Abs.js → max.js} +1 -1
- package/cjs/math/max.js.map +1 -0
- package/cjs/math/multiply.d.ts +6 -0
- package/cjs/math/multiply.d.ts.map +1 -0
- package/cjs/{array/array.js → math/multiply.js} +1 -1
- package/cjs/math/multiply.js.map +1 -0
- package/cjs/math/numeric_struct.d.ts +1469 -0
- package/cjs/math/numeric_struct.d.ts.map +1 -0
- package/cjs/math/numeric_struct.js +3 -0
- package/cjs/math/numeric_struct.js.map +1 -0
- package/cjs/math/subtract.d.ts +7 -0
- package/cjs/math/subtract.d.ts.map +1 -0
- package/cjs/math/subtract.js +3 -0
- package/cjs/math/subtract.js.map +1 -0
- package/cjs/nominal/brand.js +2 -2
- package/cjs/nominal/brand.js.map +1 -1
- package/cjs/nominal/flavor.js +2 -2
- package/cjs/nominal/flavor.js.map +1 -1
- package/cjs/number/cast.d.ts +10 -0
- package/cjs/number/cast.d.ts.map +1 -0
- package/cjs/number/cast.js +3 -0
- package/cjs/number/cast.js.map +1 -0
- package/cjs/number/number_array.d.ts +0 -2
- package/cjs/number/number_array.d.ts.map +1 -1
- package/cjs/number/number_array.js +14 -1
- package/cjs/number/number_array.js.map +1 -1
- package/cjs/number/number_plus.d.ts +4 -5
- package/cjs/number/number_plus.d.ts.map +1 -1
- package/cjs/number/strict_number_type.d.ts +12 -0
- package/cjs/number/strict_number_type.d.ts.map +1 -1
- package/cjs/numeric/cast.d.ts +27 -0
- package/cjs/numeric/cast.d.ts.map +1 -0
- package/cjs/numeric/cast.js +3 -0
- package/cjs/numeric/cast.js.map +1 -0
- package/{esm/number → cjs/numeric}/integer.d.ts +2 -0
- package/cjs/numeric/integer.d.ts.map +1 -0
- package/cjs/{number → numeric}/integer.js.map +1 -1
- package/cjs/numeric/negative.d.ts.map +1 -0
- package/cjs/{number → numeric}/negative.js.map +1 -1
- package/cjs/numeric/numeric_plus.d.ts +5 -0
- package/cjs/numeric/numeric_plus.d.ts.map +1 -0
- package/cjs/numeric/numeric_plus.js +3 -0
- package/cjs/numeric/numeric_plus.js.map +1 -0
- package/cjs/numeric/numeric_type.d.ts.map +1 -0
- package/cjs/{number → numeric}/numeric_type.js.map +1 -1
- package/cjs/{number → numeric}/positive.d.ts +2 -2
- package/cjs/numeric/positive.d.ts.map +1 -0
- package/cjs/{number → numeric}/positive.js.map +1 -1
- package/cjs/object/ANotB.d.ts +3 -3
- package/cjs/object/ANotB.d.ts.map +1 -1
- package/cjs/object/Partial.d.ts +6 -0
- package/cjs/object/Partial.d.ts.map +1 -1
- package/cjs/object/Required.d.ts +4 -0
- package/cjs/object/Required.d.ts.map +1 -1
- package/cjs/object/index.d.ts +1 -1
- package/cjs/object/index.d.ts.map +1 -1
- package/cjs/object/object_type.d.ts +1 -1
- package/cjs/object/split.d.ts +3 -1
- package/cjs/object/split.d.ts.map +1 -1
- package/cjs/object/split.js.map +1 -1
- package/cjs/predicates/CanAssign.d.ts +35 -0
- package/cjs/predicates/CanAssign.d.ts.map +1 -1
- package/cjs/predicates/CanAssign.js.map +1 -1
- package/cjs/predicates/Extends.d.ts +2 -2
- package/cjs/predicates/Extends.d.ts.map +1 -1
- package/cjs/predicates/index.d.ts +0 -1
- package/cjs/predicates/index.d.ts.map +1 -1
- package/cjs/predicates/index.js +0 -1
- package/cjs/predicates/index.js.map +1 -1
- package/cjs/testing/test_type.d.ts +125 -50
- package/cjs/testing/test_type.d.ts.map +1 -1
- package/cjs/testing/test_type.js +4 -141
- package/cjs/testing/test_type.js.map +1 -1
- package/cjs/tuple/create_tuple.d.ts +28 -0
- package/cjs/tuple/create_tuple.d.ts.map +1 -0
- package/cjs/{array → tuple}/create_tuple.js.map +1 -1
- package/cjs/tuple/tuple_plus.d.ts +2 -0
- package/cjs/tuple/tuple_plus.d.ts.map +1 -0
- package/cjs/tuple/tuple_plus.js +18 -0
- package/cjs/tuple/tuple_plus.js.map +1 -0
- package/cjs/tuple/tuple_plus.pad_start.d.ts +22 -0
- package/cjs/tuple/tuple_plus.pad_start.d.ts.map +1 -0
- package/cjs/tuple/tuple_plus.pad_start.js +3 -0
- package/cjs/tuple/tuple_plus.pad_start.js.map +1 -0
- package/cjs/{predicates/isType.d.ts → type-guard/is_type.d.ts} +5 -3
- package/cjs/type-guard/is_type.d.ts.map +1 -0
- package/cjs/{predicates/isType.js → type-guard/is_type.js} +8 -2
- package/cjs/type-guard/is_type.js.map +1 -0
- package/esm/array/{array.d.ts → array.at.d.ts} +4 -14
- package/esm/array/array.at.d.ts.map +1 -0
- package/esm/array/array.at.js +2 -0
- package/esm/array/array.at.js.map +1 -0
- package/esm/array/array.concat.d.ts +13 -0
- package/esm/array/array.concat.d.ts.map +1 -0
- package/esm/array/array.concat.js +2 -0
- package/esm/array/array.concat.js.map +1 -0
- package/esm/array/array.entries.d.ts +17 -0
- package/esm/array/array.entries.d.ts.map +1 -0
- package/esm/array/array.entries.js +2 -0
- package/esm/array/array.entries.js.map +1 -0
- package/esm/array/array.find.d.ts +21 -0
- package/esm/array/array.find.d.ts.map +1 -0
- package/esm/array/array.find.js +2 -0
- package/esm/array/array.find.js.map +1 -0
- package/esm/array/array.find_last.d.ts +17 -0
- package/esm/array/array.find_last.d.ts.map +1 -0
- package/esm/array/array.find_last.js +2 -0
- package/esm/array/array.find_last.js.map +1 -0
- package/esm/array/array.reverse.d.ts +2 -0
- package/esm/array/array.reverse.d.ts.map +1 -0
- package/esm/array/array.reverse.js +2 -0
- package/esm/array/array.reverse.js.map +1 -0
- package/esm/array/array.some.d.ts +29 -0
- package/esm/array/array.some.d.ts.map +1 -0
- package/esm/array/array.some.js +2 -0
- package/esm/array/array.some.js.map +1 -0
- package/esm/array/array_index.d.ts +8 -8
- package/esm/array/array_index.d.ts.map +1 -1
- package/esm/array/array_plus.d.ts +9 -1
- package/esm/array/array_plus.d.ts.map +1 -1
- package/esm/array/array_plus.split_at.d.ts +30 -0
- package/esm/array/array_plus.split_at.d.ts.map +1 -0
- package/esm/array/array_plus.split_at.js +2 -0
- package/esm/array/array_plus.split_at.js.map +1 -0
- package/esm/array/drop.d.ts +2 -2
- package/esm/array/drop.d.ts.map +1 -1
- package/esm/array/index.d.ts +4 -5
- package/esm/array/index.d.ts.map +1 -1
- package/esm/array/index.js +4 -5
- package/esm/array/index.js.map +1 -1
- package/esm/array/pad_start.d.ts +32 -0
- package/esm/array/pad_start.d.ts.map +1 -0
- package/esm/array/pad_start.js +2 -0
- package/esm/array/pad_start.js.map +1 -0
- package/esm/assertion/assert_type.d.ts +3 -0
- package/esm/assertion/assert_type.d.ts.map +1 -1
- package/esm/assertion/assert_type.js +3 -0
- package/esm/assertion/assert_type.js.map +1 -1
- package/esm/bigint/cast.d.ts +10 -0
- package/esm/bigint/cast.d.ts.map +1 -0
- package/esm/bigint/cast.js +2 -0
- package/esm/bigint/cast.js.map +1 -0
- package/esm/equal/equal.d.ts +51 -3
- package/esm/equal/equal.d.ts.map +1 -1
- package/esm/functional/Maybe.d.ts +2 -2
- package/esm/functional/Maybe.d.ts.map +1 -1
- package/esm/index.d.ts +16 -7
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +5 -0
- package/esm/index.js.map +1 -1
- package/esm/math/abs.d.ts +6 -0
- package/esm/math/abs.d.ts.map +1 -0
- package/esm/math/abs.js +2 -0
- package/esm/math/abs.js.map +1 -0
- package/esm/math/add.d.ts +7 -0
- package/esm/math/add.d.ts.map +1 -0
- package/esm/math/add.js +2 -0
- package/esm/math/add.js.map +1 -0
- package/esm/math/greater_than.d.ts +4 -0
- package/esm/math/greater_than.d.ts.map +1 -0
- package/esm/math/greater_than.js +2 -0
- package/esm/math/greater_than.js.map +1 -0
- package/esm/math/index.d.ts +6 -6
- package/esm/math/index.d.ts.map +1 -1
- package/esm/math/math_plus.d.ts +5 -0
- package/esm/math/math_plus.d.ts.map +1 -0
- package/esm/math/math_plus.js +2 -0
- package/esm/math/math_plus.js.map +1 -0
- package/esm/math/math_plus.to_negative.d.ts +13 -0
- package/esm/math/math_plus.to_negative.d.ts.map +1 -0
- package/esm/math/math_plus.to_negative.js +2 -0
- package/esm/math/math_plus.to_negative.js.map +1 -0
- package/esm/math/max.d.ts +4 -0
- package/esm/math/max.d.ts.map +1 -0
- package/esm/math/max.js +2 -0
- package/esm/math/max.js.map +1 -0
- package/esm/math/multiply.d.ts +6 -0
- package/esm/math/multiply.d.ts.map +1 -0
- package/esm/math/multiply.js +2 -0
- package/esm/math/multiply.js.map +1 -0
- package/esm/math/numeric_struct.d.ts +1469 -0
- package/esm/math/numeric_struct.d.ts.map +1 -0
- package/esm/math/numeric_struct.js +2 -0
- package/esm/math/numeric_struct.js.map +1 -0
- package/esm/math/subtract.d.ts +7 -0
- package/esm/math/subtract.d.ts.map +1 -0
- package/esm/math/subtract.js +2 -0
- package/esm/math/subtract.js.map +1 -0
- package/esm/nominal/brand.js +1 -1
- package/esm/nominal/brand.js.map +1 -1
- package/esm/nominal/flavor.js +1 -1
- package/esm/nominal/flavor.js.map +1 -1
- package/esm/number/cast.d.ts +10 -0
- package/esm/number/cast.d.ts.map +1 -0
- package/esm/number/cast.js +2 -0
- package/esm/number/cast.js.map +1 -0
- package/esm/number/number_array.d.ts +1 -2
- package/esm/number/number_array.d.ts.map +1 -1
- package/esm/number/number_array.js +14 -0
- package/esm/number/number_array.js.map +1 -1
- package/esm/number/number_plus.d.ts +4 -5
- package/esm/number/number_plus.d.ts.map +1 -1
- package/esm/number/strict_number_type.d.ts +12 -0
- package/esm/number/strict_number_type.d.ts.map +1 -1
- package/esm/numeric/cast.d.ts +27 -0
- package/esm/numeric/cast.d.ts.map +1 -0
- package/esm/numeric/cast.js +2 -0
- package/esm/numeric/cast.js.map +1 -0
- package/{cjs/number → esm/numeric}/integer.d.ts +2 -0
- package/esm/numeric/integer.d.ts.map +1 -0
- package/esm/{number → numeric}/integer.js.map +1 -1
- package/esm/numeric/negative.d.ts.map +1 -0
- package/esm/{number → numeric}/negative.js.map +1 -1
- package/esm/numeric/numeric_plus.d.ts +5 -0
- package/esm/numeric/numeric_plus.d.ts.map +1 -0
- package/esm/numeric/numeric_plus.js +2 -0
- package/esm/numeric/numeric_plus.js.map +1 -0
- package/esm/numeric/numeric_type.d.ts.map +1 -0
- package/esm/{number → numeric}/numeric_type.js.map +1 -1
- package/esm/{number → numeric}/positive.d.ts +2 -2
- package/esm/numeric/positive.d.ts.map +1 -0
- package/esm/{number → numeric}/positive.js.map +1 -1
- package/esm/object/ANotB.d.ts +3 -3
- package/esm/object/ANotB.d.ts.map +1 -1
- package/esm/object/Partial.d.ts +6 -0
- package/esm/object/Partial.d.ts.map +1 -1
- package/esm/object/Required.d.ts +4 -0
- package/esm/object/Required.d.ts.map +1 -1
- package/esm/object/index.d.ts +1 -1
- package/esm/object/index.d.ts.map +1 -1
- package/esm/object/object_type.d.ts +1 -1
- package/esm/object/split.d.ts +3 -1
- package/esm/object/split.d.ts.map +1 -1
- package/esm/object/split.js.map +1 -1
- package/esm/predicates/CanAssign.d.ts +35 -0
- package/esm/predicates/CanAssign.d.ts.map +1 -1
- package/esm/predicates/CanAssign.js.map +1 -1
- package/esm/predicates/Extends.d.ts +2 -2
- package/esm/predicates/Extends.d.ts.map +1 -1
- package/esm/predicates/index.d.ts +0 -1
- package/esm/predicates/index.d.ts.map +1 -1
- package/esm/predicates/index.js +0 -1
- package/esm/predicates/index.js.map +1 -1
- package/esm/testing/test_type.d.ts +125 -50
- package/esm/testing/test_type.d.ts.map +1 -1
- package/esm/testing/test_type.js +4 -141
- package/esm/testing/test_type.js.map +1 -1
- package/esm/tuple/create_tuple.d.ts +28 -0
- package/esm/tuple/create_tuple.d.ts.map +1 -0
- package/esm/{array → tuple}/create_tuple.js.map +1 -1
- package/esm/tuple/tuple_plus.d.ts +2 -0
- package/esm/tuple/tuple_plus.d.ts.map +1 -0
- package/esm/tuple/tuple_plus.js +2 -0
- package/esm/tuple/tuple_plus.js.map +1 -0
- package/esm/tuple/tuple_plus.pad_start.d.ts +22 -0
- package/esm/tuple/tuple_plus.pad_start.d.ts.map +1 -0
- package/esm/tuple/tuple_plus.pad_start.js +2 -0
- package/esm/tuple/tuple_plus.pad_start.js.map +1 -0
- package/esm/{predicates/isType.d.ts → type-guard/is_type.d.ts} +5 -3
- package/esm/type-guard/is_type.d.ts.map +1 -0
- package/esm/{predicates/isType.js → type-guard/is_type.js} +8 -2
- package/esm/type-guard/is_type.js.map +1 -0
- package/package.json +1 -1
- package/ts/array/{array.ts → array.at.ts} +10 -15
- package/ts/array/array.concat.ts +12 -0
- package/ts/array/array.entries.ts +24 -0
- package/ts/array/array.find.ts +32 -0
- package/ts/array/array.find_last.ts +27 -0
- package/ts/array/array.reverse.ts +16 -0
- package/ts/array/array.some.ts +53 -0
- package/ts/array/array_index.ts +16 -10
- package/ts/array/array_plus.split_at.ts +47 -0
- package/ts/array/array_plus.ts +9 -1
- package/ts/array/drop.ts +2 -2
- package/ts/array/index.ts +4 -5
- package/ts/array/pad_start.ts +43 -0
- package/ts/array/readme.md +184 -4
- package/ts/assertion/assert_type.ts +6 -0
- package/ts/assertion/readme.md +132 -1
- package/ts/bigint/cast.ts +13 -0
- package/ts/bigint/readme.md +17 -17
- package/ts/equal/equal.ts +53 -3
- package/ts/equal/readme.md +30 -16
- package/ts/functional/Maybe.ts +2 -2
- package/ts/index.ts +22 -24
- package/ts/math/README.md +97 -7
- package/ts/math/abs.ts +18 -0
- package/ts/math/add.ts +14 -0
- package/ts/math/greater_than.ts +12 -0
- package/ts/math/index.ts +7 -6
- package/ts/math/math_plus.to_negative.ts +22 -0
- package/ts/math/math_plus.ts +4 -0
- package/ts/math/max.ts +13 -0
- package/ts/math/multiply.ts +12 -0
- package/ts/math/numeric_struct.ts +658 -0
- package/ts/math/subtract.ts +14 -0
- package/ts/nominal/brand.ts +1 -1
- package/ts/nominal/flavor.ts +1 -1
- package/ts/number/cast.ts +17 -0
- package/ts/number/number_array.ts +14 -14
- package/ts/number/number_plus.ts +6 -6
- package/ts/number/readme.md +0 -108
- package/ts/number/strict_number_type.ts +12 -0
- package/ts/numeric/cast.ts +28 -0
- package/ts/{number → numeric}/integer.ts +2 -0
- package/ts/numeric/numeric_plus.ts +12 -0
- package/ts/{number → numeric}/positive.ts +2 -2
- package/ts/numeric/readme.md +115 -0
- package/ts/object/ANotB.ts +3 -3
- package/ts/object/Partial.ts +5 -0
- package/ts/object/Required.ts +4 -0
- package/ts/object/index.ts +1 -1
- package/ts/object/object_type.ts +1 -1
- package/ts/object/split.ts +3 -1
- package/ts/predicates/CanAssign.ts +46 -0
- package/ts/predicates/Extends.ts +2 -2
- package/ts/predicates/index.ts +0 -1
- package/ts/testing/test_type.ts +131 -88
- package/ts/tuple/create_tuple.ts +42 -0
- package/ts/tuple/tuple_plus.pad_start.ts +42 -0
- package/ts/tuple/tuple_plus.ts +1 -0
- package/ts/{predicates/isType.ts → type-guard/is_type.ts} +11 -3
- package/ts/type-guard/readme.md +37 -0
- package/cjs/array/array.d.ts.map +0 -1
- package/cjs/array/array.js.map +0 -1
- package/cjs/array/create_tuple.d.ts +0 -11
- package/cjs/array/create_tuple.d.ts.map +0 -1
- package/cjs/array/find_first.d.ts +0 -6
- package/cjs/array/find_first.d.ts.map +0 -1
- package/cjs/array/find_first.js.map +0 -1
- package/cjs/array/find_last.d.ts +0 -2
- package/cjs/array/find_last.d.ts.map +0 -1
- package/cjs/array/find_last.js.map +0 -1
- package/cjs/array/pad_left.d.ts +0 -6
- package/cjs/array/pad_left.d.ts.map +0 -1
- package/cjs/array/pad_left.js.map +0 -1
- package/cjs/array/some.d.ts +0 -8
- package/cjs/array/some.d.ts.map +0 -1
- package/cjs/array/some.js.map +0 -1
- package/cjs/math/Abs.d.ts +0 -3
- package/cjs/math/Abs.d.ts.map +0 -1
- package/cjs/math/Abs.js.map +0 -1
- package/cjs/math/Add.d.ts +0 -19
- package/cjs/math/Add.d.ts.map +0 -1
- package/cjs/math/Add.js.map +0 -1
- package/cjs/math/Digit.d.ts +0 -100
- package/cjs/math/Digit.d.ts.map +0 -1
- package/cjs/math/Digit.js +0 -3
- package/cjs/math/Digit.js.map +0 -1
- package/cjs/math/GreaterThan.d.ts +0 -13
- package/cjs/math/GreaterThan.d.ts.map +0 -1
- package/cjs/math/GreaterThan.js +0 -3
- package/cjs/math/GreaterThan.js.map +0 -1
- package/cjs/math/Max.d.ts +0 -4
- package/cjs/math/Max.d.ts.map +0 -1
- package/cjs/math/Max.js.map +0 -1
- package/cjs/math/Subtract.d.ts +0 -19
- package/cjs/math/Subtract.d.ts.map +0 -1
- package/cjs/math/Subtract.js +0 -3
- package/cjs/math/Subtract.js.map +0 -1
- package/cjs/number/integer.d.ts.map +0 -1
- package/cjs/number/negative.d.ts.map +0 -1
- package/cjs/number/numeric_type.d.ts.map +0 -1
- package/cjs/number/positive.d.ts.map +0 -1
- package/cjs/predicates/isType.d.ts.map +0 -1
- package/cjs/predicates/isType.js.map +0 -1
- package/esm/array/array.d.ts.map +0 -1
- package/esm/array/array.js +0 -2
- package/esm/array/array.js.map +0 -1
- package/esm/array/create_tuple.d.ts +0 -11
- package/esm/array/create_tuple.d.ts.map +0 -1
- package/esm/array/find_first.d.ts +0 -6
- package/esm/array/find_first.d.ts.map +0 -1
- package/esm/array/find_first.js +0 -2
- package/esm/array/find_first.js.map +0 -1
- package/esm/array/find_last.d.ts +0 -2
- package/esm/array/find_last.d.ts.map +0 -1
- package/esm/array/find_last.js +0 -2
- package/esm/array/find_last.js.map +0 -1
- package/esm/array/pad_left.d.ts +0 -6
- package/esm/array/pad_left.d.ts.map +0 -1
- package/esm/array/pad_left.js +0 -2
- package/esm/array/pad_left.js.map +0 -1
- package/esm/array/some.d.ts +0 -8
- package/esm/array/some.d.ts.map +0 -1
- package/esm/array/some.js +0 -2
- package/esm/array/some.js.map +0 -1
- package/esm/math/Abs.d.ts +0 -3
- package/esm/math/Abs.d.ts.map +0 -1
- package/esm/math/Abs.js +0 -2
- package/esm/math/Abs.js.map +0 -1
- package/esm/math/Add.d.ts +0 -19
- package/esm/math/Add.d.ts.map +0 -1
- package/esm/math/Add.js +0 -2
- package/esm/math/Add.js.map +0 -1
- package/esm/math/Digit.d.ts +0 -100
- package/esm/math/Digit.d.ts.map +0 -1
- package/esm/math/Digit.js +0 -2
- package/esm/math/Digit.js.map +0 -1
- package/esm/math/GreaterThan.d.ts +0 -13
- package/esm/math/GreaterThan.d.ts.map +0 -1
- package/esm/math/GreaterThan.js +0 -2
- package/esm/math/GreaterThan.js.map +0 -1
- package/esm/math/Max.d.ts +0 -4
- package/esm/math/Max.d.ts.map +0 -1
- package/esm/math/Max.js +0 -2
- package/esm/math/Max.js.map +0 -1
- package/esm/math/Subtract.d.ts +0 -19
- package/esm/math/Subtract.d.ts.map +0 -1
- package/esm/math/Subtract.js +0 -2
- package/esm/math/Subtract.js.map +0 -1
- package/esm/number/integer.d.ts.map +0 -1
- package/esm/number/negative.d.ts.map +0 -1
- package/esm/number/numeric_type.d.ts.map +0 -1
- package/esm/number/positive.d.ts.map +0 -1
- package/esm/predicates/isType.d.ts.map +0 -1
- package/esm/predicates/isType.js.map +0 -1
- package/ts/array/create_tuple.ts +0 -17
- package/ts/array/find_first.ts +0 -16
- package/ts/array/find_last.ts +0 -11
- package/ts/array/pad_left.ts +0 -16
- package/ts/array/some.ts +0 -33
- package/ts/math/Abs.ts +0 -7
- package/ts/math/Add.ts +0 -58
- package/ts/math/Digit.ts +0 -152
- package/ts/math/GreaterThan.ts +0 -55
- package/ts/math/Max.ts +0 -10
- package/ts/math/Subtract.ts +0 -57
- /package/cjs/{number → numeric}/integer.js +0 -0
- /package/cjs/{number → numeric}/negative.d.ts +0 -0
- /package/cjs/{number → numeric}/negative.js +0 -0
- /package/cjs/{number → numeric}/numeric_type.d.ts +0 -0
- /package/cjs/{number → numeric}/numeric_type.js +0 -0
- /package/cjs/{number → numeric}/positive.js +0 -0
- /package/cjs/{array → tuple}/create_tuple.js +0 -0
- /package/esm/{number → numeric}/integer.js +0 -0
- /package/esm/{number → numeric}/negative.d.ts +0 -0
- /package/esm/{number → numeric}/negative.js +0 -0
- /package/esm/{number → numeric}/numeric_type.d.ts +0 -0
- /package/esm/{number → numeric}/numeric_type.js +0 -0
- /package/esm/{number → numeric}/positive.js +0 -0
- /package/esm/{array → tuple}/create_tuple.js +0 -0
- /package/ts/{number → numeric}/negative.ts +0 -0
- /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>
|