Skip to content

Commit 8fc34d6

Browse files
committed
Release v. 2.2.0. Support for default interpreters for measurements, used in toString() methods.
1 parent b78d59e commit 8fc34d6

32 files changed

+2184
-476
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
Dependency-free, type-safe Dart unit conversion library. Decouple specific unit
33
types you need to work with from the rest of your code.
44

5+
## [2.2.0] - 2023-02-16
6+
### Added
7+
- toString() methods on interpreters produce the standard short form of the unit
8+
- toString() methods on measurements use the interpreter that created the measurement
9+
- Support for metric prefixes "quecto", "ronto", "ronna", "quetta"
10+
511
## [2.1.1] - 2023-01-17
612
### Fixed
713
- Prevent precision cap breach when performing additions
@@ -172,6 +178,7 @@ types you need to work with from the rest of your code.
172178
### Added
173179
- Initial package setup
174180

181+
[2.2.0]: https://bitbucket.org/mongoose13/fling-units/commits/tag/2.2.0/
175182
[2.1.1]: https://bitbucket.org/mongoose13/fling-units/commits/tag/2.1.1/
176183
[2.1.0]: https://bitbucket.org/mongoose13/fling-units/commits/tag/2.1.0/
177184
[2.0.2]: https://bitbucket.org/mongoose13/fling-units/commits/tag/2.0.2/

example/lib/example.dart

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void main() {
9999
print('${fuelConsumption.as(kilo.meters, usGallons)} kpg');
100100

101101
var coulombs = seconds(4).by(amperes(8));
102-
print('My invention generates $coulombs coulombs!');
102+
print('My invention generates $coulombs!');
103103

104104
//------------------------------------------------//
105105

@@ -110,5 +110,27 @@ void main() {
110110
print(
111111
'\nMy bucket is ${myBucketSize.compareMagnitude(yourBucketSize)} times bigger than yours!');
112112

113+
//------------------------------------------------//
114+
115+
// The unit interpreters themselves have a toString() method that will produce
116+
// the "standard" short form of the unit. Measurements will make use of that
117+
// in their own toString() methods using whichever unit was used to
118+
// instantiate them. You can also change the default unit later.
119+
final goldAmount = 1234.milli.grams.withPrecision(Precision(4));
120+
print('I have $goldAmount of gold!');
121+
print('I have ${goldAmount.as(kilo.grams)} ${kilo.grams} of gold!');
122+
print('I have ${goldAmount.withDefaultUnit(ounces)} of gold!');
123+
124+
// This is also true for derived units. The library will produce a default
125+
// unit name, but you can also supply your own.
126+
final carSpeed = DerivedMeasurement<Distance, Time>.divide(
127+
100.miles.withPrecision(Precision(3)),
128+
1.hours.withPrecision(Precision(3)),
129+
);
130+
print('\nMy car is going $carSpeed!');
131+
final carVelocity = carSpeed.withDefaultUnit(DerivedMeasurementInterpreter(
132+
feet, minutes, true, MeasurementPrefix.unit(), 'gizmos per doodad'));
133+
print('My car is going $carVelocity!');
134+
113135
// Have fun!
114136
}

lib/src/core/interpreter.dart

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,36 @@ part of fling_units;
1414
/// [Measurement] instances for interpretation (typically via an `as()` method,
1515
/// such as [Area.as]).
1616
abstract class MeasurementInterpreter<T> {
17+
/// The prefix to apply to the measurement.
18+
final MeasurementPrefix _prefix;
19+
1720
/// Interprets the base value according to the configured unit.
18-
double _of(final num value) => value.toDouble() * _unitMultiplier;
21+
double _of(final num value) =>
22+
value.toDouble() * _unitMultiplier / _prefix._multiplier;
1923

2024
/// Interprets the provided value as if it were of the configured unit,
2125
/// returning the base value.
22-
double _from(final num value) => value.toDouble() / _unitMultiplier;
26+
double _from(final num value) =>
27+
value.toDouble() / _unitMultiplier * _prefix._multiplier;
28+
29+
/// The standardized short form name of the unit (e.g. "m" for meters).
30+
final String _name;
2331

2432
/// Creates a measurement based on the value and the configured multiplier.
2533
T call(final double value, {final Precision precision = Precision.max});
2634

2735
/// Constructs a [MeasurementInterpreter].
28-
const MeasurementInterpreter._(this._unitMultiplier);
36+
const MeasurementInterpreter._(
37+
this._name,
38+
this._unitMultiplier,
39+
this._prefix,
40+
);
2941

3042
/// The multiplier for the configured unit.
3143
final double _unitMultiplier;
44+
45+
@override
46+
String toString() => '$_prefix$_name';
3247
}
3348

3449
/// A [MeasurementInterpreter] that rounds its results to `int`s.
@@ -39,12 +54,17 @@ abstract class RoundingMeasurementInterpreter<T>
3954
extends MeasurementInterpreter<T> {
4055
@override
4156
double _of(final num value) =>
42-
(value.toDouble() * _unitMultiplier).roundToDouble();
57+
(value.toDouble() * _unitMultiplier / _prefix._multiplier)
58+
.roundToDouble();
4359

4460
@override
45-
double _from(final num value) => value.toDouble() / _unitMultiplier;
61+
double _from(final num value) =>
62+
value.toDouble() / _unitMultiplier * _prefix._multiplier;
4663

4764
/// Constructs a [RoundingMeasurementInterpreter].
48-
const RoundingMeasurementInterpreter._(final double unitMultiplier)
49-
: super._(unitMultiplier);
65+
const RoundingMeasurementInterpreter._(
66+
final String name,
67+
final double unitMultiplier, [
68+
final MeasurementPrefix prefix = const MeasurementPrefix.unit(),
69+
]) : super._(name, unitMultiplier, prefix);
5070
}

lib/src/core/precision.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class Precision {
104104
}
105105

106106
/// Interprets the specified number according to this Precision.
107-
double withPrecision(final double value) =>
107+
double withPrecision(final num value) =>
108108
double.parse(value.toStringAsPrecision(precision));
109109

110110
@override

lib/src/core/prefix.dart

Lines changed: 146 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,69 +12,192 @@ class MeasurementPrefix
1212
TimePrefix,
1313
VolumePrefix {
1414
/// Constructs an arbitrary [MeasurementPrefix].
15-
const MeasurementPrefix(this._multiplier);
15+
const MeasurementPrefix(
16+
this._multiplier, {
17+
final String name = '',
18+
}) : _name = name;
19+
20+
/// The default prefix (equivalent to no prefix).
21+
const MeasurementPrefix.unit()
22+
: _multiplier = 1.0,
23+
_name = '';
1624

17-
/// The configured multiplier.
18-
@override
1925
final double _multiplier;
26+
27+
/// The standardized short form name of the prefix (e.g. "m" for milli).
28+
final String _name;
29+
30+
@override
31+
MeasurementPrefix get _prefix => this;
32+
33+
@override
34+
String toString() => _name;
35+
36+
/// SI prefix "quecto".
37+
static final MeasurementPrefix _quecto =
38+
const MeasurementPrefix(1e-30, name: 'q');
39+
40+
/// SI prefix "ronto".
41+
static final MeasurementPrefix _ronto =
42+
const MeasurementPrefix(1e-27, name: 'r');
43+
44+
/// SI prefix "yocto".
45+
static final MeasurementPrefix _yocto =
46+
const MeasurementPrefix(1e-24, name: 'y');
47+
48+
/// SI prefix "zepto".
49+
static final MeasurementPrefix _zepto =
50+
const MeasurementPrefix(1e-21, name: 'z');
51+
52+
/// SI prefix "atto".
53+
static final MeasurementPrefix _atto =
54+
const MeasurementPrefix(1e-18, name: 'a');
55+
56+
/// SI prefix "femto".
57+
static final MeasurementPrefix _femto =
58+
const MeasurementPrefix(1e-15, name: 'f');
59+
60+
/// SI prefix "pico".
61+
static final MeasurementPrefix _pico =
62+
const MeasurementPrefix(1e-12, name: 'p');
63+
64+
/// SI prefix "nano".
65+
static final MeasurementPrefix _nano =
66+
const MeasurementPrefix(1e-9, name: 'n');
67+
68+
/// SI prefix "micro".
69+
static final MeasurementPrefix _micro =
70+
const MeasurementPrefix(1e-6, name: 'μ');
71+
72+
/// SI prefix "milli".
73+
static final MeasurementPrefix _milli =
74+
const MeasurementPrefix(1e-3, name: 'm');
75+
76+
/// SI prefix "centi".
77+
static final MeasurementPrefix _centi =
78+
const MeasurementPrefix(1e-2, name: 'c');
79+
80+
/// SI prefix "deci".
81+
static final MeasurementPrefix _deci =
82+
const MeasurementPrefix(1e-1, name: 'd');
83+
84+
/// SI prefix "deka".
85+
static final MeasurementPrefix _deka =
86+
const MeasurementPrefix(1e1, name: 'da');
87+
88+
/// SI prefix "hecto".
89+
static final MeasurementPrefix _hecto =
90+
const MeasurementPrefix(1e2, name: 'h');
91+
92+
/// SI prefix "kilo".
93+
static final MeasurementPrefix _kilo =
94+
const MeasurementPrefix(1e3, name: 'k');
95+
96+
/// SI prefix "mega".
97+
static final MeasurementPrefix _mega =
98+
const MeasurementPrefix(1e6, name: 'M');
99+
100+
/// SI prefix "giga".
101+
static final MeasurementPrefix _giga =
102+
const MeasurementPrefix(1e9, name: 'G');
103+
104+
/// SI prefix "tera".
105+
static final MeasurementPrefix _tera =
106+
const MeasurementPrefix(1e12, name: 'T');
107+
108+
/// SI prefix "peta".
109+
static final MeasurementPrefix _peta =
110+
const MeasurementPrefix(1e15, name: 'P');
111+
112+
/// SI prefix "exa".
113+
static final MeasurementPrefix _exa =
114+
const MeasurementPrefix(1e18, name: 'E');
115+
116+
/// SI prefix "zetta".
117+
static final MeasurementPrefix _zetta =
118+
const MeasurementPrefix(1e21, name: 'Z');
119+
120+
/// SI prefix "yotta".
121+
static final MeasurementPrefix _yotta =
122+
const MeasurementPrefix(1e24, name: 'Y');
123+
124+
/// SI prefix "ronna".
125+
static final MeasurementPrefix _ronna =
126+
const MeasurementPrefix(1e27, name: 'R');
127+
128+
/// SI prefix "quetta".
129+
static final MeasurementPrefix _quetta =
130+
const MeasurementPrefix(1e30, name: 'Q');
20131
}
21132

133+
/// SI prefix "quecto".
134+
final MeasurementPrefix quecto = MeasurementPrefix._quecto;
135+
136+
/// SI prefix "ronto".
137+
final MeasurementPrefix ronto = MeasurementPrefix._ronto;
138+
22139
/// SI prefix "yocto".
23-
final MeasurementPrefix yocto = MeasurementPrefix(1e-24);
140+
final MeasurementPrefix yocto = MeasurementPrefix._yocto;
24141

25142
/// SI prefix "zepto".
26-
final MeasurementPrefix zepto = MeasurementPrefix(1e-21);
143+
final MeasurementPrefix zepto = MeasurementPrefix._zepto;
27144

28145
/// SI prefix "atto".
29-
final MeasurementPrefix atto = MeasurementPrefix(1e-18);
146+
final MeasurementPrefix atto = MeasurementPrefix._atto;
30147

31148
/// SI prefix "femto".
32-
final MeasurementPrefix femto = MeasurementPrefix(1e-15);
149+
final MeasurementPrefix femto = MeasurementPrefix._femto;
33150

34151
/// SI prefix "pico".
35-
final MeasurementPrefix pico = MeasurementPrefix(1e-12);
152+
final MeasurementPrefix pico = MeasurementPrefix._pico;
36153

37154
/// SI prefix "nano".
38-
final MeasurementPrefix nano = MeasurementPrefix(1e-9);
155+
final MeasurementPrefix nano = MeasurementPrefix._nano;
39156

40157
/// SI prefix "micro".
41-
final MeasurementPrefix micro = MeasurementPrefix(1e-6);
158+
final MeasurementPrefix micro = MeasurementPrefix._micro;
42159

43160
/// SI prefix "milli".
44-
final MeasurementPrefix milli = MeasurementPrefix(1e-3);
161+
final MeasurementPrefix milli = MeasurementPrefix._milli;
45162

46163
/// SI prefix "centi".
47-
final MeasurementPrefix centi = MeasurementPrefix(1e-2);
164+
final MeasurementPrefix centi = MeasurementPrefix._centi;
48165

49166
/// SI prefix "deci".
50-
final MeasurementPrefix deci = MeasurementPrefix(1e-1);
167+
final MeasurementPrefix deci = MeasurementPrefix._deci;
51168

52169
/// SI prefix "deka".
53-
final MeasurementPrefix deka = MeasurementPrefix(1e1);
170+
final MeasurementPrefix deka = MeasurementPrefix._deka;
54171

55172
/// SI prefix "hecto".
56-
final MeasurementPrefix hecto = MeasurementPrefix(1e2);
173+
final MeasurementPrefix hecto = MeasurementPrefix._hecto;
57174

58175
/// SI prefix "kilo".
59-
final MeasurementPrefix kilo = MeasurementPrefix(1e3);
176+
final MeasurementPrefix kilo = MeasurementPrefix._kilo;
60177

61178
/// SI prefix "mega".
62-
final MeasurementPrefix mega = MeasurementPrefix(1e6);
179+
final MeasurementPrefix mega = MeasurementPrefix._mega;
63180

64181
/// SI prefix "giga".
65-
final MeasurementPrefix giga = MeasurementPrefix(1e9);
182+
final MeasurementPrefix giga = MeasurementPrefix._giga;
66183

67184
/// SI prefix "tera".
68-
final MeasurementPrefix tera = MeasurementPrefix(1e12);
185+
final MeasurementPrefix tera = MeasurementPrefix._tera;
69186

70187
/// SI prefix "peta".
71-
final MeasurementPrefix peta = MeasurementPrefix(1e15);
188+
final MeasurementPrefix peta = MeasurementPrefix._peta;
72189

73190
/// SI prefix "exa".
74-
final MeasurementPrefix exa = MeasurementPrefix(1e18);
191+
final MeasurementPrefix exa = MeasurementPrefix._exa;
75192

76193
/// SI prefix "zetta".
77-
final MeasurementPrefix zetta = MeasurementPrefix(1e21);
194+
final MeasurementPrefix zetta = MeasurementPrefix._zetta;
78195

79196
/// SI prefix "yotta".
80-
final MeasurementPrefix yotta = MeasurementPrefix(1e24);
197+
final MeasurementPrefix yotta = MeasurementPrefix._yotta;
198+
199+
/// SI prefix "ronna".
200+
final MeasurementPrefix ronna = MeasurementPrefix._ronna;
201+
202+
/// SI prefix "quetta".
203+
final MeasurementPrefix quetta = MeasurementPrefix._quetta;

0 commit comments

Comments
 (0)