Wiki
Clone wikifling-units / AddingMeasurements
For these instructions, assume the new measurement is called "MyMeasurement". When following these steps, replace "MyMeasurement" in the instructions with the name of your measurement.
1. Add a new DART file for the new measurement type under the /lib/src/measurements
path, e.g. mymeasurement.dart, and at the top, add the line part of fling_units;
2. Import that file in the fling_units.dart
library file under the appropriate section
3. Set up skeletons for the following classes in the new (mymeasurement.dart
) file:
class MyMeasurementInterpreter extends MeasurementInterpreter<MyMeasurement> {} class MyMeasurementPrefix {} class MyMeasurement extends Measurement<MyMeasurement> {}
MeasurementVisitor
class in lib/src/core/visitor.dart
by adding a method for the new measurement:
/// Visit a [MyMeasurement]. void visitMyMeasurement(final MyMeasurement myMeasurement) {}
MyMeasurementPrefix
class as a mixin to the MeasurementPrefix
class in /lib/src/core/prefix.dart
:
class MeasurementPrefix with // ... MyMeasurementPrefix { // ... }
part of fling_units; class MyMeasurementInterpreter extends MeasurementInterpreter<MyMeasurement> { @override MyMeasurement call(final num value, {final Precision precision = Precision.max}) => MyMeasurement._(_from(value), precision, this); /// Constructs a [MyMeasurementInterpreter]. const MyMeasurementInterpreter._( final String name, final double multiplier, [ final MeasurementPrefix prefix = const MeasurementPrefix.unit(), ]) : super._( name, multiplier, prefix, ); /// Produces a [MyMeasurementInterpreter] that is a multiple of this. MyMeasurementInterpreter _withPrefix(final MeasurementPrefix prefix) => MyMeasurementInterpreter._(_name, _unitMultiplier, prefix); } abstract class MyMeasurementPrefix { /// The prefix multiplier applied to this measurement. MeasurementPrefix get _prefix; } class MyMeasurement extends Measurement<MyMeasurement> { /// Interprets this using the specified units. double as(final MeasurementInterpreter<MyMeasurement> interpreter) => _preciseOf(interpreter); @override void acceptVisitor(final MeasurementVisitor visitor) => visitor.visitMyMeasurement(this); /// Constructs a [MyMeasurement]. const MyMeasurement._( final double grams, final Precision precision, final MeasurementInterpreter<MyMeasurement> interpreter, ) : super(grams, precision, interpreter); @override MyMeasurement _construct( final double si, final Precision precision, final MeasurementInterpreter<MyMeasurement> interpreter, ) => MyMeasurement._(si, precision, interpreter); }
/test/core/visitor_test.dart
file with the new measurement, and add a test:
class TestVisitor implements MeasurementVisitor { // ... @override void visitMyMeasurement(final MyMeasurement myMeasurement) { _visits[MyMeasurement] = true; } // ... }
/test/measurements
and implement some tests (more guidance coming...)
Updated