uom-types 1.0.3 → 3.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 CHANGED
@@ -6,7 +6,8 @@ Typesafe units with no runtime overhead.
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/uom-types.svg)](https://www.npmjs.com/package/uom-types)
8
8
  [![CI](https://github.com/RebeccaStevens/uom-types/actions/workflows/release.yml/badge.svg)](https://github.com/RebeccaStevens/uom-types/actions/workflows/release.yml)
9
- [![Coverage Status](https://codecov.io/gh/RebeccaStevens/uom-types/branch/main/graph/badge.svg?token=MVpR1oAbIT)](https://codecov.io/gh/RebeccaStevens/uom-types)\
9
+ [![Coverage Status](https://codecov.io/gh/RebeccaStevens/uom-types/branch/main/graph/badge.svg?token=MVpR1oAbIT)](https://codecov.io/gh/RebeccaStevens/uom-types)
10
+ [![Documentation](./docs/coverage.svg)](https://RebeccaStevens.github.io/uom-types/stable/)\
10
11
  [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
11
12
  [![GitHub Discussions](https://img.shields.io/github/discussions/RebeccaStevens/uom-types?style=flat-square)](https://github.com/RebeccaStevens/uom-types/discussions)
12
13
  [![BSD 3 Clause license](https://img.shields.io/github/license/RebeccaStevens/uom-types.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause)
@@ -19,6 +20,13 @@ Typesafe units with no runtime overhead.
19
20
 
20
21
  [Any donations would be much appreciated](./DONATIONS.md). 😄
21
22
 
23
+ ### Enterprise Users
24
+
25
+ `uom-types` is available as part of the Tidelift Subscription.
26
+
27
+ Tidelift is working with the maintainers of `uom-types` and a growing network of open source maintainers to ensure your open source software supply chain meets enterprise standards now and into the future.
28
+ [Learn more.](https://tidelift.com/subscription/pkg/npm-uom-types?utm_source=npm-uom-types&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
29
+
22
30
  ## Installation
23
31
 
24
32
  ```sh
@@ -32,6 +40,30 @@ pnpm add -D uom-types
32
40
  yarn add -D uom-types
33
41
  ```
34
42
 
43
+ ### Library Make Up
44
+
45
+ This library is split into several submodules.
46
+
47
+ - `uom-types`\
48
+ Defines the core types of this library. You'll only need to use if if you are defining your own custom types.
49
+
50
+ - `uom-types/functions`\
51
+ Defines runtime mathematical functions that are type-aware of this library's type.
52
+
53
+ - `uom-types/functions/higher-order`\
54
+ Defines runtime higher order mathematical functions that are type-aware of this library's type.
55
+
56
+ - `uom-types/units`\
57
+ Defines common types.\
58
+ Note: does not currently define any imperial types.
59
+
60
+ - `uom-types/units/converters`\
61
+ Defines runtime functions for converting between different units of the same `UnitClass`.
62
+
63
+ ## Documentation
64
+
65
+ Check out [RebeccaStevens.github.io/uom-types](https://RebeccaStevens.github.io/uom-types/stable/) for the documentation.
66
+
35
67
  ## Inspiration
36
68
 
37
69
  Inspired by [uom-ts](https://github.com/mindbrave/uom-ts).
@@ -0,0 +1,89 @@
1
+ import { E as Exactify, i as UnitClass, j as Exponent, d as AbstractUnitFrom, e as UnitSubvalues, f as UnitMeta, g as UnknownUnitMeta, h as UnitFrom } from './_index.cjs';
2
+
3
+ type SiUnitKeys = "Second" | "Metre" | "Kilogram" | "Mole" | "Ampere" | "Candela" | "Kelvin" | "Radian";
4
+ /**
5
+ * The {@link UnitClass} that is the base of all {@link Unit}s defined by this library.
6
+ *
7
+ * @group Unit Classes
8
+ */
9
+ type BaseUnitClass<T extends Exactify<SiUnitConfig, T>> = UnitClass<T>;
10
+ type SiUnitConfig = {
11
+ [K in SiUnitKeys]?: Exponent;
12
+ };
13
+
14
+ /**
15
+ * @group Unit Classes
16
+ * @category Angle (Plane)
17
+ */
18
+ type PlaneAngleUnitClass = BaseUnitClass<{
19
+ Radian: 1;
20
+ }>;
21
+ /**
22
+ * @group Abstract Units
23
+ * @category Angle (Plane)
24
+ */
25
+ type PlaneAngle = AbstractUnitFrom<PlaneAngleUnitClass>;
26
+ /**
27
+ * @group Unit Generators
28
+ * @category Angle (Plane)
29
+ */
30
+ type PlaneAngleUnit<M extends UnitSubvalues> = PlaneAngleUnitFrom<UnitMeta<M>>;
31
+ /**
32
+ * @group Unit Generators
33
+ * @category Angle (Plane)
34
+ */
35
+ type PlaneAngleUnitFrom<M extends UnknownUnitMeta> = UnitFrom<PlaneAngleUnitClass, M>;
36
+ /**
37
+ * A unit of {@link PlaneAngle}.
38
+ *
39
+ * One radian is equal to the angle subtended at the centre of a circle by an
40
+ * arc equal in length to the radius.
41
+ * The total plane angle about a point is 2π radian.
42
+ *
43
+ * @group Units
44
+ * @category Base
45
+ * @category Angle (Plane)
46
+ * @symbol `rad`
47
+ */
48
+ type Radian = PlaneAngleUnit<{}>;
49
+ /**
50
+ * A unit of {@link PlaneAngle}.
51
+ *
52
+ * The total plane angle of a circle is 360 degrees.
53
+ *
54
+ * @group Units
55
+ * @category Angle (Plane)
56
+ * @symbol `°`
57
+ */
58
+ type Degree = PlaneAngleUnit<{
59
+ scalar360: 1;
60
+ scalar2π: -1;
61
+ }>;
62
+ /**
63
+ * A unit of {@link PlaneAngle}.
64
+ *
65
+ * One gradian is equal to 100th of a right angle.
66
+ * The total plane angle about a point is 400 gradian.
67
+ *
68
+ * @group Units
69
+ * @category Angle (Plane)
70
+ * @symbol `gon`
71
+ */
72
+ type Gradian = PlaneAngleUnit<{
73
+ scalar400: 1;
74
+ scalar2π: -1;
75
+ }>;
76
+ /**
77
+ * A unit of {@link PlaneAngle}.
78
+ *
79
+ * One turn is equal to 1 full rotation about a point.
80
+ *
81
+ * @group Units
82
+ * @category Angle (Plane)
83
+ * @symbol `tr`
84
+ */
85
+ type Turn = PlaneAngleUnit<{
86
+ scalar2π: -1;
87
+ }>;
88
+
89
+ export { BaseUnitClass as B, Degree as D, Gradian as G, PlaneAngleUnitClass as P, Radian as R, Turn as T, PlaneAngle as a, PlaneAngleUnit as b, PlaneAngleUnitFrom as c };
@@ -0,0 +1,89 @@
1
+ import { E as Exactify, i as UnitClass, j as Exponent, d as AbstractUnitFrom, e as UnitSubvalues, f as UnitMeta, g as UnknownUnitMeta, h as UnitFrom } from './_index.mjs';
2
+
3
+ type SiUnitKeys = "Second" | "Metre" | "Kilogram" | "Mole" | "Ampere" | "Candela" | "Kelvin" | "Radian";
4
+ /**
5
+ * The {@link UnitClass} that is the base of all {@link Unit}s defined by this library.
6
+ *
7
+ * @group Unit Classes
8
+ */
9
+ type BaseUnitClass<T extends Exactify<SiUnitConfig, T>> = UnitClass<T>;
10
+ type SiUnitConfig = {
11
+ [K in SiUnitKeys]?: Exponent;
12
+ };
13
+
14
+ /**
15
+ * @group Unit Classes
16
+ * @category Angle (Plane)
17
+ */
18
+ type PlaneAngleUnitClass = BaseUnitClass<{
19
+ Radian: 1;
20
+ }>;
21
+ /**
22
+ * @group Abstract Units
23
+ * @category Angle (Plane)
24
+ */
25
+ type PlaneAngle = AbstractUnitFrom<PlaneAngleUnitClass>;
26
+ /**
27
+ * @group Unit Generators
28
+ * @category Angle (Plane)
29
+ */
30
+ type PlaneAngleUnit<M extends UnitSubvalues> = PlaneAngleUnitFrom<UnitMeta<M>>;
31
+ /**
32
+ * @group Unit Generators
33
+ * @category Angle (Plane)
34
+ */
35
+ type PlaneAngleUnitFrom<M extends UnknownUnitMeta> = UnitFrom<PlaneAngleUnitClass, M>;
36
+ /**
37
+ * A unit of {@link PlaneAngle}.
38
+ *
39
+ * One radian is equal to the angle subtended at the centre of a circle by an
40
+ * arc equal in length to the radius.
41
+ * The total plane angle about a point is 2π radian.
42
+ *
43
+ * @group Units
44
+ * @category Base
45
+ * @category Angle (Plane)
46
+ * @symbol `rad`
47
+ */
48
+ type Radian = PlaneAngleUnit<{}>;
49
+ /**
50
+ * A unit of {@link PlaneAngle}.
51
+ *
52
+ * The total plane angle of a circle is 360 degrees.
53
+ *
54
+ * @group Units
55
+ * @category Angle (Plane)
56
+ * @symbol `°`
57
+ */
58
+ type Degree = PlaneAngleUnit<{
59
+ scalar360: 1;
60
+ scalar2π: -1;
61
+ }>;
62
+ /**
63
+ * A unit of {@link PlaneAngle}.
64
+ *
65
+ * One gradian is equal to 100th of a right angle.
66
+ * The total plane angle about a point is 400 gradian.
67
+ *
68
+ * @group Units
69
+ * @category Angle (Plane)
70
+ * @symbol `gon`
71
+ */
72
+ type Gradian = PlaneAngleUnit<{
73
+ scalar400: 1;
74
+ scalar2π: -1;
75
+ }>;
76
+ /**
77
+ * A unit of {@link PlaneAngle}.
78
+ *
79
+ * One turn is equal to 1 full rotation about a point.
80
+ *
81
+ * @group Units
82
+ * @category Angle (Plane)
83
+ * @symbol `tr`
84
+ */
85
+ type Turn = PlaneAngleUnit<{
86
+ scalar2π: -1;
87
+ }>;
88
+
89
+ export { BaseUnitClass as B, Degree as D, Gradian as G, PlaneAngleUnitClass as P, Radian as R, Turn as T, PlaneAngle as a, PlaneAngleUnit as b, PlaneAngleUnitFrom as c };
@@ -0,0 +1,29 @@
1
+ import { d as AbstractUnitFrom, e as UnitSubvalues, f as UnitMeta, g as UnknownUnitMeta, h as UnitFrom } from './_index.cjs';
2
+ import { B as BaseUnitClass } from './_angle-plane.cjs';
3
+
4
+ /**
5
+ * @group Unit Classes
6
+ */
7
+ type IdentityUnitClass = BaseUnitClass<{}>;
8
+ /**
9
+ * @group Abstract Units
10
+ */
11
+ type Identity = AbstractUnitFrom<IdentityUnitClass>;
12
+ /**
13
+ * @group Unit Generators
14
+ */
15
+ type IdentityUnit<M extends UnitSubvalues> = IdentityUnitFrom<UnitMeta<M>>;
16
+ /**
17
+ * @group Unit Generators
18
+ */
19
+ type IdentityUnitFrom<M extends UnknownUnitMeta> = UnitFrom<IdentityUnitClass, M>;
20
+ /**
21
+ * A {@link Unit} with no units.
22
+ *
23
+ * @group Units
24
+ * @category Base
25
+ * @symbol ``
26
+ */
27
+ type Unitless = IdentityUnit<{}>;
28
+
29
+ export { IdentityUnitClass as I, Unitless as U, Identity as a, IdentityUnit as b, IdentityUnitFrom as c };
@@ -0,0 +1,29 @@
1
+ import { d as AbstractUnitFrom, e as UnitSubvalues, f as UnitMeta, g as UnknownUnitMeta, h as UnitFrom } from './_index.mjs';
2
+ import { B as BaseUnitClass } from './_angle-plane.mjs';
3
+
4
+ /**
5
+ * @group Unit Classes
6
+ */
7
+ type IdentityUnitClass = BaseUnitClass<{}>;
8
+ /**
9
+ * @group Abstract Units
10
+ */
11
+ type Identity = AbstractUnitFrom<IdentityUnitClass>;
12
+ /**
13
+ * @group Unit Generators
14
+ */
15
+ type IdentityUnit<M extends UnitSubvalues> = IdentityUnitFrom<UnitMeta<M>>;
16
+ /**
17
+ * @group Unit Generators
18
+ */
19
+ type IdentityUnitFrom<M extends UnknownUnitMeta> = UnitFrom<IdentityUnitClass, M>;
20
+ /**
21
+ * A {@link Unit} with no units.
22
+ *
23
+ * @group Units
24
+ * @category Base
25
+ * @symbol ``
26
+ */
27
+ type Unitless = IdentityUnit<{}>;
28
+
29
+ export { IdentityUnitClass as I, Unitless as U, Identity as a, IdentityUnit as b, IdentityUnitFrom as c };
@@ -0,0 +1,235 @@
1
+ /**
2
+ * @file Autogenerated File - Don't manually edit.
3
+ */
4
+ /**
5
+ * All the supported exponent values.
6
+ *
7
+ * @group Unit Components
8
+ */
9
+ type Exponent = 0 | 1 | -1 | 2 | -2 | 3 | -3 | 4 | -4 | 5 | -5 | 6 | -6 | 7 | -7 | 8 | -8 | 9 | -9 | 10 | -10 | 11 | -11 | 12 | -12;
10
+ /**
11
+ * @group Exponent Functions
12
+ */
13
+ type NegativeExponent<T extends Exponent> = T extends 0 ? 0 : T extends 1 ? -1 : T extends -1 ? 1 : T extends 2 ? -2 : T extends -2 ? 2 : T extends 3 ? -3 : T extends -3 ? 3 : T extends 4 ? -4 : T extends -4 ? 4 : T extends 5 ? -5 : T extends -5 ? 5 : T extends 6 ? -6 : T extends -6 ? 6 : T extends 7 ? -7 : T extends -7 ? 7 : T extends 8 ? -8 : T extends -8 ? 8 : T extends 9 ? -9 : T extends -9 ? 9 : T extends 10 ? -10 : T extends -10 ? 10 : T extends 11 ? -11 : T extends -11 ? 11 : T extends 12 ? -12 : T extends -12 ? 12 : never;
14
+ /**
15
+ * @group Exponent Functions
16
+ */
17
+ type SumExponents<A extends Exponent, B extends Exponent> = A extends 0 ? B extends 0 ? 0 : B extends 1 ? 1 : B extends -1 ? -1 : B extends 2 ? 2 : B extends -2 ? -2 : B extends 3 ? 3 : B extends -3 ? -3 : B extends 4 ? 4 : B extends -4 ? -4 : B extends 5 ? 5 : B extends -5 ? -5 : B extends 6 ? 6 : B extends -6 ? -6 : B extends 7 ? 7 : B extends -7 ? -7 : B extends 8 ? 8 : B extends -8 ? -8 : B extends 9 ? 9 : B extends -9 ? -9 : B extends 10 ? 10 : B extends -10 ? -10 : B extends 11 ? 11 : B extends -11 ? -11 : B extends 12 ? 12 : B extends -12 ? -12 : never : A extends 1 ? B extends 0 ? 1 : B extends 1 ? 2 : B extends -1 ? 0 : B extends 2 ? 3 : B extends -2 ? -1 : B extends 3 ? 4 : B extends -3 ? -2 : B extends 4 ? 5 : B extends -4 ? -3 : B extends 5 ? 6 : B extends -5 ? -4 : B extends 6 ? 7 : B extends -6 ? -5 : B extends 7 ? 8 : B extends -7 ? -6 : B extends 8 ? 9 : B extends -8 ? -7 : B extends 9 ? 10 : B extends -9 ? -8 : B extends 10 ? 11 : B extends -10 ? -9 : B extends 11 ? 12 : B extends -11 ? -10 : B extends -12 ? -11 : never : A extends -1 ? B extends 0 ? -1 : B extends 1 ? 0 : B extends -1 ? -2 : B extends 2 ? 1 : B extends -2 ? -3 : B extends 3 ? 2 : B extends -3 ? -4 : B extends 4 ? 3 : B extends -4 ? -5 : B extends 5 ? 4 : B extends -5 ? -6 : B extends 6 ? 5 : B extends -6 ? -7 : B extends 7 ? 6 : B extends -7 ? -8 : B extends 8 ? 7 : B extends -8 ? -9 : B extends 9 ? 8 : B extends -9 ? -10 : B extends 10 ? 9 : B extends -10 ? -11 : B extends 11 ? 10 : B extends -11 ? -12 : B extends 12 ? 11 : never : A extends 2 ? B extends 0 ? 2 : B extends 1 ? 3 : B extends -1 ? 1 : B extends 2 ? 4 : B extends -2 ? 0 : B extends 3 ? 5 : B extends -3 ? -1 : B extends 4 ? 6 : B extends -4 ? -2 : B extends 5 ? 7 : B extends -5 ? -3 : B extends 6 ? 8 : B extends -6 ? -4 : B extends 7 ? 9 : B extends -7 ? -5 : B extends 8 ? 10 : B extends -8 ? -6 : B extends 9 ? 11 : B extends -9 ? -7 : B extends 10 ? 12 : B extends -10 ? -8 : B extends -11 ? -9 : B extends -12 ? -10 : never : A extends -2 ? B extends 0 ? -2 : B extends 1 ? -1 : B extends -1 ? -3 : B extends 2 ? 0 : B extends -2 ? -4 : B extends 3 ? 1 : B extends -3 ? -5 : B extends 4 ? 2 : B extends -4 ? -6 : B extends 5 ? 3 : B extends -5 ? -7 : B extends 6 ? 4 : B extends -6 ? -8 : B extends 7 ? 5 : B extends -7 ? -9 : B extends 8 ? 6 : B extends -8 ? -10 : B extends 9 ? 7 : B extends -9 ? -11 : B extends 10 ? 8 : B extends -10 ? -12 : B extends 11 ? 9 : B extends 12 ? 10 : never : A extends 3 ? B extends 0 ? 3 : B extends 1 ? 4 : B extends -1 ? 2 : B extends 2 ? 5 : B extends -2 ? 1 : B extends 3 ? 6 : B extends -3 ? 0 : B extends 4 ? 7 : B extends -4 ? -1 : B extends 5 ? 8 : B extends -5 ? -2 : B extends 6 ? 9 : B extends -6 ? -3 : B extends 7 ? 10 : B extends -7 ? -4 : B extends 8 ? 11 : B extends -8 ? -5 : B extends 9 ? 12 : B extends -9 ? -6 : B extends -10 ? -7 : B extends -11 ? -8 : B extends -12 ? -9 : never : A extends -3 ? B extends 0 ? -3 : B extends 1 ? -2 : B extends -1 ? -4 : B extends 2 ? -1 : B extends -2 ? -5 : B extends 3 ? 0 : B extends -3 ? -6 : B extends 4 ? 1 : B extends -4 ? -7 : B extends 5 ? 2 : B extends -5 ? -8 : B extends 6 ? 3 : B extends -6 ? -9 : B extends 7 ? 4 : B extends -7 ? -10 : B extends 8 ? 5 : B extends -8 ? -11 : B extends 9 ? 6 : B extends -9 ? -12 : B extends 10 ? 7 : B extends 11 ? 8 : B extends 12 ? 9 : never : A extends 4 ? B extends 0 ? 4 : B extends 1 ? 5 : B extends -1 ? 3 : B extends 2 ? 6 : B extends -2 ? 2 : B extends 3 ? 7 : B extends -3 ? 1 : B extends 4 ? 8 : B extends -4 ? 0 : B extends 5 ? 9 : B extends -5 ? -1 : B extends 6 ? 10 : B extends -6 ? -2 : B extends 7 ? 11 : B extends -7 ? -3 : B extends 8 ? 12 : B extends -8 ? -4 : B extends -9 ? -5 : B extends -10 ? -6 : B extends -11 ? -7 : B extends -12 ? -8 : never : A extends -4 ? B extends 0 ? -4 : B extends 1 ? -3 : B extends -1 ? -5 : B extends 2 ? -2 : B extends -2 ? -6 : B extends 3 ? -1 : B extends -3 ? -7 : B extends 4 ? 0 : B extends -4 ? -8 : B extends 5 ? 1 : B extends -5 ? -9 : B extends 6 ? 2 : B extends -6 ? -10 : B extends 7 ? 3 : B extends -7 ? -11 : B extends 8 ? 4 : B extends -8 ? -12 : B extends 9 ? 5 : B extends 10 ? 6 : B extends 11 ? 7 : B extends 12 ? 8 : never : A extends 5 ? B extends 0 ? 5 : B extends 1 ? 6 : B extends -1 ? 4 : B extends 2 ? 7 : B extends -2 ? 3 : B extends 3 ? 8 : B extends -3 ? 2 : B extends 4 ? 9 : B extends -4 ? 1 : B extends 5 ? 10 : B extends -5 ? 0 : B extends 6 ? 11 : B extends -6 ? -1 : B extends 7 ? 12 : B extends -7 ? -2 : B extends -8 ? -3 : B extends -9 ? -4 : B extends -10 ? -5 : B extends -11 ? -6 : B extends -12 ? -7 : never : A extends -5 ? B extends 0 ? -5 : B extends 1 ? -4 : B extends -1 ? -6 : B extends 2 ? -3 : B extends -2 ? -7 : B extends 3 ? -2 : B extends -3 ? -8 : B extends 4 ? -1 : B extends -4 ? -9 : B extends 5 ? 0 : B extends -5 ? -10 : B extends 6 ? 1 : B extends -6 ? -11 : B extends 7 ? 2 : B extends -7 ? -12 : B extends 8 ? 3 : B extends 9 ? 4 : B extends 10 ? 5 : B extends 11 ? 6 : B extends 12 ? 7 : never : A extends 6 ? B extends 0 ? 6 : B extends 1 ? 7 : B extends -1 ? 5 : B extends 2 ? 8 : B extends -2 ? 4 : B extends 3 ? 9 : B extends -3 ? 3 : B extends 4 ? 10 : B extends -4 ? 2 : B extends 5 ? 11 : B extends -5 ? 1 : B extends 6 ? 12 : B extends -6 ? 0 : B extends -7 ? -1 : B extends -8 ? -2 : B extends -9 ? -3 : B extends -10 ? -4 : B extends -11 ? -5 : B extends -12 ? -6 : never : A extends -6 ? B extends 0 ? -6 : B extends 1 ? -5 : B extends -1 ? -7 : B extends 2 ? -4 : B extends -2 ? -8 : B extends 3 ? -3 : B extends -3 ? -9 : B extends 4 ? -2 : B extends -4 ? -10 : B extends 5 ? -1 : B extends -5 ? -11 : B extends 6 ? 0 : B extends -6 ? -12 : B extends 7 ? 1 : B extends 8 ? 2 : B extends 9 ? 3 : B extends 10 ? 4 : B extends 11 ? 5 : B extends 12 ? 6 : never : A extends 7 ? B extends 0 ? 7 : B extends 1 ? 8 : B extends -1 ? 6 : B extends 2 ? 9 : B extends -2 ? 5 : B extends 3 ? 10 : B extends -3 ? 4 : B extends 4 ? 11 : B extends -4 ? 3 : B extends 5 ? 12 : B extends -5 ? 2 : B extends -6 ? 1 : B extends -7 ? 0 : B extends -8 ? -1 : B extends -9 ? -2 : B extends -10 ? -3 : B extends -11 ? -4 : B extends -12 ? -5 : never : A extends -7 ? B extends 0 ? -7 : B extends 1 ? -6 : B extends -1 ? -8 : B extends 2 ? -5 : B extends -2 ? -9 : B extends 3 ? -4 : B extends -3 ? -10 : B extends 4 ? -3 : B extends -4 ? -11 : B extends 5 ? -2 : B extends -5 ? -12 : B extends 6 ? -1 : B extends 7 ? 0 : B extends 8 ? 1 : B extends 9 ? 2 : B extends 10 ? 3 : B extends 11 ? 4 : B extends 12 ? 5 : never : A extends 8 ? B extends 0 ? 8 : B extends 1 ? 9 : B extends -1 ? 7 : B extends 2 ? 10 : B extends -2 ? 6 : B extends 3 ? 11 : B extends -3 ? 5 : B extends 4 ? 12 : B extends -4 ? 4 : B extends -5 ? 3 : B extends -6 ? 2 : B extends -7 ? 1 : B extends -8 ? 0 : B extends -9 ? -1 : B extends -10 ? -2 : B extends -11 ? -3 : B extends -12 ? -4 : never : A extends -8 ? B extends 0 ? -8 : B extends 1 ? -7 : B extends -1 ? -9 : B extends 2 ? -6 : B extends -2 ? -10 : B extends 3 ? -5 : B extends -3 ? -11 : B extends 4 ? -4 : B extends -4 ? -12 : B extends 5 ? -3 : B extends 6 ? -2 : B extends 7 ? -1 : B extends 8 ? 0 : B extends 9 ? 1 : B extends 10 ? 2 : B extends 11 ? 3 : B extends 12 ? 4 : never : A extends 9 ? B extends 0 ? 9 : B extends 1 ? 10 : B extends -1 ? 8 : B extends 2 ? 11 : B extends -2 ? 7 : B extends 3 ? 12 : B extends -3 ? 6 : B extends -4 ? 5 : B extends -5 ? 4 : B extends -6 ? 3 : B extends -7 ? 2 : B extends -8 ? 1 : B extends -9 ? 0 : B extends -10 ? -1 : B extends -11 ? -2 : B extends -12 ? -3 : never : A extends -9 ? B extends 0 ? -9 : B extends 1 ? -8 : B extends -1 ? -10 : B extends 2 ? -7 : B extends -2 ? -11 : B extends 3 ? -6 : B extends -3 ? -12 : B extends 4 ? -5 : B extends 5 ? -4 : B extends 6 ? -3 : B extends 7 ? -2 : B extends 8 ? -1 : B extends 9 ? 0 : B extends 10 ? 1 : B extends 11 ? 2 : B extends 12 ? 3 : never : A extends 10 ? B extends 0 ? 10 : B extends 1 ? 11 : B extends -1 ? 9 : B extends 2 ? 12 : B extends -2 ? 8 : B extends -3 ? 7 : B extends -4 ? 6 : B extends -5 ? 5 : B extends -6 ? 4 : B extends -7 ? 3 : B extends -8 ? 2 : B extends -9 ? 1 : B extends -10 ? 0 : B extends -11 ? -1 : B extends -12 ? -2 : never : A extends -10 ? B extends 0 ? -10 : B extends 1 ? -9 : B extends -1 ? -11 : B extends 2 ? -8 : B extends -2 ? -12 : B extends 3 ? -7 : B extends 4 ? -6 : B extends 5 ? -5 : B extends 6 ? -4 : B extends 7 ? -3 : B extends 8 ? -2 : B extends 9 ? -1 : B extends 10 ? 0 : B extends 11 ? 1 : B extends 12 ? 2 : never : A extends 11 ? B extends 0 ? 11 : B extends 1 ? 12 : B extends -1 ? 10 : B extends -2 ? 9 : B extends -3 ? 8 : B extends -4 ? 7 : B extends -5 ? 6 : B extends -6 ? 5 : B extends -7 ? 4 : B extends -8 ? 3 : B extends -9 ? 2 : B extends -10 ? 1 : B extends -11 ? 0 : B extends -12 ? -1 : never : A extends -11 ? B extends 0 ? -11 : B extends 1 ? -10 : B extends -1 ? -12 : B extends 2 ? -9 : B extends 3 ? -8 : B extends 4 ? -7 : B extends 5 ? -6 : B extends 6 ? -5 : B extends 7 ? -4 : B extends 8 ? -3 : B extends 9 ? -2 : B extends 10 ? -1 : B extends 11 ? 0 : B extends 12 ? 1 : never : A extends 12 ? B extends 0 ? 12 : B extends -1 ? 11 : B extends -2 ? 10 : B extends -3 ? 9 : B extends -4 ? 8 : B extends -5 ? 7 : B extends -6 ? 6 : B extends -7 ? 5 : B extends -8 ? 4 : B extends -9 ? 3 : B extends -10 ? 2 : B extends -11 ? 1 : B extends -12 ? 0 : never : A extends -12 ? B extends 0 ? -12 : B extends 1 ? -11 : B extends 2 ? -10 : B extends 3 ? -9 : B extends 4 ? -8 : B extends 5 ? -7 : B extends 6 ? -6 : B extends 7 ? -5 : B extends 8 ? -4 : B extends 9 ? -3 : B extends 10 ? -2 : B extends 11 ? -1 : B extends 12 ? 0 : never : never;
18
+ /**
19
+ * @group Exponent Functions
20
+ */
21
+ type SubExponents<A extends Exponent, B extends Exponent> = SumExponents<A, NegativeExponent<B>>;
22
+ /**
23
+ * @group Exponent Functions
24
+ */
25
+ type MultiplyExponents<A extends Exponent, B extends Exponent> = A extends 0 ? B extends 0 ? 0 : B extends 1 ? 0 : B extends -1 ? 0 : B extends 2 ? 0 : B extends -2 ? 0 : B extends 3 ? 0 : B extends -3 ? 0 : B extends 4 ? 0 : B extends -4 ? 0 : B extends 5 ? 0 : B extends -5 ? 0 : B extends 6 ? 0 : B extends -6 ? 0 : B extends 7 ? 0 : B extends -7 ? 0 : B extends 8 ? 0 : B extends -8 ? 0 : B extends 9 ? 0 : B extends -9 ? 0 : B extends 10 ? 0 : B extends -10 ? 0 : B extends 11 ? 0 : B extends -11 ? 0 : B extends 12 ? 0 : B extends -12 ? 0 : never : A extends 1 ? B extends 0 ? 0 : B extends 1 ? 1 : B extends -1 ? -1 : B extends 2 ? 2 : B extends -2 ? -2 : B extends 3 ? 3 : B extends -3 ? -3 : B extends 4 ? 4 : B extends -4 ? -4 : B extends 5 ? 5 : B extends -5 ? -5 : B extends 6 ? 6 : B extends -6 ? -6 : B extends 7 ? 7 : B extends -7 ? -7 : B extends 8 ? 8 : B extends -8 ? -8 : B extends 9 ? 9 : B extends -9 ? -9 : B extends 10 ? 10 : B extends -10 ? -10 : B extends 11 ? 11 : B extends -11 ? -11 : B extends 12 ? 12 : B extends -12 ? -12 : never : A extends -1 ? B extends 0 ? 0 : B extends 1 ? -1 : B extends -1 ? 1 : B extends 2 ? -2 : B extends -2 ? 2 : B extends 3 ? -3 : B extends -3 ? 3 : B extends 4 ? -4 : B extends -4 ? 4 : B extends 5 ? -5 : B extends -5 ? 5 : B extends 6 ? -6 : B extends -6 ? 6 : B extends 7 ? -7 : B extends -7 ? 7 : B extends 8 ? -8 : B extends -8 ? 8 : B extends 9 ? -9 : B extends -9 ? 9 : B extends 10 ? -10 : B extends -10 ? 10 : B extends 11 ? -11 : B extends -11 ? 11 : B extends 12 ? -12 : B extends -12 ? 12 : never : A extends 2 ? B extends 0 ? 0 : B extends 1 ? 2 : B extends -1 ? -2 : B extends 2 ? 4 : B extends -2 ? -4 : B extends 3 ? 6 : B extends -3 ? -6 : B extends 4 ? 8 : B extends -4 ? -8 : B extends 5 ? 10 : B extends -5 ? -10 : B extends 6 ? 12 : B extends -6 ? -12 : never : A extends -2 ? B extends 0 ? 0 : B extends 1 ? -2 : B extends -1 ? 2 : B extends 2 ? -4 : B extends -2 ? 4 : B extends 3 ? -6 : B extends -3 ? 6 : B extends 4 ? -8 : B extends -4 ? 8 : B extends 5 ? -10 : B extends -5 ? 10 : B extends 6 ? -12 : B extends -6 ? 12 : never : A extends 3 ? B extends 0 ? 0 : B extends 1 ? 3 : B extends -1 ? -3 : B extends 2 ? 6 : B extends -2 ? -6 : B extends 3 ? 9 : B extends -3 ? -9 : B extends 4 ? 12 : B extends -4 ? -12 : never : A extends -3 ? B extends 0 ? 0 : B extends 1 ? -3 : B extends -1 ? 3 : B extends 2 ? -6 : B extends -2 ? 6 : B extends 3 ? -9 : B extends -3 ? 9 : B extends 4 ? -12 : B extends -4 ? 12 : never : A extends 4 ? B extends 0 ? 0 : B extends 1 ? 4 : B extends -1 ? -4 : B extends 2 ? 8 : B extends -2 ? -8 : B extends 3 ? 12 : B extends -3 ? -12 : never : A extends -4 ? B extends 0 ? 0 : B extends 1 ? -4 : B extends -1 ? 4 : B extends 2 ? -8 : B extends -2 ? 8 : B extends 3 ? -12 : B extends -3 ? 12 : never : A extends 5 ? B extends 0 ? 0 : B extends 1 ? 5 : B extends -1 ? -5 : B extends 2 ? 10 : B extends -2 ? -10 : never : A extends -5 ? B extends 0 ? 0 : B extends 1 ? -5 : B extends -1 ? 5 : B extends 2 ? -10 : B extends -2 ? 10 : never : A extends 6 ? B extends 0 ? 0 : B extends 1 ? 6 : B extends -1 ? -6 : B extends 2 ? 12 : B extends -2 ? -12 : never : A extends -6 ? B extends 0 ? 0 : B extends 1 ? -6 : B extends -1 ? 6 : B extends 2 ? -12 : B extends -2 ? 12 : never : A extends 7 ? B extends 0 ? 0 : B extends 1 ? 7 : B extends -1 ? -7 : never : A extends -7 ? B extends 0 ? 0 : B extends 1 ? -7 : B extends -1 ? 7 : never : A extends 8 ? B extends 0 ? 0 : B extends 1 ? 8 : B extends -1 ? -8 : never : A extends -8 ? B extends 0 ? 0 : B extends 1 ? -8 : B extends -1 ? 8 : never : A extends 9 ? B extends 0 ? 0 : B extends 1 ? 9 : B extends -1 ? -9 : never : A extends -9 ? B extends 0 ? 0 : B extends 1 ? -9 : B extends -1 ? 9 : never : A extends 10 ? B extends 0 ? 0 : B extends 1 ? 10 : B extends -1 ? -10 : never : A extends -10 ? B extends 0 ? 0 : B extends 1 ? -10 : B extends -1 ? 10 : never : A extends 11 ? B extends 0 ? 0 : B extends 1 ? 11 : B extends -1 ? -11 : never : A extends -11 ? B extends 0 ? 0 : B extends 1 ? -11 : B extends -1 ? 11 : never : A extends 12 ? B extends 0 ? 0 : B extends 1 ? 12 : B extends -1 ? -12 : never : A extends -12 ? B extends 0 ? 0 : B extends 1 ? -12 : B extends -1 ? 12 : never : never;
26
+ /**
27
+ * @group Exponent Functions
28
+ */
29
+ type DivideExponents<A extends Exponent, B extends Exponent> = B extends 0 ? never : B extends 1 ? A extends 0 ? 0 : A extends 1 ? 1 : A extends -1 ? -1 : A extends 2 ? 2 : A extends -2 ? -2 : A extends 3 ? 3 : A extends -3 ? -3 : A extends 4 ? 4 : A extends -4 ? -4 : A extends 5 ? 5 : A extends -5 ? -5 : A extends 6 ? 6 : A extends -6 ? -6 : A extends 7 ? 7 : A extends -7 ? -7 : A extends 8 ? 8 : A extends -8 ? -8 : A extends 9 ? 9 : A extends -9 ? -9 : A extends 10 ? 10 : A extends -10 ? -10 : A extends 11 ? 11 : A extends -11 ? -11 : A extends 12 ? 12 : A extends -12 ? -12 : never : B extends -1 ? A extends 0 ? 0 : A extends 1 ? -1 : A extends -1 ? 1 : A extends 2 ? -2 : A extends -2 ? 2 : A extends 3 ? -3 : A extends -3 ? 3 : A extends 4 ? -4 : A extends -4 ? 4 : A extends 5 ? -5 : A extends -5 ? 5 : A extends 6 ? -6 : A extends -6 ? 6 : A extends 7 ? -7 : A extends -7 ? 7 : A extends 8 ? -8 : A extends -8 ? 8 : A extends 9 ? -9 : A extends -9 ? 9 : A extends 10 ? -10 : A extends -10 ? 10 : A extends 11 ? -11 : A extends -11 ? 11 : A extends 12 ? -12 : A extends -12 ? 12 : never : B extends 2 ? A extends 0 ? 0 : A extends 2 ? 1 : A extends -2 ? -1 : A extends 4 ? 2 : A extends -4 ? -2 : A extends 6 ? 3 : A extends -6 ? -3 : A extends 8 ? 4 : A extends -8 ? -4 : A extends 10 ? 5 : A extends -10 ? -5 : A extends 12 ? 6 : A extends -12 ? -6 : never : B extends -2 ? A extends 0 ? 0 : A extends 2 ? -1 : A extends -2 ? 1 : A extends 4 ? -2 : A extends -4 ? 2 : A extends 6 ? -3 : A extends -6 ? 3 : A extends 8 ? -4 : A extends -8 ? 4 : A extends 10 ? -5 : A extends -10 ? 5 : A extends 12 ? -6 : A extends -12 ? 6 : never : B extends 3 ? A extends 0 ? 0 : A extends 3 ? 1 : A extends -3 ? -1 : A extends 6 ? 2 : A extends -6 ? -2 : A extends 9 ? 3 : A extends -9 ? -3 : A extends 12 ? 4 : A extends -12 ? -4 : never : B extends -3 ? A extends 0 ? 0 : A extends 3 ? -1 : A extends -3 ? 1 : A extends 6 ? -2 : A extends -6 ? 2 : A extends 9 ? -3 : A extends -9 ? 3 : A extends 12 ? -4 : A extends -12 ? 4 : never : B extends 4 ? A extends 0 ? 0 : A extends 4 ? 1 : A extends -4 ? -1 : A extends 8 ? 2 : A extends -8 ? -2 : A extends 12 ? 3 : A extends -12 ? -3 : never : B extends -4 ? A extends 0 ? 0 : A extends 4 ? -1 : A extends -4 ? 1 : A extends 8 ? -2 : A extends -8 ? 2 : A extends 12 ? -3 : A extends -12 ? 3 : never : B extends 5 ? A extends 0 ? 0 : A extends 5 ? 1 : A extends -5 ? -1 : A extends 10 ? 2 : A extends -10 ? -2 : never : B extends -5 ? A extends 0 ? 0 : A extends 5 ? -1 : A extends -5 ? 1 : A extends 10 ? -2 : A extends -10 ? 2 : never : B extends 6 ? A extends 0 ? 0 : A extends 6 ? 1 : A extends -6 ? -1 : A extends 12 ? 2 : A extends -12 ? -2 : never : B extends -6 ? A extends 0 ? 0 : A extends 6 ? -1 : A extends -6 ? 1 : A extends 12 ? -2 : A extends -12 ? 2 : never : B extends 7 ? A extends 0 ? 0 : A extends 7 ? 1 : A extends -7 ? -1 : never : B extends -7 ? A extends 0 ? 0 : A extends 7 ? -1 : A extends -7 ? 1 : never : B extends 8 ? A extends 0 ? 0 : A extends 8 ? 1 : A extends -8 ? -1 : never : B extends -8 ? A extends 0 ? 0 : A extends 8 ? -1 : A extends -8 ? 1 : never : B extends 9 ? A extends 0 ? 0 : A extends 9 ? 1 : A extends -9 ? -1 : never : B extends -9 ? A extends 0 ? 0 : A extends 9 ? -1 : A extends -9 ? 1 : never : B extends 10 ? A extends 0 ? 0 : A extends 10 ? 1 : A extends -10 ? -1 : never : B extends -10 ? A extends 0 ? 0 : A extends 10 ? -1 : A extends -10 ? 1 : never : B extends 11 ? A extends 0 ? 0 : A extends 11 ? 1 : A extends -11 ? -1 : never : B extends -11 ? A extends 0 ? 0 : A extends 11 ? -1 : A extends -11 ? 1 : never : B extends 12 ? A extends 0 ? 0 : A extends 12 ? 1 : A extends -12 ? -1 : never : B extends -12 ? A extends 0 ? 0 : A extends 12 ? -1 : A extends -12 ? 1 : never : never;
30
+
31
+ /**
32
+ * Remove all key from the object that are `never`.
33
+ */
34
+ type RemoveNeverValues<T extends object> = {
35
+ [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
36
+ };
37
+ /**
38
+ * Exclude all unit subvalues with an exponent value of zero.
39
+ */
40
+ type ExcludeUnitZeroSubvalues<U extends UnitSubvalues> = {
41
+ [S in keyof U as S extends string ? U[S] extends 0 ? never : S : never]: U[S];
42
+ };
43
+ /**
44
+ * Get the exponent value of the given key.
45
+ */
46
+ type GetExponent<C extends UnitSubvalues, S> = S extends keyof C ? C[S] : 0;
47
+ /**
48
+ * Flatten a complex type such as a union or intersection of objects into a
49
+ * single object.
50
+ *
51
+ * @internal
52
+ */
53
+ type FlatternAlias<T> = {
54
+ [P in keyof T]: T[P];
55
+ } & {};
56
+ /**
57
+ * Make `T` exactly `T`.
58
+ *
59
+ * @internal
60
+ */
61
+ type Exactify<T, U extends T> = T & {
62
+ [K in keyof U]: K extends keyof T ? U[K] : never;
63
+ };
64
+
65
+ /**
66
+ * A unit without any meta data.
67
+ *
68
+ * @group Abstract Unit Generators
69
+ */
70
+ type AbstractUnit<C extends UnitSubvalues> = number & {
71
+ readonly __uom_types__unit_class: UnitClass<C>;
72
+ };
73
+ /**
74
+ * Create a unit without meta data from an already existing {@link UnitClass}.
75
+ *
76
+ * @group Abstract Unit Generators
77
+ */
78
+ type AbstractUnitFrom<C extends UnknownUnitClass> = C extends UnitClass<infer A> ? AbstractUnit<UnitSubvalues extends A ? {} : A> : never;
79
+ /**
80
+ * The core unit type.
81
+ *
82
+ * @group Unit Generators
83
+ */
84
+ type Unit<C extends UnitSubvalues, M extends UnitSubvalues = {}> = number & {
85
+ readonly __uom_types__unit_class: UnitClass<C>;
86
+ readonly __uom_types__unit_meta: UnitMeta<M>;
87
+ };
88
+ /**
89
+ * Create a {@link Unit} from already existing {@link UnitClass} and {@link UnitMeta}.
90
+ *
91
+ * @group Unit Generators
92
+ */
93
+ type UnitFrom<C extends UnknownUnitClass, M extends UnknownUnitMeta = UnitMeta<{}>> = C extends UnitClass<infer A> ? M extends UnitMeta<infer B> ? Unit<UnitSubvalues extends A ? {} : A, UnitSubvalues extends B ? {} : B> : never : never;
94
+ /**
95
+ * A {@link Unit} without any {@link UnitClass}.
96
+ *
97
+ * Used to convert from one {@link Unit} to another of the same {@link UnitClass}.
98
+ *
99
+ * @group Unit Generators
100
+ */
101
+ type UnitConversionRate<M extends UnitSubvalues> = Unit<{}, M>;
102
+ /**
103
+ * Create a {@link UnitConversionRate} from already existing {@link UnitMeta}.
104
+ *
105
+ * @group Unit Generators
106
+ */
107
+ type UnitConversionRateFrom<M extends UnknownUnitMeta> = M extends UnitMeta<infer A> ? UnitConversionRate<UnitSubvalues extends A ? {} : A> : never;
108
+ /**
109
+ * Used to determine what a unit is of. For example, length, volume, mass etc.
110
+ *
111
+ * @group Unit Components
112
+ */
113
+ type UnitClass<T extends UnitSubvalues> = UnitKeyValues<T> & {
114
+ readonly __uno_types__unit_class_type: true;
115
+ };
116
+ /**
117
+ * Used to state how units of the same {@link UnitClass} differ from one another.
118
+ * For example, by a scale factor.
119
+ *
120
+ * @group Unit Components
121
+ */
122
+ type UnitMeta<T extends UnitSubvalues> = UnitKeyValues<T> & {
123
+ readonly __uno_types__unit_meta_type: true;
124
+ };
125
+ /**
126
+ * A {@link Unit} that we don't know anything about.
127
+ *
128
+ * @group Unknown Units
129
+ */
130
+ type UnknownUnit = UnknownAbstractUnit & {
131
+ readonly __uom_types__unit_meta: UnknownUnitMeta;
132
+ };
133
+ /**
134
+ * An {@link AbstractUnit} that we don't know anything about.
135
+ *
136
+ * @group Unknown Units
137
+ */
138
+ type UnknownAbstractUnit = number & {
139
+ readonly __uom_types__unit_class: UnknownUnitClass;
140
+ };
141
+ /**
142
+ * A {@link UnitClass} that we don't know anything about.
143
+ *
144
+ * @group Unknown Units
145
+ */
146
+ type UnknownUnitClass = UnknownUnitKeyValues & {
147
+ readonly __uno_types__unit_class_type: true;
148
+ };
149
+ /**
150
+ * A {@link UnitMeta} that we don't know anything about.
151
+ *
152
+ * @group Unknown Units
153
+ */
154
+ type UnknownUnitMeta = UnknownUnitKeyValues & {
155
+ readonly __uno_types__unit_meta_type: true;
156
+ };
157
+ type UnitKeyValues<T extends UnitSubvalues> = {
158
+ readonly __uom_types__keys: keyof ExcludeUnitZeroSubvalues<T> extends string ? keyof ExcludeUnitZeroSubvalues<T> : never;
159
+ readonly __uom_types__value: RemoveNeverValues<T>;
160
+ };
161
+ type UnknownUnitKeyValues = {
162
+ readonly __uom_types__keys: string;
163
+ readonly __uom_types__value: {};
164
+ };
165
+ /**
166
+ * A mapping of subvalue of a unit its magnitude.
167
+ *
168
+ * @group Unit Components
169
+ */
170
+ type UnitSubvalues = Record<string, Exponent>;
171
+
172
+ /**
173
+ * Multiple the exponent values of a unit by a number.
174
+ *
175
+ * @group Unit Functions
176
+ */
177
+ type MultiplyUnitExponents<T extends number, E extends Exponent> = T extends Unit<infer Config, infer Meta> ? Unit<FlatternAlias<MultiplyUnitSubvaluesExponents<Config, E>>, FlatternAlias<MultiplyUnitSubvaluesExponents<Meta, E>>> : number;
178
+ type MultiplyUnitSubvaluesExponents<T extends UnitSubvalues, E extends Exponent> = {
179
+ [S in keyof T]: MultiplyExponents<GetExponent<T, S>, E>;
180
+ };
181
+ /**
182
+ * Divide the exponent values of a unit by a number.
183
+ *
184
+ * @group Unit Functions
185
+ */
186
+ type DivideUnitExponents<T extends number, E extends Exponent> = T extends Unit<infer Config, infer Meta> ? Unit<FlatternAlias<DivideUnitSubvaluesExponents<Config, E>>, FlatternAlias<DivideUnitSubvaluesExponents<Meta, E>>> : number;
187
+ type DivideUnitSubvaluesExponents<T extends UnitSubvalues, E extends Exponent> = {
188
+ [S in keyof T]: DivideExponents<GetExponent<T, S>, E>;
189
+ };
190
+
191
+ /**
192
+ * Take the inverse of a unit.
193
+ *
194
+ * @group Unit Functions
195
+ * @returns `1/X`.
196
+ */
197
+ type Inverse<X extends number> = X extends Unit<infer Config, infer Meta> ? Unit<FlatternAlias<InverseUnitSubvalues<Config>>, FlatternAlias<InverseUnitSubvalues<Meta>>> : X extends AbstractUnit<infer Config> ? AbstractUnit<FlatternAlias<InverseUnitSubvalues<Config>>> : number;
198
+ /**
199
+ * Inverses each of the subvalues.
200
+ *
201
+ * @group Unit Subvalue Functions
202
+ */
203
+ type InverseUnitSubvalues<T extends UnitSubvalues> = {
204
+ [E in keyof T]: NegativeExponent<T[E]>;
205
+ };
206
+ /**
207
+ * Multiply a unit by another unit.
208
+ *
209
+ * @group Unit Functions
210
+ * @returns `A⋅B`
211
+ */
212
+ type Multiply<A extends number, B extends number> = A extends Unit<infer AConfig, infer AMeta> ? B extends Unit<infer BConfig, infer BMeta> ? Unit<FlatternAlias<MultiplyUnitSubvalues<AConfig, BConfig>>, FlatternAlias<MultiplyUnitSubvalues<AMeta, BMeta>>> : B extends UnknownAbstractUnit ? never : A : B extends UnknownUnit ? A extends UnknownAbstractUnit ? never : B : A extends AbstractUnit<infer AConfig> ? B extends AbstractUnit<infer BConfig> ? AbstractUnit<FlatternAlias<MultiplyUnitSubvalues<AConfig, BConfig>>> : A : B extends UnknownAbstractUnit ? B : number;
213
+ /**
214
+ * Multiply each of the subvalues from a unit with the corresponding once from another unit.
215
+ *
216
+ * @group Unit Subvalue Functions
217
+ */
218
+ type MultiplyUnitSubvalues<A extends UnitSubvalues, B extends UnitSubvalues> = ExcludeUnitZeroSubvalues<{
219
+ [S in keyof A | keyof B]: SumExponents<GetExponent<A, S>, GetExponent<B, S>>;
220
+ }>;
221
+ /**
222
+ * Divide a unit by another unit.
223
+ *
224
+ * @group Unit Functions
225
+ * @returns `A/B`
226
+ */
227
+ type Divide<A extends number, B extends number> = Multiply<A, Inverse<B>>;
228
+ /**
229
+ * Divide each of the subvalues from a unit with the corresponding once from another unit.
230
+ *
231
+ * @group Unit Subvalue Functions
232
+ */
233
+ type DivideUnitSubvalues<A extends UnitSubvalues, B extends UnitSubvalues> = MultiplyUnitSubvalues<A, InverseUnitSubvalues<B>>;
234
+
235
+ export { AbstractUnit as A, Divide as D, Exactify as E, Inverse as I, Multiply as M, NegativeExponent as N, SubExponents as S, UnknownUnit as U, Unit as a, UnknownAbstractUnit as b, DivideUnitExponents as c, AbstractUnitFrom as d, UnitSubvalues as e, UnitMeta as f, UnknownUnitMeta as g, UnitFrom as h, UnitClass as i, Exponent as j, UnitConversionRate as k, MultiplyUnitExponents as l, UnknownUnitClass as m, InverseUnitSubvalues as n, UnitConversionRateFrom as o, DivideExponents as p, MultiplyExponents as q, SumExponents as r, DivideUnitSubvalues as s, MultiplyUnitSubvalues as t };