uom-types 1.0.3 → 2.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.
@@ -42,7 +42,7 @@ function modSafe(a) {
42
42
  * Put a number to the power of the given value.
43
43
  */
44
44
  function pow(exponent) {
45
- return ((base) => base ** exponent);
45
+ return (base) => (base ** exponent);
46
46
  }
47
47
  /**
48
48
  * Equal: Compare if a value is equal to the given value.
@@ -1,74 +1,5 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
15
- [K in keyof T as T[K] extends {
16
- exponent: 0;
17
- } ? never : K]: T[K];
18
- };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
20
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
- };
22
- type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
- exponent: 0;
24
- };
25
- type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
- type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
- /**
46
- * Flatten a complex type such as a union or intersection of objects into a
47
- * single object.
48
- */
49
- type FlatternAlias<T> = {
50
- [P in keyof T]: T[P];
51
- } & {};
52
-
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
- type UnitValue = {
56
- exponent: Exponent;
57
- } & Record<string, Exponent>;
58
- /**
59
- * A unit of measurement.
60
- */
61
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
62
- [K in keyof T]: T[K] extends Exponent ? {
63
- exponent: T[K];
64
- } : T[K] extends UnitValue ? T[K] : never;
65
- }>;
66
- type UnknownUnit = number & Readonly<{
67
- __exactKeys: string;
68
- __uom_types: Record<string, {}>;
69
- }>;
70
-
71
- type Decimal = Unit<{}>;
1
+ import { Multiply, Divide, UnknownUnit, Inverse, DivideUnitExponents } from './index.cjs';
2
+ import { Decimal } from './si-units.cjs';
72
3
 
73
4
  type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
74
5
  /**
@@ -95,11 +26,11 @@ declare function mod<T extends number>(a: OperationIO<T>): (b: OperationIO<T>) =
95
26
  * Perform mathematic modular arithmetic.
96
27
  */
97
28
  declare function modSafe<T extends number>(a: OperationIO<T>): (b: OperationIO<T>) => OperationIO<T>;
98
- type PowFunction<E extends number, B extends number> = E extends -1 ? (b: OperationIO<B>) => OperationIO<Inverse<B>> : E extends 0 ? (b: OperationIO<B>) => Decimal | 1 : E extends 0.5 ? (b: OperationIO<B>) => OperationIO<Divide<B, 2>> : E extends 1 ? (b: OperationIO<B>) => OperationIO<B> : E extends 2 ? (b: OperationIO<B>) => OperationIO<Multiply<B, B>> : E extends 3 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, B>>> : E extends 4 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, Multiply<B, B>>>> : (b: OperationIO<B>) => OperationIO<number>;
29
+ type PowFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends -1 ? (b: OperationIO<B>) => OperationIO<Inverse<B>> : E extends 0 ? (b: OperationIO<B>) => OperationIO<B> extends UnknownUnit ? Decimal : 1 : E extends 0.5 ? (b: OperationIO<B>) => OperationIO<DivideUnitExponents<B, 2>> : E extends 1 ? (b: OperationIO<B>) => OperationIO<B> : E extends 2 ? (b: OperationIO<B>) => OperationIO<Multiply<B, B>> : E extends 3 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, B>>> : E extends 4 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, Multiply<B, B>>>> : (b: OperationIO<B>) => OperationIO<number>;
99
30
  /**
100
31
  * Put a number to the power of the given value.
101
32
  */
102
- declare function pow<E extends number, B extends number>(exponent: E extends UnknownUnit ? never : E): PowFunction<E, B>;
33
+ declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<E, B>>[0]) => ReturnType<PowFunction<E, B>>;
103
34
  /**
104
35
  * Equal: Compare if a value is equal to the given value.
105
36
  */
@@ -1,74 +1,5 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
15
- [K in keyof T as T[K] extends {
16
- exponent: 0;
17
- } ? never : K]: T[K];
18
- };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
20
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
- };
22
- type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
- exponent: 0;
24
- };
25
- type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
- type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
- /**
46
- * Flatten a complex type such as a union or intersection of objects into a
47
- * single object.
48
- */
49
- type FlatternAlias<T> = {
50
- [P in keyof T]: T[P];
51
- } & {};
52
-
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
- type UnitValue = {
56
- exponent: Exponent;
57
- } & Record<string, Exponent>;
58
- /**
59
- * A unit of measurement.
60
- */
61
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
62
- [K in keyof T]: T[K] extends Exponent ? {
63
- exponent: T[K];
64
- } : T[K] extends UnitValue ? T[K] : never;
65
- }>;
66
- type UnknownUnit = number & Readonly<{
67
- __exactKeys: string;
68
- __uom_types: Record<string, {}>;
69
- }>;
70
-
71
- type Decimal = Unit<{}>;
1
+ import { Multiply, Divide, UnknownUnit, Inverse, DivideUnitExponents } from './index.mjs';
2
+ import { Decimal } from './si-units.mjs';
72
3
 
73
4
  type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
74
5
  /**
@@ -95,11 +26,11 @@ declare function mod<T extends number>(a: OperationIO<T>): (b: OperationIO<T>) =
95
26
  * Perform mathematic modular arithmetic.
96
27
  */
97
28
  declare function modSafe<T extends number>(a: OperationIO<T>): (b: OperationIO<T>) => OperationIO<T>;
98
- type PowFunction<E extends number, B extends number> = E extends -1 ? (b: OperationIO<B>) => OperationIO<Inverse<B>> : E extends 0 ? (b: OperationIO<B>) => Decimal | 1 : E extends 0.5 ? (b: OperationIO<B>) => OperationIO<Divide<B, 2>> : E extends 1 ? (b: OperationIO<B>) => OperationIO<B> : E extends 2 ? (b: OperationIO<B>) => OperationIO<Multiply<B, B>> : E extends 3 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, B>>> : E extends 4 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, Multiply<B, B>>>> : (b: OperationIO<B>) => OperationIO<number>;
29
+ type PowFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends -1 ? (b: OperationIO<B>) => OperationIO<Inverse<B>> : E extends 0 ? (b: OperationIO<B>) => OperationIO<B> extends UnknownUnit ? Decimal : 1 : E extends 0.5 ? (b: OperationIO<B>) => OperationIO<DivideUnitExponents<B, 2>> : E extends 1 ? (b: OperationIO<B>) => OperationIO<B> : E extends 2 ? (b: OperationIO<B>) => OperationIO<Multiply<B, B>> : E extends 3 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, B>>> : E extends 4 ? (b: OperationIO<B>) => OperationIO<Multiply<B, Multiply<B, Multiply<B, B>>>> : (b: OperationIO<B>) => OperationIO<number>;
99
30
  /**
100
31
  * Put a number to the power of the given value.
101
32
  */
102
- declare function pow<E extends number, B extends number>(exponent: E extends UnknownUnit ? never : E): PowFunction<E, B>;
33
+ declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<E, B>>[0]) => ReturnType<PowFunction<E, B>>;
103
34
  /**
104
35
  * Equal: Compare if a value is equal to the given value.
105
36
  */
@@ -40,7 +40,7 @@ function modSafe(a) {
40
40
  * Put a number to the power of the given value.
41
41
  */
42
42
  function pow(exponent) {
43
- return ((base) => base ** exponent);
43
+ return (base) => (base ** exponent);
44
44
  }
45
45
  /**
46
46
  * Equal: Compare if a value is equal to the given value.
@@ -107,12 +107,6 @@ function min(values) {
107
107
  function sum(values) {
108
108
  return values.reduce((add), 0);
109
109
  }
110
- /**
111
- * Takes the product of all the values in the given collection.
112
- */
113
- function product(values) {
114
- return values.reduce((mul), 1);
115
- }
116
110
  /**
117
111
  * Equal: Compare if two values are equal.
118
112
  */
@@ -162,7 +156,6 @@ exports.modSafe = modSafe;
162
156
  exports.mul = mul;
163
157
  exports.negate = negate;
164
158
  exports.pow = pow;
165
- exports.product = product;
166
159
  exports.round = round;
167
160
  exports.sqrt = sqrt;
168
161
  exports.sub = sub;
@@ -1,74 +1,5 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
15
- [K in keyof T as T[K] extends {
16
- exponent: 0;
17
- } ? never : K]: T[K];
18
- };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
20
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
- };
22
- type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
- exponent: 0;
24
- };
25
- type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
- type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
- /**
46
- * Flatten a complex type such as a union or intersection of objects into a
47
- * single object.
48
- */
49
- type FlatternAlias<T> = {
50
- [P in keyof T]: T[P];
51
- } & {};
52
-
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
- type UnitValue = {
56
- exponent: Exponent;
57
- } & Record<string, Exponent>;
58
- /**
59
- * A unit of measurement.
60
- */
61
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
62
- [K in keyof T]: T[K] extends Exponent ? {
63
- exponent: T[K];
64
- } : T[K] extends UnitValue ? T[K] : never;
65
- }>;
66
- type UnknownUnit = number & Readonly<{
67
- __exactKeys: string;
68
- __uom_types: Record<string, {}>;
69
- }>;
70
-
71
- type Decimal = Unit<{}>;
1
+ import { Multiply, Divide, Inverse, UnknownUnit, DivideUnitExponents } from './index.cjs';
2
+ import { Decimal } from './si-units.cjs';
72
3
 
73
4
  type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
74
5
  /**
@@ -114,7 +45,7 @@ declare function pow<B extends number>(base: OperationIO<B>, exponent: 0): Opera
114
45
  /**
115
46
  * Put a number to the power of 1/2.
116
47
  */
117
- declare function pow<B extends number>(base: OperationIO<B>, exponent: 0.5): OperationIO<Divide<B, 2>>;
48
+ declare function pow<B extends number>(base: OperationIO<B>, exponent: 0.5): OperationIO<DivideUnitExponents<B, 2>>;
118
49
  /**
119
50
  * Put a number to the power of 1.
120
51
  */
@@ -138,7 +69,7 @@ declare function pow<B extends number, E extends number>(base: OperationIO<B>, e
138
69
  /**
139
70
  * Take the square root of the given value.
140
71
  */
141
- declare function sqrt<T extends number>(value: OperationIO<T>): OperationIO<Divide<T, 2>>;
72
+ declare function sqrt<T extends number>(value: OperationIO<T>): OperationIO<DivideUnitExponents<T, 2>>;
142
73
  /**
143
74
  * Inverse the given value.
144
75
  */
@@ -175,10 +106,6 @@ declare function min<T extends number>(values: Iterable<T>): OperationIO<T>;
175
106
  * Takes the sum of all the values in the given collection.
176
107
  */
177
108
  declare function sum<T extends number>(values: ReadonlyArray<T>): OperationIO<T>;
178
- /**
179
- * Takes the product of all the values in the given collection.
180
- */
181
- declare function product<T extends number>(values: ReadonlyArray<T>): OperationIO<T>;
182
109
  /**
183
110
  * Equal: Compare if two values are equal.
184
111
  */
@@ -200,4 +127,4 @@ declare function lt<A extends number>(a: OperationIO<A>, b: A): boolean;
200
127
  */
201
128
  declare function lte<A extends number>(a: OperationIO<A>, b: A): boolean;
202
129
 
203
- export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, product, round, sqrt, sub, sum };
130
+ export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, round, sqrt, sub, sum };
@@ -1,74 +1,5 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
15
- [K in keyof T as T[K] extends {
16
- exponent: 0;
17
- } ? never : K]: T[K];
18
- };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
20
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
- };
22
- type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
- exponent: 0;
24
- };
25
- type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
- type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
- /**
46
- * Flatten a complex type such as a union or intersection of objects into a
47
- * single object.
48
- */
49
- type FlatternAlias<T> = {
50
- [P in keyof T]: T[P];
51
- } & {};
52
-
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
- type UnitValue = {
56
- exponent: Exponent;
57
- } & Record<string, Exponent>;
58
- /**
59
- * A unit of measurement.
60
- */
61
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
62
- [K in keyof T]: T[K] extends Exponent ? {
63
- exponent: T[K];
64
- } : T[K] extends UnitValue ? T[K] : never;
65
- }>;
66
- type UnknownUnit = number & Readonly<{
67
- __exactKeys: string;
68
- __uom_types: Record<string, {}>;
69
- }>;
70
-
71
- type Decimal = Unit<{}>;
1
+ import { Multiply, Divide, Inverse, UnknownUnit, DivideUnitExponents } from './index.mjs';
2
+ import { Decimal } from './si-units.mjs';
72
3
 
73
4
  type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
74
5
  /**
@@ -114,7 +45,7 @@ declare function pow<B extends number>(base: OperationIO<B>, exponent: 0): Opera
114
45
  /**
115
46
  * Put a number to the power of 1/2.
116
47
  */
117
- declare function pow<B extends number>(base: OperationIO<B>, exponent: 0.5): OperationIO<Divide<B, 2>>;
48
+ declare function pow<B extends number>(base: OperationIO<B>, exponent: 0.5): OperationIO<DivideUnitExponents<B, 2>>;
118
49
  /**
119
50
  * Put a number to the power of 1.
120
51
  */
@@ -138,7 +69,7 @@ declare function pow<B extends number, E extends number>(base: OperationIO<B>, e
138
69
  /**
139
70
  * Take the square root of the given value.
140
71
  */
141
- declare function sqrt<T extends number>(value: OperationIO<T>): OperationIO<Divide<T, 2>>;
72
+ declare function sqrt<T extends number>(value: OperationIO<T>): OperationIO<DivideUnitExponents<T, 2>>;
142
73
  /**
143
74
  * Inverse the given value.
144
75
  */
@@ -175,10 +106,6 @@ declare function min<T extends number>(values: Iterable<T>): OperationIO<T>;
175
106
  * Takes the sum of all the values in the given collection.
176
107
  */
177
108
  declare function sum<T extends number>(values: ReadonlyArray<T>): OperationIO<T>;
178
- /**
179
- * Takes the product of all the values in the given collection.
180
- */
181
- declare function product<T extends number>(values: ReadonlyArray<T>): OperationIO<T>;
182
109
  /**
183
110
  * Equal: Compare if two values are equal.
184
111
  */
@@ -200,4 +127,4 @@ declare function lt<A extends number>(a: OperationIO<A>, b: A): boolean;
200
127
  */
201
128
  declare function lte<A extends number>(a: OperationIO<A>, b: A): boolean;
202
129
 
203
- export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, product, round, sqrt, sub, sum };
130
+ export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, round, sqrt, sub, sum };
@@ -105,12 +105,6 @@ function min(values) {
105
105
  function sum(values) {
106
106
  return values.reduce((add), 0);
107
107
  }
108
- /**
109
- * Takes the product of all the values in the given collection.
110
- */
111
- function product(values) {
112
- return values.reduce((mul), 1);
113
- }
114
108
  /**
115
109
  * Equal: Compare if two values are equal.
116
110
  */
@@ -142,4 +136,4 @@ function lte(a, b) {
142
136
  return a <= b;
143
137
  }
144
138
 
145
- export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, product, round, sqrt, sub, sum };
139
+ export { abs, add, ceil, div, eq, floor, gt, gte, inverse, lt, lte, max, min, mod, modSafe, mul, negate, pow, round, sqrt, sub, sum };
package/dist/index.d.cts CHANGED
@@ -1,47 +1,36 @@
1
+ type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
2
+ type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 1 : T extends 0 ? 0 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
3
+ type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
4
+ type SubExponents<A extends Exponent, B extends Exponent> = SumExponents<A, NegativeExponent<B>>;
5
+ type MultiplyExponents<A extends Exponent, B extends 2> = B extends 2 ? A extends -3 ? -6 : A extends -2 ? -4 : A extends -1 ? -2 : A extends 0 ? 0 : A extends 1 ? 2 : A extends 2 ? 4 : A extends 3 ? 6 : never : never;
6
+ type DivideExponents<A extends Exponent, B extends 2> = B extends 2 ? A extends -6 ? -3 : A extends -4 ? -2 : A extends -2 ? -1 : A extends 0 ? 0 : A extends 2 ? 1 : A extends 4 ? 2 : A extends 6 ? 3 : never : never;
7
+
1
8
  type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
9
+ __exactKeys: keyof ExcludeNullUnits<T>;
10
+ __uom_types: RemoveNeverValues<{
11
+ [U in keyof T]: U extends keyof ExcludeNullUnits<T> ? BrandUnitConfigValue<T[U]> : never;
5
12
  }>;
6
13
  };
7
- type RemoveNever<T> = {
14
+ type RemoveNeverValues<T> = {
8
15
  [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
16
  };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
17
+ type BrandUnitConfigValue<T extends UnitValue> = ExcludeNullUnit<T> & {
18
+ __exactKeys: keyof ExcludeNullUnit<T>;
12
19
  };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
20
+ type ExcludeNullUnits<T extends Record<string, UnitValue>> = {
15
21
  [K in keyof T as T[K] extends {
16
22
  exponent: 0;
17
23
  } ? never : K]: T[K];
18
24
  };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
25
+ type ExcludeNullUnit<T extends UnitValue> = {
20
26
  [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
27
  };
28
+ type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
22
29
  type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
30
  exponent: 0;
24
31
  };
25
32
  type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
33
  type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
34
  /**
46
35
  * Flatten a complex type such as a union or intersection of objects into a
47
36
  * single object.
@@ -50,7 +39,6 @@ type FlatternAlias<T> = {
50
39
  [P in keyof T]: T[P];
51
40
  } & {};
52
41
 
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
42
  type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
43
  type UnitValue = {
56
44
  exponent: Exponent;
@@ -68,4 +56,31 @@ type UnknownUnit = number & Readonly<{
68
56
  __uom_types: Record<string, {}>;
69
57
  }>;
70
58
 
71
- export { Divide, Inverse, Multiply, Unit, UnknownUnit };
59
+ type MultiplyUnitExponents<A extends number, B extends 2> = A extends UnknownUnit ? MultiplyUnitExponentsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitExponentsCore<A, B>>> : never : number;
60
+ type MultiplyUnitExponentsCore<A extends UnknownUnit, B extends 2> = {
61
+ [U in keyof GetUnitConfig<A>]: {
62
+ [E in keyof GetUnitConfig<A>[U]]: MultiplyExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, B>;
63
+ };
64
+ };
65
+ type DivideUnitExponents<A extends number, B extends 2> = A extends UnknownUnit ? DivideUnitExponentsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<DivideUnitExponentsCore<A, B>>> : never : number;
66
+ type DivideUnitExponentsCore<A extends UnknownUnit, B extends 2> = {
67
+ [U in keyof GetUnitConfig<A>]: {
68
+ [E in keyof GetUnitConfig<A>[U]]: DivideExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, B>;
69
+ };
70
+ };
71
+
72
+ type Inverse<T extends number> = T extends UnknownUnit ? InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<FlatternAlias<InverseUnitCore<T>>> : never : number;
73
+ type InverseUnitCore<T extends UnknownUnit> = {
74
+ [U in keyof GetUnitConfig<T>]: {
75
+ [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
76
+ };
77
+ };
78
+ type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never : A : B extends UnknownUnit ? B : number;
79
+ type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
80
+ [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
81
+ [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
82
+ };
83
+ };
84
+ type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? Multiply<A, Inverse<B> extends UnknownUnit ? Inverse<B> : never> : A : B extends UnknownUnit ? Inverse<B> : number;
85
+
86
+ export { Divide, DivideExponents, DivideUnitExponents, Exponent, Inverse, Multiply, MultiplyExponents, MultiplyUnitExponents, NegativeExponent, SubExponents, SumExponents, Unit, UnknownUnit };
package/dist/index.d.mts CHANGED
@@ -1,47 +1,36 @@
1
+ type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
2
+ type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 1 : T extends 0 ? 0 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
3
+ type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
4
+ type SubExponents<A extends Exponent, B extends Exponent> = SumExponents<A, NegativeExponent<B>>;
5
+ type MultiplyExponents<A extends Exponent, B extends 2> = B extends 2 ? A extends -3 ? -6 : A extends -2 ? -4 : A extends -1 ? -2 : A extends 0 ? 0 : A extends 1 ? 2 : A extends 2 ? 4 : A extends 3 ? 6 : never : never;
6
+ type DivideExponents<A extends Exponent, B extends 2> = B extends 2 ? A extends -6 ? -3 : A extends -4 ? -2 : A extends -2 ? -1 : A extends 0 ? 0 : A extends 2 ? 1 : A extends 4 ? 2 : A extends 6 ? 3 : never : never;
7
+
1
8
  type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
9
+ __exactKeys: keyof ExcludeNullUnits<T>;
10
+ __uom_types: RemoveNeverValues<{
11
+ [U in keyof T]: U extends keyof ExcludeNullUnits<T> ? BrandUnitConfigValue<T[U]> : never;
5
12
  }>;
6
13
  };
7
- type RemoveNever<T> = {
14
+ type RemoveNeverValues<T> = {
8
15
  [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
16
  };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
17
+ type BrandUnitConfigValue<T extends UnitValue> = ExcludeNullUnit<T> & {
18
+ __exactKeys: keyof ExcludeNullUnit<T>;
12
19
  };
13
- type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
14
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
20
+ type ExcludeNullUnits<T extends Record<string, UnitValue>> = {
15
21
  [K in keyof T as T[K] extends {
16
22
  exponent: 0;
17
23
  } ? never : K]: T[K];
18
24
  };
19
- type ExcludeZeroExponents<T extends UnitValue> = {
25
+ type ExcludeNullUnit<T extends UnitValue> = {
20
26
  [K in keyof T as T[K] extends 0 ? never : K]: T[K];
21
27
  };
28
+ type GetUnitConfig<T> = T extends UnitFull<infer C> ? C : never;
22
29
  type GetUnitValues<T extends Record<string, UnitValue>, U> = U extends keyof T ? T[U] : {
23
30
  exponent: 0;
24
31
  };
25
32
  type KeysOfTwoObjects<A, B> = keyof A | keyof B;
26
33
  type KeysOfKeyOfTwoObjects<A, B, K> = K extends keyof A ? K extends keyof B ? keyof A[K] | keyof B[K] : keyof A[K] : K extends keyof B ? keyof B[K] : never;
27
- type Inverse<T extends number> = T extends UnknownUnit ? InverseUnit<T> : number;
28
- type NegativeExponent<T extends Exponent> = T extends -6 ? 6 : T extends -5 ? 5 : T extends -4 ? 4 : T extends -3 ? 3 : T extends -2 ? 2 : T extends -1 ? 0 : T extends 0 ? 1 : T extends 1 ? -1 : T extends 2 ? -2 : T extends 3 ? -3 : T extends 4 ? -4 : T extends 5 ? -5 : T extends 6 ? -6 : never;
29
- type InverseUnit<T extends UnknownUnit> = InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<InverseUnitCore<T>> : never;
30
- type InverseUnitCore<T extends UnknownUnit> = {
31
- [U in keyof GetUnitConfig<T>]: {
32
- [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
33
- };
34
- };
35
- type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnits<A, B> : A : B extends UnknownUnit ? B : number;
36
- type MultiplyUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never;
37
- type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
38
- [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
39
- [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
40
- };
41
- };
42
- type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? DivideUnits<A, B> : A : B extends UnknownUnit ? Inverse<B> : number;
43
- type DivideUnits<A extends UnknownUnit, B extends UnknownUnit> = MultiplyUnits<A, InverseUnit<B> extends UnknownUnit ? InverseUnit<B> : never>;
44
- type SumExponents<A extends Exponent, B extends Exponent> = A extends -6 ? B extends 0 ? A : B extends 1 ? -5 : B extends 2 ? -4 : B extends 3 ? -3 : B extends 4 ? -2 : B extends 5 ? -1 : B extends 6 ? 0 : never : A extends -5 ? B extends -1 ? -6 : B extends 0 ? A : B extends 1 ? -4 : B extends 2 ? -3 : B extends 3 ? -2 : B extends 4 ? -1 : B extends 5 ? 0 : B extends 6 ? 1 : never : A extends -4 ? B extends -2 ? -6 : B extends -1 ? -5 : B extends 0 ? A : B extends 1 ? -3 : B extends 2 ? -2 : B extends 3 ? -1 : B extends 4 ? 0 : B extends 5 ? 1 : B extends 6 ? 2 : never : A extends -3 ? B extends -3 ? -6 : B extends -2 ? -5 : B extends -1 ? -4 : B extends 0 ? A : B extends 1 ? -2 : B extends 2 ? -1 : B extends 3 ? 0 : B extends 4 ? 1 : B extends 5 ? 2 : B extends 6 ? 3 : never : A extends -2 ? B extends -4 ? -6 : B extends -3 ? -5 : B extends -2 ? -4 : B extends -1 ? -3 : B extends 0 ? A : B extends 1 ? -1 : B extends 2 ? 0 : B extends 3 ? 1 : B extends 4 ? 2 : B extends 5 ? 3 : B extends 6 ? 4 : never : A extends -1 ? B extends -5 ? -6 : B extends -4 ? -5 : B extends -3 ? -4 : B extends -2 ? -3 : B extends -1 ? -2 : B extends 0 ? A : B extends 1 ? 0 : B extends 2 ? 1 : B extends 3 ? 2 : B extends 4 ? 3 : B extends 5 ? 4 : B extends 6 ? 5 : never : A extends 0 ? B : A extends 1 ? B extends -6 ? -5 : B extends -5 ? -4 : B extends -4 ? -3 : B extends -3 ? -2 : B extends -2 ? -1 : B extends -1 ? 0 : B extends 0 ? A : B extends 1 ? 2 : B extends 2 ? 3 : B extends 3 ? 4 : B extends 4 ? 5 : B extends 5 ? 6 : never : A extends 2 ? B extends -6 ? -4 : B extends -5 ? -3 : B extends -4 ? -2 : B extends -3 ? -1 : B extends -2 ? 0 : B extends -1 ? 1 : B extends 0 ? A : B extends 1 ? 3 : B extends 2 ? 4 : B extends 3 ? 5 : B extends 4 ? 6 : never : A extends 3 ? B extends -6 ? -3 : B extends -5 ? -2 : B extends -4 ? -1 : B extends -3 ? 0 : B extends -2 ? 1 : B extends -1 ? 2 : B extends 0 ? A : B extends 1 ? 4 : B extends 2 ? 5 : B extends 3 ? 6 : never : A extends 4 ? B extends -6 ? -2 : B extends -5 ? -1 : B extends -4 ? 0 : B extends -3 ? 1 : B extends -2 ? 2 : B extends -1 ? 3 : B extends 0 ? A : B extends 1 ? 5 : B extends 2 ? 6 : never : A extends 5 ? B extends -6 ? -1 : B extends -5 ? 0 : B extends -4 ? 1 : B extends -3 ? 2 : B extends -2 ? 3 : B extends -1 ? 4 : B extends 0 ? A : B extends 1 ? 6 : never : A extends 6 ? B extends -6 ? 0 : B extends -5 ? 1 : B extends -4 ? 2 : B extends -3 ? 3 : B extends -2 ? 4 : B extends -1 ? 5 : B extends 0 ? A : never : never;
45
34
  /**
46
35
  * Flatten a complex type such as a union or intersection of objects into a
47
36
  * single object.
@@ -50,7 +39,6 @@ type FlatternAlias<T> = {
50
39
  [P in keyof T]: T[P];
51
40
  } & {};
52
41
 
53
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
54
42
  type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
55
43
  type UnitValue = {
56
44
  exponent: Exponent;
@@ -68,4 +56,31 @@ type UnknownUnit = number & Readonly<{
68
56
  __uom_types: Record<string, {}>;
69
57
  }>;
70
58
 
71
- export { Divide, Inverse, Multiply, Unit, UnknownUnit };
59
+ type MultiplyUnitExponents<A extends number, B extends 2> = A extends UnknownUnit ? MultiplyUnitExponentsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitExponentsCore<A, B>>> : never : number;
60
+ type MultiplyUnitExponentsCore<A extends UnknownUnit, B extends 2> = {
61
+ [U in keyof GetUnitConfig<A>]: {
62
+ [E in keyof GetUnitConfig<A>[U]]: MultiplyExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, B>;
63
+ };
64
+ };
65
+ type DivideUnitExponents<A extends number, B extends 2> = A extends UnknownUnit ? DivideUnitExponentsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<DivideUnitExponentsCore<A, B>>> : never : number;
66
+ type DivideUnitExponentsCore<A extends UnknownUnit, B extends 2> = {
67
+ [U in keyof GetUnitConfig<A>]: {
68
+ [E in keyof GetUnitConfig<A>[U]]: DivideExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, B>;
69
+ };
70
+ };
71
+
72
+ type Inverse<T extends number> = T extends UnknownUnit ? InverseUnitCore<T> extends Record<string, UnitValue> ? Unit<FlatternAlias<InverseUnitCore<T>>> : never : number;
73
+ type InverseUnitCore<T extends UnknownUnit> = {
74
+ [U in keyof GetUnitConfig<T>]: {
75
+ [E in keyof GetUnitConfig<T>[U]]: NegativeExponent<GetUnitConfig<T>[U][E]>;
76
+ };
77
+ };
78
+ type Multiply<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? MultiplyUnitsCore<A, B> extends Record<string, UnitValue> ? Unit<FlatternAlias<MultiplyUnitsCore<A, B>>> : never : A : B extends UnknownUnit ? B : number;
79
+ type MultiplyUnitsCore<A extends UnknownUnit, B extends UnknownUnit> = {
80
+ [U in KeysOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>>]: {
81
+ [E in KeysOfKeyOfTwoObjects<GetUnitConfig<A>, GetUnitConfig<B>, U>]: SumExponents<E extends keyof GetUnitValues<GetUnitConfig<A>, U> ? GetUnitValues<GetUnitConfig<A>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<A>, U>[E] : 0 : 0, E extends keyof GetUnitValues<GetUnitConfig<B>, U> ? GetUnitValues<GetUnitConfig<B>, U>[E] extends Exponent ? GetUnitValues<GetUnitConfig<B>, U>[E] : 0 : 0>;
82
+ };
83
+ };
84
+ type Divide<A extends number, B extends number> = A extends UnknownUnit ? B extends UnknownUnit ? Multiply<A, Inverse<B> extends UnknownUnit ? Inverse<B> : never> : A : B extends UnknownUnit ? Inverse<B> : number;
85
+
86
+ export { Divide, DivideExponents, DivideUnitExponents, Exponent, Inverse, Multiply, MultiplyExponents, MultiplyUnitExponents, NegativeExponent, SubExponents, SumExponents, Unit, UnknownUnit };
@@ -1,37 +1,4 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
14
- [K in keyof T as T[K] extends {
15
- exponent: 0;
16
- } ? never : K]: T[K];
17
- };
18
- type ExcludeZeroExponents<T extends UnitValue> = {
19
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
20
- };
21
-
22
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
23
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
24
- type UnitValue = {
25
- exponent: Exponent;
26
- } & Record<string, Exponent>;
27
- /**
28
- * A unit of measurement.
29
- */
30
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
31
- [K in keyof T]: T[K] extends Exponent ? {
32
- exponent: T[K];
33
- } : T[K] extends UnitValue ? T[K] : never;
34
- }>;
1
+ import { Unit } from './index.cjs';
35
2
 
36
3
  type Decimal = Unit<{}>;
37
4
 
@@ -1,37 +1,4 @@
1
- type BrandUnit<T extends Record<string, UnitValue>> = {
2
- __exactKeys: keyof ExcludeZeroExponentsKeys<T>;
3
- __uom_types: RemoveNever<{
4
- [U in keyof T]: U extends keyof ExcludeZeroExponentsKeys<T> ? BrandUnitConfigValue<T[U]> : never;
5
- }>;
6
- };
7
- type RemoveNever<T> = {
8
- [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];
9
- };
10
- type BrandUnitConfigValue<T extends UnitValue> = ExcludeZeroExponents<T> & {
11
- __exactKeys: keyof ExcludeZeroExponents<T>;
12
- };
13
- type ExcludeZeroExponentsKeys<T extends Record<string, UnitValue>> = {
14
- [K in keyof T as T[K] extends {
15
- exponent: 0;
16
- } ? never : K]: T[K];
17
- };
18
- type ExcludeZeroExponents<T extends UnitValue> = {
19
- [K in keyof T as T[K] extends 0 ? never : K]: T[K];
20
- };
21
-
22
- type Exponent = -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6;
23
- type UnitFull<T extends Record<string, UnitValue>> = number & Readonly<BrandUnit<T>>;
24
- type UnitValue = {
25
- exponent: Exponent;
26
- } & Record<string, Exponent>;
27
- /**
28
- * A unit of measurement.
29
- */
30
- type Unit<T extends Record<string, Exponent | UnitValue>> = UnitFull<{
31
- [K in keyof T]: T[K] extends Exponent ? {
32
- exponent: T[K];
33
- } : T[K] extends UnitValue ? T[K] : never;
34
- }>;
1
+ import { Unit } from './index.mjs';
35
2
 
36
3
  type Decimal = Unit<{}>;
37
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uom-types",
3
- "version": "1.0.3",
3
+ "version": "2.0.0",
4
4
  "description": "Typesafe units with no runtime overhead.",
5
5
  "keywords": [
6
6
  "uom",
@@ -22,13 +22,6 @@
22
22
  "email": "rebecca.stevens@outlook.co.nz"
23
23
  },
24
24
  "type": "module",
25
- "imports": {
26
- "#uom-types": "./src/base/index.ts",
27
- "#uom-types/functions": "./src/functions/index.ts",
28
- "#uom-types/functions/higher-order": "./src/functions-ho/index.ts",
29
- "#uom-types/si-units": "./src/si-units/index.ts",
30
- "#uom-types/si-units/converters": "./src/si-units-converters/index.ts"
31
- },
32
25
  "exports": {
33
26
  ".": {
34
27
  "types": {
@@ -74,7 +67,8 @@
74
67
  "README.md"
75
68
  ],
76
69
  "scripts": {
77
- "build": "pnpm run build:node",
70
+ "build": "pnpm run build:node && pnpm run build-post",
71
+ "build-post": "node --no-warnings=ExperimentalWarning --loader=ts-paths-esm-loader/transpile-only --experimental-specifier-resolution=node ./scripts/post-build.ts",
78
72
  "build:node": "rimraf dist && rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript",
79
73
  "cz": "git-cz",
80
74
  "lint": "pnpm run lint:js && pnpm run lint:md && pnpm run lint:prettier && pnpm run lint:knip && pnpm run lint:spelling",
@@ -90,8 +84,9 @@
90
84
  "prepare": "husky install",
91
85
  "release": "pnpm run release:semantic",
92
86
  "release:semantic": "semantic-release",
93
- "test": "pnpm run test:js",
87
+ "test": "pnpm run test:js && pnpm run test:types",
94
88
  "test:js": "c8 ava",
89
+ "test:types": "tsd -t './dist/index.d.mts' -f 'tests/**/*.test-d.ts'",
95
90
  "type-check": "tsc --noEmit"
96
91
  },
97
92
  "devDependencies": {
@@ -144,6 +139,7 @@
144
139
  "ts-node": "10.9.1",
145
140
  "ts-paths-esm-loader": "1.4.3",
146
141
  "tsconfig-paths": "4.2.0",
142
+ "tsd": "0.28.1",
147
143
  "typescript": "5.1.6"
148
144
  },
149
145
  "packageManager": "pnpm@8.6.6",