uom-types 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/functions-ho.d.cts +71 -2
- package/dist/functions-ho.d.mts +71 -2
- package/dist/functions.d.cts +71 -2
- package/dist/functions.d.mts +71 -2
- package/dist/si-units.d.cts +34 -1
- package/dist/si-units.d.mts +34 -1
- package/package.json +1 -1
package/dist/functions-ho.d.cts
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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<{}>;
|
|
3
72
|
|
|
4
73
|
type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
|
|
5
74
|
/**
|
package/dist/functions-ho.d.mts
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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<{}>;
|
|
3
72
|
|
|
4
73
|
type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
|
|
5
74
|
/**
|
package/dist/functions.d.cts
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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<{}>;
|
|
3
72
|
|
|
4
73
|
type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
|
|
5
74
|
/**
|
package/dist/functions.d.mts
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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<{}>;
|
|
3
72
|
|
|
4
73
|
type OperationIO<T extends number> = T extends UnknownUnit ? T : number;
|
|
5
74
|
/**
|
package/dist/si-units.d.cts
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
|
-
|
|
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
|
+
}>;
|
|
2
35
|
|
|
3
36
|
type Decimal = Unit<{}>;
|
|
4
37
|
|
package/dist/si-units.d.mts
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
|
-
|
|
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
|
+
}>;
|
|
2
35
|
|
|
3
36
|
type Decimal = Unit<{}>;
|
|
4
37
|
|