Skip to content

Commit 88fce9e

Browse files
fix: multiplyUnitExponents and DivideUnitExponents support for AbstractUnit (#52)
1 parent b1b08d3 commit 88fce9e

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

src/unit-exponents.ts

+79-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// eslint-disable-next-line import/no-extraneous-dependencies
22
import { assert, type Equals } from "tsafe";
33

4-
import { type UnitSubvalues, type Unit } from "./core";
4+
import { type AbstractUnit, type UnitSubvalues, type Unit } from "./core";
55
import {
66
type Exponent,
77
type DivideExponents,
@@ -22,6 +22,8 @@ export type MultiplyUnitExponents<
2222
FlatternAlias<MultiplyUnitSubvaluesExponents<Config, E>>,
2323
FlatternAlias<MultiplyUnitSubvaluesExponents<Meta, E>>
2424
>
25+
: T extends AbstractUnit<infer Config>
26+
? AbstractUnit<FlatternAlias<MultiplyUnitSubvaluesExponents<Config, E>>>
2527
: number;
2628

2729
type MultiplyUnitSubvaluesExponents<
@@ -44,6 +46,8 @@ export type DivideUnitExponents<
4446
FlatternAlias<DivideUnitSubvaluesExponents<Config, E>>,
4547
FlatternAlias<DivideUnitSubvaluesExponents<Meta, E>>
4648
>
49+
: T extends AbstractUnit<infer Config>
50+
? AbstractUnit<FlatternAlias<DivideUnitSubvaluesExponents<Config, E>>>
4751
: number;
4852

4953
type DivideUnitSubvaluesExponents<
@@ -69,4 +73,78 @@ if (import.meta.vitest !== undefined) {
6973
assert<Equals<DivideUnitExponents<Unit<{ a: 6 }>, 3>, Unit<{ a: 2 }>>>();
7074
assert<Equals<DivideUnitExponents<Unit<{ a: 3 }>, 3>, Unit<{ a: 1 }>>>();
7175
assert<Equals<DivideUnitExponents<Unit<{ a: -3 }>, 3>, Unit<{ a: -1 }>>>();
76+
77+
assert<
78+
Equals<
79+
MultiplyUnitExponents<AbstractUnit<{ a: 1 }>, 2>,
80+
AbstractUnit<{ a: 2 }>
81+
>
82+
>();
83+
assert<
84+
Equals<
85+
MultiplyUnitExponents<AbstractUnit<{ a: 2 }>, 2>,
86+
AbstractUnit<{ a: 4 }>
87+
>
88+
>();
89+
assert<
90+
Equals<
91+
MultiplyUnitExponents<AbstractUnit<{ a: -2 }>, 2>,
92+
AbstractUnit<{ a: -4 }>
93+
>
94+
>();
95+
assert<
96+
Equals<
97+
MultiplyUnitExponents<AbstractUnit<{ a: 1 }>, 3>,
98+
AbstractUnit<{ a: 3 }>
99+
>
100+
>();
101+
assert<
102+
Equals<
103+
MultiplyUnitExponents<AbstractUnit<{ a: 2 }>, 3>,
104+
AbstractUnit<{ a: 6 }>
105+
>
106+
>();
107+
assert<
108+
Equals<
109+
MultiplyUnitExponents<AbstractUnit<{ a: -2 }>, 3>,
110+
AbstractUnit<{ a: -6 }>
111+
>
112+
>();
113+
114+
assert<
115+
Equals<
116+
DivideUnitExponents<AbstractUnit<{ a: 4 }>, 2>,
117+
AbstractUnit<{ a: 2 }>
118+
>
119+
>();
120+
assert<
121+
Equals<
122+
DivideUnitExponents<AbstractUnit<{ a: 2 }>, 2>,
123+
AbstractUnit<{ a: 1 }>
124+
>
125+
>();
126+
assert<
127+
Equals<
128+
DivideUnitExponents<AbstractUnit<{ a: -2 }>, 2>,
129+
AbstractUnit<{ a: -1 }>
130+
>
131+
>();
132+
assert<
133+
Equals<
134+
DivideUnitExponents<AbstractUnit<{ a: 6 }>, 3>,
135+
AbstractUnit<{ a: 2 }>
136+
>
137+
>();
138+
assert<
139+
Equals<
140+
DivideUnitExponents<AbstractUnit<{ a: 3 }>, 3>,
141+
AbstractUnit<{ a: 1 }>
142+
>
143+
>();
144+
assert<
145+
Equals<
146+
DivideUnitExponents<AbstractUnit<{ a: -3 }>, 3>,
147+
AbstractUnit<{ a: -1 }>
148+
>
149+
>();
72150
}

src/units/modifiers/exponentials.ts

+14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
// eslint-disable-next-line import/no-extraneous-dependencies
2+
import { assert, type Equals } from "tsafe";
3+
14
import {
5+
type AbstractUnit,
26
type MultiplyUnitExponents,
37
type UnknownAbstractUnit,
48
type UnknownUnit,
@@ -26,3 +30,13 @@ export type Square<T extends UnknownAbstractUnit | UnknownUnit> =
2630
*/
2731
export type Cubic<T extends UnknownAbstractUnit | UnknownUnit> =
2832
MultiplyUnitExponents<T, 3>;
33+
34+
// Tests
35+
// eslint-disable-next-line functional/no-conditional-statements
36+
if (import.meta.vitest !== undefined) {
37+
assert<Equals<Square<Unit<{ a: 1 }>>, Unit<{ a: 2 }>>>();
38+
assert<Equals<Square<AbstractUnit<{ a: 1 }>>, AbstractUnit<{ a: 2 }>>>();
39+
40+
assert<Equals<Cubic<Unit<{ a: 1 }>>, Unit<{ a: 3 }>>>();
41+
assert<Equals<Cubic<AbstractUnit<{ a: 1 }>>, AbstractUnit<{ a: 3 }>>>();
42+
}

0 commit comments

Comments
 (0)