Wiki

Clone wiki

fling-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> {}
4. Update the MeasurementVisitor class in lib/src/core/visitor.dart by adding a method for the new measurement:
/// Visit a [MyMeasurement].
void visitMyMeasurement(final MyMeasurement myMeasurement) {}
5. Add the new MyMeasurementPrefix class as a mixin to the MeasurementPrefix class in /lib/src/core/prefix.dart:
class MeasurementPrefix with
    // ...
    MyMeasurementPrefix {
    // ...
}
6. Implement the basic methods in the new classes:
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);
}
7. Add utility methods to your measurement, as needed 8. Update the /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;
    }
    // ...
}
9. Add some units for your new measurement 10. Add a test file for your measurement under /test/measurements and implement some tests (more guidance coming...)

Updated