fling_units library
A type-safe measurement framework.
This library is intended for any application that requires manipulating measurements of any sort, e.g. distance or time. The measurements themselves are abstracted into different types, allowing them to be interpreted in any way required by the consumer. This allows for type safety across the measurement types as well as simplification of business logic in most cases.
The library uses the following vocabulary:
- measurement: A value associated with a unit and a precision, e.g. "32.5 meters".
- unit: A way to interpret a measurement, e.g. "kilometers" and "miles" are valid units for a Distance measurement.
- interpret: A measurement is an abstract concept until it is interpreted with a specific unit in mind, at which point it can be represented as a number and that unit (e.g. "3.2 miles").
- precision: The quality of a measurement, from the standpoint of significant digits.
Consider a ride-sharing app that aggregates ride information across several platforms. It may want to compare the distances for each potential driver from the client, but each source might provide that information in a different way. By reading the information from each source into an instance of Distance, the rest of our app can treat all sources the same way.
(The following example uses completely made-up APIs for Uber and Lyft.)
Distance uberDistance = Distance.miles(Uber.getDriverDistance(clientLocation));
Distance lyftDistance = Distance.kilometers(lyft.getNearestDriver(clientLocation).distanceInKm());
Instances of measurements such as Distance can be compared directly, without needing to convert beforehand. Further, they can be interpreted in any valid unit for their dimension at any time, without needing to know how they were created.
if (driverDistance < Distance.miles(0.5)) {
print('Your driver is only ${driverDistance.feet} feet away!');
} else {
print('Your driver is only ${driverDistance.miles} miles away!');
}
While the library strives to support all basic measurement units, not all
"derived" units will be available. You can define arbitrary derived units
yourself, e.g. "fuel economy" (distance divided by volume, e.g. miles per
gallon), using the DerivedMeasurement
type. Similarly, if a conversion is
missing from the library (or you just want to make up your own unit), you
can easily define it as a function that accepts a measurement and produces a
double
.
var fuelEconomy = DerivedMeasurement<Distance, Volume>(
Distance.miles(150),
Volume.gallons(5)
);
double kilometersPerLiter = fuelEconomy.as(Distance.asKilometers, Volume.asLiters);
double googaligadsPerLiter = fuelEconomy.as((distance) => distance.miles * 0.123, Volume.asLiters);
Finally, all measurements may be assigned a Precision to quantify the precision of the measurement instrument used. This prevents the measurements giving answers with more precision than they realistically could, and also mitigates some rounding errors in the implementation of the language itself.
Distance.miles(3.0, precision: 2).kilometers; // 4.8, not 4.82803...
Classes
- Angle
- AngleMeasurement
- AngleUnit
- Charge
- ChargeMeasurement
- ChargeUnit
-
DerivedUnit1<
P extends UnitPosition< D> , D extends Dimension> - A derived Unit that has a single component.
-
DerivedUnit2<
P1 extends UnitPosition< D1> , P2 extends UnitPosition<D2> , D1 extends Dimension, D2 extends Dimension> - A derived Unit that has two components.
-
DerivedUnit3<
P1 extends UnitPosition< D1> , P2 extends UnitPosition<D2> , P3 extends UnitPosition<D3> , D1 extends Dimension, D2 extends Dimension, D3 extends Dimension> - A derived Unit that has three components.
- Dimension
-
Dimension1<
P extends UnitPosition< Dimension> > -
Dimension2<
P1 extends UnitPosition< Dimension> , P2 extends UnitPosition<Dimension> > -
Dimension3<
P1 extends UnitPosition< Dimension> , P2 extends UnitPosition<Dimension> , P3 extends UnitPosition<Dimension> > - Distance
- DistanceMeasurement
- DistanceUnit
- Luminosity
- LuminosityMeasurement
- LuminosityUnit
- Mass
- MassMeasurement
- MassUnit
-
Measurement<
D extends Dimension> - Base class for any type of measurement.
-
MeasurementDot<
N extends Measurement< D> , D extends Dimension> -
MeasurementPer<
N extends Measurement< D> , D extends Dimension> - MeasurementPrefix
- NumExtension
- Wrapper class for extensions on num types.
- Precision
- Represents the amount of precision for a measurement.
-
PrefixedMeasurementDot<
N extends Measurement< D> , D extends Dimension> -
PrefixedMeasurementPer<
N extends Measurement< D> , D extends Dimension> -
PrefixedUnitDot<
N extends Unit< D> , D extends Dimension> -
PrefixedUnitPer<
N extends Unit< D> , D extends Dimension> - Pressure
- PressureMeasurement
- PressureUnit
- Quantity
- QuantityMeasurement
- QuantityUnit
-
RoundingUnit<
D extends Dimension> -
A Unit that rounds its results to
int
s. - Temperature
- Represents a "thermometer" temperature.
- TemperatureChange
- TemperatureChangeMeasurement
- TemperatureChangeUnit
- Time
- TimeMeasurement
- TimeUnit
-
Unit<
D extends Dimension> - Interprets a measurement as a specific unit.
-
UnitDenominator<
D extends Dimension> - Represents a unit in the denominator of a derived unit equation.
-
UnitDot<
N extends Unit< D> , D extends Dimension> -
UnitNumerator<
D extends Dimension> - Represents a unit in the numerator of a derived unit equation.
-
UnitPer<
N extends Unit< D> , D extends Dimension> -
UnitPosition<
D extends Dimension> - Represents the position of a unit in a derived unit equation.
Enums
- AngleConfig
- ChargeConfig
- DistanceConfig
- LuminosityConfig
- MassConfig
- Prefixes
- PressureConfig
- QuantityConfig
- TemperatureChangeConfig
- Represents a change in temperature.
- TimeConfig
Mixins
Extensions
- AngleExtension on AngleMeasurement
- FrequencyExtensionNum on num
- FrequencyMeasurementPrefix on MeasurementPrefix
- FrequencyNumExtension on NumExtension
- NumExtensionAngle on num
- NumExtensionCharge on num
- NumExtensionDistance on num
- NumExtensionLuminosity on num
- NumExtensionMass on num
- NumExtensionPrefixPrefixes on num
- NumExtensionPressure on num
- NumExtensionQuantity on num
- NumExtensionTemperature on num
- NumExtensionTemperatureChange on num
- NumExtensionTime on num
- TimeExtension on TimeMeasurement
- Unit1Extension on num
- Extension on num to allow single-component derived measurements to be instantiated.
- Unit2Extension on num
- Extension on num to allow two-component derived measurements to be instantiated.
- Unit3Extension on num
- Extension on num to allow three-component derived measurements to be instantiated.
- VolumeExtensionNum on num
-
VolumeMeasurementDot
on PrefixedMeasurementDot<
N, D> -
VolumeMeasurementPer
on PrefixedMeasurementPer<
N, D> - VolumeMeasurementPrefix on MeasurementPrefix
- VolumeNumExtension on NumExtension
-
VolumeUnitDot
on PrefixedUnitDot<
N, D> -
VolumeUnitPer
on PrefixedUnitPer<
N, D>
Constants
- amperes → const ChargeUnit
- arcMinutes → const AngleUnit
- arcSeconds → const AngleUnit
- atomicMassUnits → const MassUnit
- atto → const MeasurementPrefix
- bars → const PressureUnit
- baryes → const PressureUnit
- candela → const LuminosityUnit
- candlepower → const LuminosityUnit
- celcius → const TemperatureChangeUnit
- celsius → const TemperatureChangeUnit
- centi → const MeasurementPrefix
- daltons → const MassUnit
- days → const TimeUnit
- deci → const MeasurementPrefix
- degrees → const AngleUnit
- deka → const MeasurementPrefix
- electronRestMass → const MassUnit
- exa → const MeasurementPrefix
- fahrenheit → const TemperatureChangeUnit
- feet → const DistanceUnit
- femto → const MeasurementPrefix
- giga → const MeasurementPrefix
- gradians → const AngleUnit
- grams → const MassUnit
- hecto → const MeasurementPrefix
- hefnerkerze → const LuminosityUnit
- hours → const TimeUnit
- inches → const DistanceUnit
- inHg → const PressureUnit
- kelvin → const TemperatureChangeUnit
- kilo → const MeasurementPrefix
- longTons → const MassUnit
- mega → const MeasurementPrefix
- meters → const DistanceUnit
- micro → const MeasurementPrefix
- miles → const DistanceUnit
- milli → const MeasurementPrefix
- minutes → const TimeUnit
- mmHg → const PressureUnit
- moles → const QuantityUnit
- nano → const MeasurementPrefix
- nauticalMiles → const DistanceUnit
- ounces → const MassUnit
- pascals → const PressureUnit
- peta → const MeasurementPrefix
- pico → const MeasurementPrefix
- pounds → const MassUnit
- psi → const PressureUnit
- quecto → const MeasurementPrefix
- quetta → const MeasurementPrefix
- radians → const AngleUnit
- ronna → const MeasurementPrefix
- ronto → const MeasurementPrefix
- seconds → const TimeUnit
- shortTons → const MassUnit
- standardAtmospheres → const PressureUnit
- technicalAtmospheres → const PressureUnit
- tera → const MeasurementPrefix
- tonnes → const MassUnit
- torr → const PressureUnit
- turns → const AngleUnit
- units → const QuantityUnit
- yards → const DistanceUnit
- yocto → const MeasurementPrefix
- yotta → const MeasurementPrefix
- zepto → const MeasurementPrefix
- zetta → const MeasurementPrefix
Properties
- cups → VolumeUnit
-
final
- fluidOunces → VolumeUnit
-
final
- gallons → VolumeUnit
-
final
- hertz → FrequencyUnit
-
final
- liters → VolumeUnit
-
final
- pints → VolumeUnit
-
final
- quarts → VolumeUnit
-
final
- tablespoons → VolumeUnit
-
final
- teaspoons → VolumeUnit
-
final
- usCups → VolumeUnit
-
final
- usFluidOunces → VolumeUnit
-
final
- usGallons → VolumeUnit
-
final
- usLegalCups → VolumeUnit
-
final
- usPints → VolumeUnit
-
final
- usQuarts → VolumeUnit
-
final
- usTablespoons → VolumeUnit
-
final
- usTeaspoons → VolumeUnit
-
final
Functions
-
cubic<
D extends Dimension> (Unit< D> unit, {String? name, MeasurementPrefix prefix = const MeasurementPrefix.unit()}) → DerivedUnit3<UnitNumerator< D> , UnitNumerator<D> , UnitNumerator<D> , D, D, D> - Creates a derived Unit that is the cube of the provided Unit.
-
infinite<
D extends Dimension> (Unit< D> defaultUnit) → Measurement<D> -
inverse<
D extends Dimension> (Unit< D> unit, {String? name}) → DerivedUnit1<UnitDenominator< D> , D> - Creates a derived Unit that is the inverse of the specified Unit.
-
nan<
D extends Dimension> (Unit< D> defaultUnit) → Measurement<D> -
negativeInfinite<
D extends Dimension> (Unit< D> defaultUnit) → Measurement<D> -
product2<
D1 extends Dimension, D2 extends Dimension> (Unit< D1> a, Unit<D2> b, {String? name, MeasurementPrefix? prefix}) → DerivedUnit2<UnitNumerator< D1> , UnitNumerator<D2> , D1, D2> - Creates a derived Unit that is the product of the provided Units.
-
product3<
D1 extends Dimension, D2 extends Dimension, D3 extends Dimension> (Unit< D1> a, Unit<D2> b, Unit<D3> c, {String? name, MeasurementPrefix prefix = const MeasurementPrefix.unit()}) → DerivedUnit3<UnitNumerator< D1> , UnitNumerator<D2> , UnitNumerator<D3> , D1, D2, D3> - Creates a derived Unit that is the product of the provided Units.
-
ratio<
D1 extends Dimension, D2 extends Dimension> (Unit< D1> a, Unit<D2> b, {String? name, MeasurementPrefix? prefix}) → DerivedUnit2<UnitNumerator< D1> , UnitDenominator<D2> , D1, D2> - Creates a derived Unit that is a ratio between the two provided Units.
-
square<
D extends Dimension> (Unit< D> unit, {String? name, MeasurementPrefix? prefix}) → DerivedUnit2<UnitNumerator< D> , UnitNumerator<D> , D, D> - Creates a derived Unit that is the square of the provided Unit.
-
sum<
D extends Dimension> (Iterable< Measurement< parts, {int precision = Precision.maximumPrecision, Unit<D> >D> ? defaultUnit}) → Measurement<D> - Creates a measurement that is the sum of several other measurements of the same dimension.
-
zero<
D extends Dimension> (Unit< D> defaultUnit) → Measurement<D>
Typedefs
-
FrequencyMeasurement
= Measurement<
Dimension1< _FrequencyComponent> > -
FrequencyUnit
= DerivedUnit1<
_FrequencyComponent, Time> -
VolumeDimension
= Dimension3<
UnitNumerator< Distance> , UnitNumerator<Distance> , UnitNumerator<Distance> > -
VolumeMeasurement
= Measurement<
VolumeDimension> -
VolumeUnit
= DerivedUnit3<
UnitNumerator< Distance> , UnitNumerator<Distance> , UnitNumerator<Distance> , Distance, Distance, Distance>