type-plus 8.0.0-beta.2 → 8.0.0-beta.3
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/esm/any/is_any.d.ts.map +1 -1
- package/esm/any/is_not_any.d.ts.map +1 -1
- package/esm/array/array.at.d.ts.map +1 -1
- package/esm/array/array.entries.d.ts +1 -1
- package/esm/array/array.entries.d.ts.map +1 -1
- package/esm/array/array.find_last.d.ts +1 -1
- package/esm/array/array.find_last.d.ts.map +1 -1
- package/esm/array/array.reverse.d.ts.map +1 -1
- package/esm/array/array.some.d.ts +2 -2
- package/esm/array/array.some.d.ts.map +1 -1
- package/esm/array/array_plus.common_prop_keys.d.ts.map +1 -1
- package/esm/array/array_plus.drop_match.d.ts +1 -1
- package/esm/array/array_plus.drop_match.d.ts.map +1 -1
- package/esm/array/array_plus.element_match.d.ts +4 -2
- package/esm/array/array_plus.element_match.d.ts.map +1 -1
- package/esm/array/array_plus.filter.d.ts +4 -4
- package/esm/array/array_plus.filter.d.ts.map +1 -1
- package/esm/array/array_plus.find.d.ts +1 -1
- package/esm/array/array_plus.find.d.ts.map +1 -1
- package/esm/array/array_plus.index_at.d.ts.map +1 -1
- package/esm/array/array_plus.index_at.js.map +1 -1
- package/esm/array/array_plus.is_index_out_of_bound.d.ts.map +1 -1
- package/esm/array/array_plus.is_readonly.d.ts.map +1 -1
- package/esm/array/array_plus.pad_start.d.ts.map +1 -1
- package/esm/array/array_plus.split_at.d.ts +4 -4
- package/esm/array/array_plus.split_at.d.ts.map +1 -1
- package/esm/array/find_first.d.ts.map +1 -1
- package/esm/array/head.d.ts.map +1 -1
- package/esm/array/intersect_of_props.d.ts.map +1 -1
- package/esm/array/is_array.d.ts +2 -2
- package/esm/array/is_array.d.ts.map +1 -1
- package/esm/array/is_not_array.d.ts +2 -2
- package/esm/array/is_not_array.d.ts.map +1 -1
- package/esm/array/last.d.ts.map +1 -1
- package/esm/array/loose_array_type.d.ts.map +1 -1
- package/esm/array/pad_start.d.ts.map +1 -1
- package/esm/array/reverse.d.ts.map +1 -1
- package/esm/array/union_of_props.d.ts.map +1 -1
- package/esm/assertion/assert_type.js +6 -5
- package/esm/assertion/assert_type.js.map +1 -1
- package/esm/bigint/cast.d.ts.map +1 -1
- package/esm/bigint/is_bigint.d.ts +2 -4
- package/esm/bigint/is_bigint.d.ts.map +1 -1
- package/esm/bigint/is_bigint_literal.d.ts +2 -4
- package/esm/bigint/is_bigint_literal.d.ts.map +1 -1
- package/esm/bigint/is_not_bigint.d.ts +2 -4
- package/esm/bigint/is_not_bigint.d.ts.map +1 -1
- package/esm/bigint/is_not_bigint_literal.d.ts +2 -4
- package/esm/bigint/is_not_bigint_literal.d.ts.map +1 -1
- package/esm/boolean/is_boolean.d.ts +2 -8
- package/esm/boolean/is_boolean.d.ts.map +1 -1
- package/esm/boolean/is_false.d.ts.map +1 -1
- package/esm/boolean/is_not_boolean.d.ts +2 -8
- package/esm/boolean/is_not_boolean.d.ts.map +1 -1
- package/esm/boolean/is_not_false.d.ts.map +1 -1
- package/esm/boolean/is_not_true.d.ts.map +1 -1
- package/esm/boolean/is_true.d.ts.map +1 -1
- package/esm/class/isConstructor.js +1 -0
- package/esm/class/isConstructor.js.map +1 -1
- package/esm/equal/equal.d.ts.map +1 -1
- package/esm/equal/identity_equal.d.ts +1 -1
- package/esm/equal/identity_equal.d.ts.map +1 -1
- package/esm/function/extract_function.d.ts.map +1 -1
- package/esm/function/extract_function.js.map +1 -1
- package/esm/function/is_not_strict_function.d.ts +1 -1
- package/esm/function/is_not_strict_function.d.ts.map +1 -1
- package/esm/function/is_strict_function.d.ts.map +1 -1
- package/esm/functional/Maybe.d.ts.map +1 -1
- package/esm/functional/Maybe.js.map +1 -1
- package/esm/functional/compose.d.ts.map +1 -1
- package/esm/functional/compose.js.map +1 -1
- package/esm/functional/context.d.ts.map +1 -1
- package/esm/math/abs.d.ts.map +1 -1
- package/esm/math/math_plus.to_negative.d.ts.map +1 -1
- package/esm/math/max.d.ts.map +1 -1
- package/esm/math/numeric_struct.d.ts.map +1 -1
- package/esm/mix_types/box.d.ts.map +1 -1
- package/esm/mix_types/is_any_or_never.d.ts.map +1 -1
- package/esm/mix_types/merge.d.ts +9 -9
- package/esm/mix_types/merge.d.ts.map +1 -1
- package/esm/mix_types/merge.js +9 -9
- package/esm/mix_types/merge.js.map +1 -1
- package/esm/never/is_never.d.ts.map +1 -1
- package/esm/never/is_not_never.d.ts.map +1 -1
- package/esm/nodejs/isNodeError.d.ts.map +1 -1
- package/esm/nominal/brand.d.ts.map +1 -1
- package/esm/nominal/brand.js +1 -1
- package/esm/nominal/brand.js.map +1 -1
- package/esm/nominal/flavor.d.ts.map +1 -1
- package/esm/nominal/flavor.js +1 -1
- package/esm/nominal/flavor.js.map +1 -1
- package/esm/nominal/nominal_match.d.ts.map +1 -1
- package/esm/nominal/nominal_match.js.map +1 -1
- package/esm/null/is_not_null.d.ts.map +1 -1
- package/esm/null/is_null.d.ts.map +1 -1
- package/esm/number/cast.d.ts.map +1 -1
- package/esm/number/is_not_number.d.ts +2 -4
- package/esm/number/is_not_number.d.ts.map +1 -1
- package/esm/number/is_not_number_literal.d.ts +2 -4
- package/esm/number/is_not_number_literal.d.ts.map +1 -1
- package/esm/number/is_number.d.ts +2 -4
- package/esm/number/is_number.d.ts.map +1 -1
- package/esm/number/is_number_literal.d.ts +2 -4
- package/esm/number/is_number_literal.d.ts.map +1 -1
- package/esm/numeric/is_integer.d.ts +2 -2
- package/esm/numeric/is_integer.d.ts.map +1 -1
- package/esm/numeric/is_negative.d.ts +5 -5
- package/esm/numeric/is_negative.d.ts.map +1 -1
- package/esm/numeric/is_not_integer.d.ts +2 -2
- package/esm/numeric/is_not_integer.d.ts.map +1 -1
- package/esm/numeric/is_not_negative.d.ts +3 -3
- package/esm/numeric/is_not_negative.d.ts.map +1 -1
- package/esm/numeric/is_not_positive.d.ts +3 -3
- package/esm/numeric/is_not_positive.d.ts.map +1 -1
- package/esm/numeric/is_positive.d.ts +3 -3
- package/esm/numeric/is_positive.d.ts.map +1 -1
- package/esm/numeric/numeric_type.d.ts.map +1 -1
- package/esm/object/ANotB.d.ts.map +1 -1
- package/esm/object/IsDisjoint.d.ts.map +1 -1
- package/esm/object/KeysWithDiffType.d.ts.map +1 -1
- package/esm/object/KnownKeys.d.ts.map +1 -1
- package/esm/object/RecursiveIntersect.d.ts +1 -1
- package/esm/object/RecursiveIntersect.d.ts.map +1 -1
- package/esm/object/RecursiveRequired.d.ts.map +1 -1
- package/esm/object/SpreadRecord.d.ts.map +1 -1
- package/esm/object/facade.d.ts.map +1 -1
- package/esm/object/facade.js.map +1 -1
- package/esm/object/getField.d.ts.map +1 -1
- package/esm/object/getField.js.map +1 -1
- package/esm/object/hasKey.js +1 -1
- package/esm/object/hasKey.js.map +1 -1
- package/esm/object/is_not_object.d.ts +1 -3
- package/esm/object/is_not_object.d.ts.map +1 -1
- package/esm/object/is_object.d.ts.map +1 -1
- package/esm/object/left_join.d.ts.map +1 -1
- package/esm/object/merge.d.ts +6 -5
- package/esm/object/merge.d.ts.map +1 -1
- package/esm/object/omit.d.ts +7 -0
- package/esm/object/omit.d.ts.map +1 -1
- package/esm/object/omit.js.map +1 -1
- package/esm/object/optional_key.d.ts.map +1 -1
- package/esm/object/pick.d.ts.map +1 -1
- package/esm/object/pick.js.map +1 -1
- package/esm/object/recursive_partial.d.ts.map +1 -1
- package/esm/object/split.d.ts +1 -7
- package/esm/object/split.d.ts.map +1 -1
- package/esm/object/split.js +1 -1
- package/esm/object/split.js.map +1 -1
- package/esm/object/typeOverrideIncompatible.js.map +1 -1
- package/esm/predicates/CanAssign.d.ts.map +1 -1
- package/esm/predicates/CanAssign.js.map +1 -1
- package/esm/predicates/assignable.d.ts.map +1 -1
- package/esm/predicates/literal.d.ts.map +1 -1
- package/esm/predicates/logical.d.ts.map +1 -1
- package/esm/predicates/not_assignable.d.ts.map +1 -1
- package/esm/primitive.d.ts.map +1 -1
- package/esm/promise/index.d.ts.map +1 -1
- package/esm/promise/mapSeries.js +1 -1
- package/esm/promise/mapSeries.js.map +1 -1
- package/esm/string/$extract_manipulated_string.d.ts +5 -5
- package/esm/string/$extract_manipulated_string.d.ts.map +1 -1
- package/esm/string/_string_type.d.ts.map +1 -1
- package/esm/string/is_not_string.d.ts +2 -4
- package/esm/string/is_not_string.d.ts.map +1 -1
- package/esm/string/is_not_string_literal.d.ts +4 -8
- package/esm/string/is_not_string_literal.d.ts.map +1 -1
- package/esm/string/is_not_template_literal.d.ts.map +1 -1
- package/esm/string/is_string.d.ts +2 -4
- package/esm/string/is_string.d.ts.map +1 -1
- package/esm/string/is_string_literal.d.ts +4 -8
- package/esm/string/is_string_literal.d.ts.map +1 -1
- package/esm/string/is_template_literal.d.ts.map +1 -1
- package/esm/string/string.d.ts.map +1 -1
- package/esm/string/string_plus.d.ts.map +1 -1
- package/esm/symbol/is_not_symbol.d.ts.map +1 -1
- package/esm/symbol/is_symbol.d.ts.map +1 -1
- package/esm/testing/test_type.d.ts.map +1 -1
- package/esm/tuple/common_prop_keys.d.ts.map +1 -1
- package/esm/tuple/create_tuple.d.ts.map +1 -1
- package/esm/tuple/drop.d.ts.map +1 -1
- package/esm/tuple/drop.js +1 -1
- package/esm/tuple/drop.js.map +1 -1
- package/esm/tuple/is_not_tuple.d.ts +2 -2
- package/esm/tuple/is_not_tuple.d.ts.map +1 -1
- package/esm/tuple/is_tuple.d.ts +2 -2
- package/esm/tuple/is_tuple.d.ts.map +1 -1
- package/esm/tuple/tail.d.ts +1 -1
- package/esm/tuple/tail.d.ts.map +1 -1
- package/esm/tuple/tuple_plus.common_prop_keys.d.ts +1 -1
- package/esm/tuple/tuple_plus.common_prop_keys.d.ts.map +1 -1
- package/esm/tuple/tuple_plus.drop_match.d.ts.map +1 -1
- package/esm/tuple/tuple_plus.filter.d.ts +1 -1
- package/esm/tuple/tuple_plus.filter.d.ts.map +1 -1
- package/esm/tuple/tuple_plus.find.d.ts +2 -2
- package/esm/tuple/tuple_plus.find.d.ts.map +1 -1
- package/esm/tuple/tuple_plus.pad_start.d.ts +1 -4
- package/esm/tuple/tuple_plus.pad_start.d.ts.map +1 -1
- package/esm/type_plus/$equality.d.ts.map +1 -1
- package/esm/type_plus/$infer_error.d.ts.map +1 -1
- package/esm/type_plus/$merge_options.d.ts.map +1 -1
- package/esm/type_plus/$resolve_options.d.ts +1 -1
- package/esm/type_plus/$resolve_options.d.ts.map +1 -1
- package/esm/type_plus/$special_type.d.ts +1 -7
- package/esm/type_plus/$special_type.d.ts.map +1 -1
- package/esm/type_plus/$type.d.ts.map +1 -1
- package/esm/type_plus/branch/$branch.d.ts.map +1 -1
- package/esm/type_plus/branch/$exact.d.ts +4 -1
- package/esm/type_plus/branch/$exact.d.ts.map +1 -1
- package/esm/type_plus/branch/$input_options.d.ts.map +1 -1
- package/esm/type_plus/branch/$is_distributive.d.ts.map +1 -1
- package/esm/type_plus/branch/$resolve_branch.d.ts +8 -9
- package/esm/type_plus/branch/$resolve_branch.d.ts.map +1 -1
- package/esm/type_plus/branch/$select.d.ts +1 -3
- package/esm/type_plus/branch/$select.d.ts.map +1 -1
- package/esm/type_plus/branch/$select_invert.d.ts +1 -3
- package/esm/type_plus/branch/$select_invert.d.ts.map +1 -1
- package/esm/type_plus/branch/$select_invert_strict.d.ts +1 -4
- package/esm/type_plus/branch/$select_invert_strict.d.ts.map +1 -1
- package/esm/type_plus/branch/$select_strict.d.ts +1 -4
- package/esm/type_plus/branch/$select_strict.d.ts.map +1 -1
- package/esm/type_plus/branch/$selection.d.ts.map +1 -1
- package/esm/type_plus/branch/$selection_options.d.ts.map +1 -1
- package/esm/undefined/has_undefined.d.ts +3 -1
- package/esm/undefined/has_undefined.d.ts.map +1 -1
- package/esm/undefined/is_not_undefined.d.ts.map +1 -1
- package/esm/undefined/is_undefined.d.ts.map +1 -1
- package/esm/union/union.d.ts.map +1 -1
- package/esm/union/union_to_intersection.d.ts.map +1 -1
- package/esm/union/union_to_intersection.js.map +1 -1
- package/esm/unknown/is_not_unknown.d.ts.map +1 -1
- package/esm/unknown/is_unknown.d.ts.map +1 -1
- package/esm/unknown/not_unknown_or.d.ts.map +1 -1
- package/esm/unknown/unknown.d.ts.map +1 -1
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/void/is_not_void.d.ts.map +1 -1
- package/esm/void/is_void.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/any/is_any.ts +8 -8
- package/src/any/is_not_any.ts +8 -8
- package/src/array/array.at.ts +22 -19
- package/src/array/array.entries.ts +3 -3
- package/src/array/array.find_last.ts +6 -6
- package/src/array/array.reverse.ts +3 -2
- package/src/array/array.some.ts +4 -4
- package/src/array/array_plus.common_prop_keys.ts +5 -6
- package/src/array/array_plus.drop_match.ts +7 -7
- package/src/array/array_plus.element_match.ts +25 -22
- package/src/array/array_plus.filter.ts +11 -12
- package/src/array/array_plus.find.ts +9 -11
- package/src/array/array_plus.index_at.ts +29 -35
- package/src/array/array_plus.is_index_out_of_bound.ts +1 -1
- package/src/array/array_plus.is_readonly.ts +17 -21
- package/src/array/array_plus.pad_start.ts +3 -7
- package/src/array/array_plus.split_at.ts +17 -19
- package/src/array/find_first.ts +6 -5
- package/src/array/head.ts +9 -8
- package/src/array/intersect_of_props.ts +5 -5
- package/src/array/is_array.ts +31 -32
- package/src/array/is_not_array.ts +32 -32
- package/src/array/last.ts +14 -9
- package/src/array/loose_array_type.ts +2 -2
- package/src/array/pad_start.ts +1 -3
- package/src/array/reverse.ts +8 -8
- package/src/array/union_of_props.ts +2 -2
- package/src/assertion/assert_type.ts +5 -3
- package/src/bigint/cast.ts +2 -2
- package/src/bigint/is_bigint.ts +17 -20
- package/src/bigint/is_bigint_literal.ts +12 -14
- package/src/bigint/is_not_bigint.ts +14 -16
- package/src/bigint/is_not_bigint_literal.ts +17 -16
- package/src/boolean/is_boolean.ts +48 -36
- package/src/boolean/is_false.ts +5 -3
- package/src/boolean/is_not_boolean.ts +23 -25
- package/src/boolean/is_not_false.ts +5 -3
- package/src/boolean/is_not_true.ts +5 -3
- package/src/boolean/is_true.ts +5 -3
- package/src/class/isConstructor.ts +1 -1
- package/src/equal/equal.ts +22 -27
- package/src/equal/identity_equal.ts +5 -3
- package/src/function/extract_function.ts +1 -3
- package/src/function/is_not_strict_function.ts +12 -12
- package/src/function/is_strict_function.ts +12 -14
- package/src/functional/Maybe.ts +1 -3
- package/src/functional/compose.ts +2 -4
- package/src/functional/context.ts +1 -1
- package/src/index.ts +0 -1
- package/src/math/abs.ts +18 -8
- package/src/math/math_plus.to_negative.ts +6 -6
- package/src/math/max.ts +2 -2
- package/src/math/numeric_struct.ts +225 -231
- package/src/mix_types/box.ts +34 -37
- package/src/mix_types/is_any_or_never.ts +6 -6
- package/src/mix_types/merge.ts +24 -28
- package/src/never/is_never.ts +13 -10
- package/src/never/is_not_never.ts +13 -10
- package/src/nodejs/isNodeError.ts +13 -13
- package/src/nominal/brand.ts +3 -4
- package/src/nominal/flavor.ts +3 -4
- package/src/nominal/nominal_match.ts +3 -10
- package/src/null/is_not_null.ts +5 -4
- package/src/null/is_null.ts +9 -8
- package/src/number/cast.ts +6 -6
- package/src/number/is_not_number.ts +15 -17
- package/src/number/is_not_number_literal.ts +17 -16
- package/src/number/is_number.ts +15 -17
- package/src/number/is_number_literal.ts +12 -14
- package/src/numeric/is_integer.ts +33 -27
- package/src/numeric/is_negative.ts +23 -23
- package/src/numeric/is_not_integer.ts +31 -26
- package/src/numeric/is_not_negative.ts +19 -19
- package/src/numeric/is_not_positive.ts +19 -19
- package/src/numeric/is_positive.ts +21 -21
- package/src/numeric/numeric_plus.ts +0 -1
- package/src/numeric/numeric_type.ts +0 -1
- package/src/object/ANotB.ts +2 -2
- package/src/object/IsDisjoint.ts +1 -4
- package/src/object/KeysWithDiffType.ts +2 -2
- package/src/object/KnownKeys.ts +7 -7
- package/src/object/RecursiveIntersect.ts +8 -8
- package/src/object/RecursiveRequired.ts +2 -2
- package/src/object/SpreadRecord.ts +1 -4
- package/src/object/facade.ts +1 -9
- package/src/object/getField.ts +1 -4
- package/src/object/hasKey.ts +1 -1
- package/src/object/is_not_object.ts +23 -16
- package/src/object/is_object.ts +23 -15
- package/src/object/left_join.ts +2 -2
- package/src/object/merge.ts +53 -72
- package/src/object/omit.ts +16 -25
- package/src/object/optional_key.ts +1 -4
- package/src/object/pick.ts +8 -19
- package/src/object/recursive_partial.ts +6 -6
- package/src/object/split.ts +3 -14
- package/src/object/typeOverrideIncompatible.ts +3 -3
- package/src/predicates/CanAssign.ts +9 -5
- package/src/predicates/assignable.ts +23 -24
- package/src/predicates/literal.ts +8 -8
- package/src/predicates/logical.ts +4 -4
- package/src/predicates/not_assignable.ts +23 -22
- package/src/primitive.ts +1 -10
- package/src/promise/index.ts +1 -1
- package/src/promise/mapSeries.ts +1 -1
- package/src/string/$extract_manipulated_string.ts +25 -20
- package/src/string/_string_type.ts +6 -6
- package/src/string/is_not_string.ts +13 -15
- package/src/string/is_not_string_literal.ts +29 -34
- package/src/string/is_not_template_literal.ts +18 -21
- package/src/string/is_string.ts +17 -20
- package/src/string/is_string_literal.ts +29 -34
- package/src/string/is_template_literal.ts +18 -20
- package/src/string/string.ts +2 -2
- package/src/string/string_plus.ts +6 -7
- package/src/symbol/is_not_symbol.ts +5 -3
- package/src/symbol/is_symbol.ts +5 -3
- package/src/testing/test_type.ts +89 -89
- package/src/tuple/common_prop_keys.ts +2 -5
- package/src/tuple/create_tuple.ts +18 -18
- package/src/tuple/drop.ts +20 -22
- package/src/tuple/is_not_tuple.ts +19 -21
- package/src/tuple/is_tuple.ts +23 -26
- package/src/tuple/tail.ts +5 -3
- package/src/tuple/tuple_plus.common_prop_keys.ts +6 -12
- package/src/tuple/tuple_plus.drop_match.ts +11 -11
- package/src/tuple/tuple_plus.filter.ts +5 -12
- package/src/tuple/tuple_plus.find.ts +14 -24
- package/src/tuple/tuple_plus.pad_start.ts +12 -27
- package/src/type_plus/$equality.ts +1 -3
- package/src/type_plus/$infer_error.ts +3 -1
- package/src/type_plus/$merge_options.ts +3 -4
- package/src/type_plus/$resolve_options.ts +6 -5
- package/src/type_plus/$special_type.ts +7 -5
- package/src/type_plus/$type.ts +3 -3
- package/src/type_plus/branch/$branch.ts +1 -2
- package/src/type_plus/branch/$exact.ts +9 -5
- package/src/type_plus/branch/$input_options.ts +1 -2
- package/src/type_plus/branch/$is_distributive.ts +7 -4
- package/src/type_plus/branch/$resolve_branch.ts +29 -39
- package/src/type_plus/branch/$select.ts +15 -16
- package/src/type_plus/branch/$select_invert.ts +11 -16
- package/src/type_plus/branch/$select_invert_strict.ts +14 -19
- package/src/type_plus/branch/$select_strict.ts +11 -13
- package/src/type_plus/branch/$selection.ts +8 -9
- package/src/type_plus/branch/$selection_options.ts +3 -3
- package/src/undefined/has_undefined.ts +4 -3
- package/src/undefined/is_not_undefined.ts +9 -9
- package/src/undefined/is_undefined.ts +9 -8
- package/src/union/union.ts +1 -4
- package/src/union/union_to_intersection.ts +1 -3
- package/src/unknown/is_not_unknown.ts +8 -8
- package/src/unknown/is_unknown.ts +8 -8
- package/src/unknown/not_unknown_or.ts +7 -3
- package/src/unknown/unknown.ts +0 -1
- package/src/utils/index.ts +17 -17
- package/src/void/is_not_void.ts +14 -14
- package/src/void/is_void.ts +14 -14
|
@@ -83,25 +83,24 @@ export namespace NumericStruct {
|
|
|
83
83
|
*/
|
|
84
84
|
export type FromNumeric<N extends number | bigint, Fail = never> = N extends number
|
|
85
85
|
? number extends N
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
? Fail
|
|
87
|
+
: ['number', DigitsStruct.FromNumber<N>]
|
|
88
88
|
: N extends bigint
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
? bigint extends N
|
|
90
|
+
? Fail
|
|
91
|
+
: ['bigint', DigitsStruct.FromBigint<N>]
|
|
92
|
+
: never
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* Converts a `NumericStruct` to a number or bigint.
|
|
96
96
|
*
|
|
97
97
|
* It includes the normalization of the `NumericStruct`.
|
|
98
98
|
*/
|
|
99
|
-
export type ToNumeric<M extends NumericStruct> = DigitsStruct.ToString<
|
|
100
|
-
|
|
101
|
-
> extends infer S extends string
|
|
99
|
+
export type ToNumeric<M extends NumericStruct> = DigitsStruct.ToString<M[DIGITS_STRUCT]> extends infer S extends
|
|
100
|
+
string
|
|
102
101
|
? M[TYPE] extends 'bigint'
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
? StringToBigint<S, StringToNumber<S, `The value '${S}' cannot be represented as bigint or number`>>
|
|
103
|
+
: StringToNumber<S, StringToBigint<S, `The value '${S}' cannot be represented as bigint or number`>>
|
|
105
104
|
: never
|
|
106
105
|
|
|
107
106
|
export type Add<A extends NumericStruct, B extends NumericStruct> = [
|
|
@@ -126,8 +125,8 @@ type StringToBigint<S extends string, Fail> = S extends `${infer N extends bigin
|
|
|
126
125
|
// TODO: move into `NumericHelpers`
|
|
127
126
|
export type StringToNumber<S extends string, Fail> = S extends `${infer N extends number}`
|
|
128
127
|
? number extends N
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
? Fail
|
|
129
|
+
: N
|
|
131
130
|
: Fail
|
|
132
131
|
|
|
133
132
|
export type DigitsStruct = [Sign: '+' | '-', Digits: number[], Exponent: number]
|
|
@@ -144,21 +143,21 @@ export namespace DigitsStruct {
|
|
|
144
143
|
*/
|
|
145
144
|
export type FromNumber<N extends number> = `${N}` extends `-${infer R}`
|
|
146
145
|
? R extends `${infer W}.${infer F}`
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
146
|
+
? [DigitArray.FromString<W>, DigitArray.FromString<F>] extends [
|
|
147
|
+
infer WA extends number[],
|
|
148
|
+
infer FA extends number[]
|
|
149
|
+
]
|
|
150
|
+
? ['-', DigitArray.TrimLeadingZeros<[...WA, ...FA]>, FA['length']]
|
|
151
|
+
: never
|
|
152
|
+
: ['-', DigitArray.FromString<R>, 0]
|
|
154
153
|
: `${N}` extends `${infer W}.${infer F}`
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
? [DigitArray.FromString<W>, DigitArray.FromString<F>] extends [
|
|
155
|
+
infer WA extends number[],
|
|
156
|
+
infer FA extends number[]
|
|
157
|
+
]
|
|
158
|
+
? ['+', DigitArray.TrimLeadingZeros<[...WA, ...FA]>, FA['length']]
|
|
159
|
+
: never
|
|
160
|
+
: ['+', DigitArray.FromString<`${N}`>, 0]
|
|
162
161
|
|
|
163
162
|
/**
|
|
164
163
|
* Creates a `DigitsStruct` from bigint `N`.
|
|
@@ -176,22 +175,22 @@ export namespace DigitsStruct {
|
|
|
176
175
|
*/
|
|
177
176
|
export type ToString<D extends DigitsStruct> = (
|
|
178
177
|
PadStart<D[DIGITS], D[EXPONENT], 0> extends infer Padded extends number[]
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
178
|
+
? Padded['length'] extends D[EXPONENT]
|
|
179
|
+
? DigitArray.ToString<[0, '.', ...DigitArray.TrimTrailingZeros<Padded>]>
|
|
180
|
+
: SplitFloat<Padded, D[EXPONENT]> extends [infer W extends number[], infer F extends number[]]
|
|
181
|
+
? F extends []
|
|
182
|
+
? DigitArray.ToString<W>
|
|
183
|
+
: DigitArray.ToString<[...W, '.', ...DigitArray.TrimTrailingZeros<F>]>
|
|
184
|
+
: never
|
|
185
|
+
: never
|
|
187
186
|
) extends infer R
|
|
188
187
|
? R extends '0'
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
188
|
+
? R
|
|
189
|
+
: R extends string
|
|
190
|
+
? D[SIGN] extends '-'
|
|
191
|
+
? `-${R}`
|
|
192
|
+
: R
|
|
193
|
+
: never
|
|
195
194
|
: never
|
|
196
195
|
|
|
197
196
|
/**
|
|
@@ -202,10 +201,10 @@ export namespace DigitsStruct {
|
|
|
202
201
|
type SplitFloat<A extends number[], I extends number, F extends number[] = []> = I extends 0
|
|
203
202
|
? [A, []]
|
|
204
203
|
: F['length'] extends I
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
? [A, F]
|
|
205
|
+
: A extends [...infer H extends number[], infer T extends number]
|
|
206
|
+
? SplitFloat<H, I, [T, ...F]>
|
|
207
|
+
: never
|
|
209
208
|
|
|
210
209
|
/**
|
|
211
210
|
* Normalizes a `DigitsStruct`.
|
|
@@ -222,17 +221,13 @@ export namespace DigitsStruct {
|
|
|
222
221
|
? Normalize<FlipSign<N>, R>
|
|
223
222
|
: [N[SIGN], DigitArray.CarryDigits<N[DIGITS]>, N[EXPONENT]]
|
|
224
223
|
|
|
225
|
-
type FlipSign<
|
|
226
|
-
D extends DigitsStruct,
|
|
227
|
-
I extends number[] = D[DIGITS],
|
|
228
|
-
R extends number[] = []
|
|
229
|
-
> = I extends []
|
|
224
|
+
type FlipSign<D extends DigitsStruct, I extends number[] = D[DIGITS], R extends number[] = []> = I extends []
|
|
230
225
|
? D[SIGN] extends '-'
|
|
231
|
-
|
|
232
|
-
|
|
226
|
+
? ['+', R, D[EXPONENT]]
|
|
227
|
+
: ['-', R, D[EXPONENT]]
|
|
233
228
|
: I extends [infer H extends number, ...infer T extends number[]]
|
|
234
|
-
|
|
235
|
-
|
|
229
|
+
? FlipSign<D, T, [...R, Digit.FlipSign<H>]>
|
|
230
|
+
: never
|
|
236
231
|
|
|
237
232
|
/**
|
|
238
233
|
* Add `A` and `B`.
|
|
@@ -245,14 +240,14 @@ export namespace DigitsStruct {
|
|
|
245
240
|
infer BB extends DigitsStruct
|
|
246
241
|
]
|
|
247
242
|
? [BA[SIGN], BB[SIGN]] extends ['+', '+']
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
243
|
+
? Normalize<['+', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
244
|
+
: [BA[SIGN], BB[SIGN]] extends ['+', '-']
|
|
245
|
+
? Normalize<['+', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
246
|
+
: [BA[SIGN], BB[SIGN]] extends ['-', '+']
|
|
247
|
+
? Normalize<['+', DigitArray.Subtract<BB[DIGITS], BA[DIGITS]>, BB[EXPONENT]]>
|
|
248
|
+
: [BA[SIGN], BB[SIGN]] extends ['-', '-']
|
|
249
|
+
? Normalize<['-', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
250
|
+
: never
|
|
256
251
|
: never
|
|
257
252
|
|
|
258
253
|
export type Subtract<A extends DigitsStruct, B extends DigitsStruct> = Balance<A, B> extends [
|
|
@@ -260,14 +255,14 @@ export namespace DigitsStruct {
|
|
|
260
255
|
infer BB extends DigitsStruct
|
|
261
256
|
]
|
|
262
257
|
? [BA[SIGN], BB[SIGN]] extends ['+', '+']
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
258
|
+
? Normalize<['+', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
259
|
+
: [BA[SIGN], BB[SIGN]] extends ['+', '-']
|
|
260
|
+
? Normalize<['+', DigitArray.Add<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
261
|
+
: [BA[SIGN], BB[SIGN]] extends ['-', '+']
|
|
262
|
+
? Normalize<['-', DigitArray.Add<BB[DIGITS], BA[DIGITS]>, BA[EXPONENT]]>
|
|
263
|
+
: [BA[SIGN], BB[SIGN]] extends ['-', '-']
|
|
264
|
+
? Normalize<['-', DigitArray.Subtract<BA[DIGITS], BB[DIGITS]>, BA[EXPONENT]]>
|
|
265
|
+
: never
|
|
271
266
|
: never
|
|
272
267
|
|
|
273
268
|
export type Multiply<A extends DigitsStruct, B extends DigitsStruct> = NumericAdd<
|
|
@@ -275,14 +270,14 @@ export namespace DigitsStruct {
|
|
|
275
270
|
B[EXPONENT]
|
|
276
271
|
> extends infer Exp extends number
|
|
277
272
|
? [A[SIGN], B[SIGN]] extends ['+', '+']
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
273
|
+
? Normalize<['+', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
|
|
274
|
+
: [A[SIGN], B[SIGN]] extends ['+', '-']
|
|
275
|
+
? Normalize<['-', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
|
|
276
|
+
: [A[SIGN], B[SIGN]] extends ['-', '+']
|
|
277
|
+
? Normalize<['-', DigitArray.Multiply<B[DIGITS], A[DIGITS]>, Exp]>
|
|
278
|
+
: [A[SIGN], B[SIGN]] extends ['-', '-']
|
|
279
|
+
? Normalize<['+', DigitArray.Multiply<A[DIGITS], B[DIGITS]>, Exp]>
|
|
280
|
+
: never
|
|
286
281
|
: never
|
|
287
282
|
|
|
288
283
|
/**
|
|
@@ -293,8 +288,8 @@ export namespace DigitsStruct {
|
|
|
293
288
|
B[EXPONENT]
|
|
294
289
|
> extends [infer Pads extends number[], infer Longer]
|
|
295
290
|
? Longer extends 'A'
|
|
296
|
-
|
|
297
|
-
|
|
291
|
+
? [A, [B[SIGN], DigitArray.TrimLeadingZeros<[...B[DIGITS], ...Pads]>, A[EXPONENT]]]
|
|
292
|
+
: [[A[SIGN], DigitArray.TrimLeadingZeros<[...A[DIGITS], ...Pads]>, B[EXPONENT]], B]
|
|
298
293
|
: never
|
|
299
294
|
|
|
300
295
|
type GetBalancePadding<
|
|
@@ -305,76 +300,76 @@ export namespace DigitsStruct {
|
|
|
305
300
|
> = A extends B
|
|
306
301
|
? [[], 'A']
|
|
307
302
|
: R extends []
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
303
|
+
? // have not reach min yet
|
|
304
|
+
C['length'] extends A
|
|
305
|
+
? GetBalancePadding<A, B, [0, ...C], [0]>
|
|
306
|
+
: C['length'] extends B
|
|
307
|
+
? GetBalancePadding<A, B, [0, ...C], [0, ...R]>
|
|
308
|
+
: GetBalancePadding<A, B, [0, ...C], []>
|
|
309
|
+
: C['length'] extends A
|
|
310
|
+
? [R, 'A']
|
|
311
|
+
: C['length'] extends B
|
|
312
|
+
? [R, 'B']
|
|
313
|
+
: GetBalancePadding<A, B, [0, ...C], [0, ...R]>
|
|
319
314
|
|
|
320
315
|
/**
|
|
321
316
|
* This is used to align the `NumberStruct` during `Add/Subtract`.
|
|
322
317
|
*/
|
|
323
|
-
export type GetMinPadEnd<
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
318
|
+
export type GetMinPadEnd<A extends number, B extends number, R extends number[] = []> = R['length'] extends A
|
|
319
|
+
? [R, 'B']
|
|
320
|
+
: R['length'] extends B
|
|
321
|
+
? [R, 'A']
|
|
322
|
+
: GetMinPadEnd<A, B, [0, ...R]>
|
|
328
323
|
}
|
|
329
324
|
|
|
330
325
|
export namespace DigitArray {
|
|
331
326
|
export type FromString<S extends string> = S extends `1${infer L}`
|
|
332
327
|
? [1, ...FromString<L>]
|
|
333
328
|
: S extends `2${infer L}`
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
329
|
+
? [2, ...FromString<L>]
|
|
330
|
+
: S extends `3${infer L}`
|
|
331
|
+
? [3, ...FromString<L>]
|
|
332
|
+
: S extends `4${infer L}`
|
|
333
|
+
? [4, ...FromString<L>]
|
|
334
|
+
: S extends `5${infer L}`
|
|
335
|
+
? [5, ...FromString<L>]
|
|
336
|
+
: S extends `6${infer L}`
|
|
337
|
+
? [6, ...FromString<L>]
|
|
338
|
+
: S extends `7${infer L}`
|
|
339
|
+
? [7, ...FromString<L>]
|
|
340
|
+
: S extends `8${infer L}`
|
|
341
|
+
? [8, ...FromString<L>]
|
|
342
|
+
: S extends `9${infer L}`
|
|
343
|
+
? [9, ...FromString<L>]
|
|
344
|
+
: S extends `0${infer L}`
|
|
345
|
+
? [0, ...FromString<L>]
|
|
346
|
+
: S extends `-1${infer L}`
|
|
347
|
+
? [-1, ...FromString<L>]
|
|
348
|
+
: S extends `-2${infer L}`
|
|
349
|
+
? [-2, ...FromString<L>]
|
|
350
|
+
: S extends `-3${infer L}`
|
|
351
|
+
? [-3, ...FromString<L>]
|
|
352
|
+
: S extends `-4${infer L}`
|
|
353
|
+
? [-4, ...FromString<L>]
|
|
354
|
+
: S extends `-5${infer L}`
|
|
355
|
+
? [-5, ...FromString<L>]
|
|
356
|
+
: S extends `-6${infer L}`
|
|
357
|
+
? [-6, ...FromString<L>]
|
|
358
|
+
: S extends `-7${infer L}`
|
|
359
|
+
? [-7, ...FromString<L>]
|
|
360
|
+
: S extends `-8${infer L}`
|
|
361
|
+
? [-8, ...FromString<L>]
|
|
362
|
+
: S extends `-9${infer L}`
|
|
363
|
+
? [-9, ...FromString<L>]
|
|
364
|
+
: S extends `-0${infer L}`
|
|
365
|
+
? [-0, ...FromString<L>]
|
|
366
|
+
: []
|
|
372
367
|
|
|
373
368
|
export type ToString<A extends Array<number | string>> = number extends A['length']
|
|
374
369
|
? ''
|
|
375
370
|
: A['length'] extends 0
|
|
376
|
-
|
|
377
|
-
|
|
371
|
+
? ''
|
|
372
|
+
: `${A[0]}${ToString<Tail<A>>}`
|
|
378
373
|
|
|
379
374
|
/**
|
|
380
375
|
* [0, 0, -1] => [-1]
|
|
@@ -385,70 +380,69 @@ export namespace DigitArray {
|
|
|
385
380
|
export type TrimLeadingZeros<T extends number[]> = T extends [0]
|
|
386
381
|
? T
|
|
387
382
|
: T extends [0, ...infer Tail extends number[]]
|
|
388
|
-
|
|
389
|
-
|
|
383
|
+
? TrimLeadingZeros<Tail>
|
|
384
|
+
: T
|
|
390
385
|
export type TrimTrailingZeros<T extends number[]> = T extends [0]
|
|
391
386
|
? T
|
|
392
387
|
: T extends [...infer Tail extends number[], 0]
|
|
393
|
-
|
|
394
|
-
|
|
388
|
+
? TrimTrailingZeros<Tail>
|
|
389
|
+
: T
|
|
395
390
|
|
|
396
391
|
export type Add<A extends number[], B extends number[], R extends number[] = []> = A extends []
|
|
397
392
|
? B extends []
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
393
|
+
? R
|
|
394
|
+
: B extends [...infer BH extends number[], infer BL extends number]
|
|
395
|
+
? Add<[], BH, [BL, ...R]>
|
|
396
|
+
: never
|
|
402
397
|
: B extends []
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
398
|
+
? A extends [...infer AH extends number[], infer AL extends number]
|
|
399
|
+
? Add<AH, [], [AL, ...R]>
|
|
400
|
+
: never
|
|
401
|
+
: [A, B] extends [
|
|
402
|
+
[...infer AH extends number[], infer AL extends number],
|
|
403
|
+
[...infer BH extends number[], infer BL extends number]
|
|
404
|
+
]
|
|
405
|
+
? Add<AH, BH, [Digit.Add<AL, BL>, ...R]>
|
|
406
|
+
: never
|
|
412
407
|
|
|
413
408
|
export type Subtract<A extends number[], B extends number[], R extends number[] = []> = A extends []
|
|
414
409
|
? B extends []
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
410
|
+
? TrimLeadingZeros<R>
|
|
411
|
+
: B extends [...infer BH extends number[], infer BL extends number]
|
|
412
|
+
? Subtract<[], BH, [ToNegative<BL>, ...R]>
|
|
413
|
+
: never
|
|
419
414
|
: B extends []
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
415
|
+
? A extends [...infer AH extends number[], infer AL extends number]
|
|
416
|
+
? Subtract<AH, [], [AL, ...R]>
|
|
417
|
+
: never
|
|
418
|
+
: [A, B] extends [
|
|
419
|
+
[...infer AH extends number[], infer AL extends number],
|
|
420
|
+
[...infer BH extends number[], infer BL extends number]
|
|
421
|
+
]
|
|
422
|
+
? Subtract<AH, BH, [Digit.Subtract<AL, BL>, ...R]>
|
|
423
|
+
: never
|
|
429
424
|
|
|
430
425
|
export type Multiply<A extends number[], B extends number[], R extends number[][] = []> = B extends []
|
|
431
426
|
? RecursiveAdd<R>
|
|
432
427
|
: B extends [infer Head extends number, ...infer Tail extends number[]]
|
|
433
|
-
|
|
434
|
-
|
|
428
|
+
? Multiply<A, Tail, [...R, CarryDigits<MultiplyArray<A, Head, Zeros<Tail['length']>>>]>
|
|
429
|
+
: never
|
|
435
430
|
|
|
436
|
-
type Zeros<N extends number, R extends number[] = []> = N extends unknown
|
|
431
|
+
type Zeros<N extends number, R extends number[] = []> = N extends unknown
|
|
432
|
+
? R['length'] extends N
|
|
433
|
+
? R
|
|
434
|
+
: Zeros<N, [0, ...R]>
|
|
435
|
+
: never
|
|
437
436
|
|
|
438
|
-
type MultiplyArray<
|
|
439
|
-
A extends number[],
|
|
440
|
-
B extends number,
|
|
441
|
-
Pad extends number[],
|
|
442
|
-
R extends number[] = []
|
|
443
|
-
> = B extends 0
|
|
437
|
+
type MultiplyArray<A extends number[], B extends number, Pad extends number[], R extends number[] = []> = B extends 0
|
|
444
438
|
? [0]
|
|
445
439
|
: B extends 1
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
440
|
+
? [...A, ...Pad]
|
|
441
|
+
: A extends []
|
|
442
|
+
? [...R, ...Pad]
|
|
443
|
+
: A extends [infer H extends number, ...infer T extends number[]]
|
|
444
|
+
? MultiplyArray<T, B, Pad, [...R, Digit.Multiply<H, B>]>
|
|
445
|
+
: never
|
|
452
446
|
|
|
453
447
|
/**
|
|
454
448
|
* Recursively add digit arrays.
|
|
@@ -458,40 +452,40 @@ export namespace DigitArray {
|
|
|
458
452
|
type RecursiveAdd<E extends number[][], R extends number[] = []> = E extends []
|
|
459
453
|
? R
|
|
460
454
|
: E extends [infer H extends number[], ...infer T extends number[][]]
|
|
461
|
-
|
|
462
|
-
|
|
455
|
+
? RecursiveAdd<T, CarryDigits<Add<R, H>>>
|
|
456
|
+
: never
|
|
463
457
|
|
|
464
458
|
export type CarryDigits<N extends number[], R extends number[] = []> = N extends []
|
|
465
459
|
? TrimLeadingZeros<R>
|
|
466
460
|
: N extends [infer Tail extends number]
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
461
|
+
? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
|
|
462
|
+
? CarryDigits<[], [T1, T2, ...R]>
|
|
463
|
+
: `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
|
|
464
|
+
? `-${T1}` extends `${infer NT extends number}`
|
|
465
|
+
? CarryDigits<[], [NT, T2, ...R]>
|
|
466
|
+
: never
|
|
467
|
+
: CarryDigits<[], [Tail, ...R]>
|
|
468
|
+
: N extends [infer Head extends number, infer Tail extends number]
|
|
469
|
+
? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
|
|
470
|
+
? CarryDigits<[Digit.Add<Head, T1>], [T2, ...R]>
|
|
471
|
+
: `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
|
|
472
|
+
? `-${T1}` extends `${infer NT extends number}`
|
|
473
|
+
? CarryDigits<[Digit.Add<Head, NT>], [T2, ...R]>
|
|
474
|
+
: never
|
|
475
|
+
: `${Tail}` extends `-${number}`
|
|
476
|
+
? CarryDigits<[Digit.Add<Head, -1>], [Digit.Plus10[Tail], ...R]>
|
|
477
|
+
: CarryDigits<[Head], [Tail, ...R]>
|
|
478
|
+
: N extends [...infer Heads extends number[], infer Head extends number, infer Tail extends number]
|
|
479
|
+
? `${Tail}` extends `${infer T1 extends number}${infer T2 extends number}`
|
|
480
|
+
? CarryDigits<[...Heads, Digit.Add<Head, T1>], [T2, ...R]>
|
|
481
|
+
: `${Tail}` extends `-${infer T1 extends number}${infer T2 extends number}`
|
|
482
|
+
? `-${T1}` extends `${infer NT extends number}`
|
|
483
|
+
? CarryDigits<[...Heads, Digit.Add<Head, NT>], [T2, ...R]>
|
|
484
|
+
: never
|
|
485
|
+
: `${Tail}` extends `-${number}`
|
|
486
|
+
? CarryDigits<[...Heads, Digit.Add<Head, -1>], [Digit.Plus10[Tail], ...R]>
|
|
487
|
+
: CarryDigits<[...Heads, Head], [Tail, ...R]>
|
|
488
|
+
: never
|
|
495
489
|
}
|
|
496
490
|
|
|
497
491
|
export namespace Digit {
|
|
@@ -503,19 +497,19 @@ export namespace Digit {
|
|
|
503
497
|
*/
|
|
504
498
|
export type Add<A extends number, B extends number> = `${A}` extends `-${infer AD extends number}`
|
|
505
499
|
? `${B}` extends `-${infer BD extends number}`
|
|
506
|
-
|
|
507
|
-
|
|
500
|
+
? ToNegative<PositiveEntryAdd<AD, BD>>
|
|
501
|
+
: Subtract<B, AD>
|
|
508
502
|
: `${B}` extends `-${infer BD extends number}`
|
|
509
|
-
|
|
510
|
-
|
|
503
|
+
? Subtract<A, BD>
|
|
504
|
+
: PositiveEntryAdd<A, B>
|
|
511
505
|
|
|
512
506
|
export type FlipSign<T extends number> = T extends 0
|
|
513
507
|
? 0
|
|
514
508
|
: `${T}` extends `-${infer R extends number}`
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
509
|
+
? R
|
|
510
|
+
: `-${T}` extends `${infer R extends number}`
|
|
511
|
+
? R
|
|
512
|
+
: never
|
|
519
513
|
|
|
520
514
|
type PositiveEntryAdd<A extends number, B extends number> = [
|
|
521
515
|
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
|
|
@@ -612,10 +606,10 @@ export namespace Digit {
|
|
|
612
606
|
]
|
|
613
607
|
? Subtract<A2, B2>
|
|
614
608
|
: `${A}` extends `${number}${infer A2 extends number}`
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
609
|
+
? Subtract<A2, B>
|
|
610
|
+
: `${B}` extends `${number}${infer B2 extends number}`
|
|
611
|
+
? Subtract<A, B2>
|
|
612
|
+
: SingleDigitSubtract<A, B>
|
|
619
613
|
|
|
620
614
|
export type SingleDigitSubtract<A extends number, B extends number> = [
|
|
621
615
|
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9],
|
|
@@ -631,14 +625,14 @@ export namespace Digit {
|
|
|
631
625
|
][A][B]
|
|
632
626
|
|
|
633
627
|
export type Plus10 = { [k in number]: number } & {
|
|
634
|
-
'-1': 9
|
|
635
|
-
'-2': 8
|
|
636
|
-
'-3': 7
|
|
637
|
-
'-4': 6
|
|
638
|
-
'-5': 5
|
|
639
|
-
'-6': 4
|
|
640
|
-
'-7': 3
|
|
641
|
-
'-8': 2
|
|
628
|
+
'-1': 9
|
|
629
|
+
'-2': 8
|
|
630
|
+
'-3': 7
|
|
631
|
+
'-4': 6
|
|
632
|
+
'-5': 5
|
|
633
|
+
'-6': 4
|
|
634
|
+
'-7': 3
|
|
635
|
+
'-8': 2
|
|
642
636
|
'-9': 1
|
|
643
637
|
}
|
|
644
638
|
export type Multiply<A extends number, B extends number> = [
|